【发布时间】:2015-12-21 16:32:40
【问题描述】:
我通过覆盖 RetryMiddleware 在 Scrapy 中创建了一个自定义中间件,该中间件在重试之前会同时更改代理和用户代理。看起来是这样的
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
然后它就可以正常工作,并且每次重试都会成功更改用户代理。但是我还没有看到有人使用这种方法来更改用户代理。我的问题是,以这种方式更改用户代理是否可以,如果不是,我做错了什么?
【问题讨论】:
标签: python scrapy screen-scraping user-agent