gpt4 book ai didi

python - Scrapy - 在请求中更改用户代理的正确方法

转载 作者:行者123 更新时间:2023-11-28 18:33:45 25 4
gpt4 key购买 nike

我通过重写 RetryMiddleware 在 Scrapy 中创建了一个自定义中间件,它在重试之前更改了 Proxy 和 User-Agent。看起来像这样

class CustomRetryMiddleware(RetryMiddleware):
def _retry(self, request, reason, spider):
retries = request.meta.get('retry_times', 0) + 1

if retries <= self.max_retry_times:
Proxy_UA_Middleware.switch_proxy()
Proxy_UA_Middleware.switch_ua()
logger.debug("Retrying %(request)s (failed %(retries)d times): %(reason)s",
{'request': request, 'retries': retries, 'reason': reason},
extra={'spider': spider})
retryreq = request.copy()
retryreq.meta['retry_times'] = retries
retryreq.dont_filter = True
retryreq.priority = request.priority + self.priority_adjust
return retryreq
else:
logger.debug("Gave up retrying %(request)s (failed %(retries)d times): %(reason)s",
{'request': request, 'retries': retries, 'reason': reason},
extra={'spider': spider})

Proxy_UA_Middlware 类很长。基本上它包含更改代理和用户代理的方法。我在我的 settings.py 文件中正确配置了这两个中间件。代理部分工作正常,但用户代理没有改变。我用来更改用户代理的代码如下所示

request.headers.setdefault('User-Agent', self.user_agent)

其中 self.user_agent 是从用户代理数组中获取的随机值。这是行不通的。但是,如果我这样做

request.headers['User-Agent'] = self.user_agent

然后它就可以正常工作,并且每次重试时用户代理都会成功更改。但是我没有看到有人用这种方法来改变User Agent。我的问题是,以这种方式更改用户代理是否可以,如果不行,我做错了什么?

最佳答案

如果你总是想控制在那个中间件上使用哪个用户代理,那没关系,setdefault 做的是检查是否没有User-Agent 之前分配,这是可能的,因为其他中间件可能正在这样做,甚至从蜘蛛分配它。

此外,我认为您还应该禁用默认的 UserAgentMiddleware 或什至为您的中间件设置更高的优先级,检查 UserAgentMiddleware priority is 400 ,因此将您的设置为之前(400 之前的某个数字)。

关于python - Scrapy - 在请求中更改用户代理的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34400307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com