我已經在Scrapy中創建了一個自定義中間件,方法是重試在重試之前更改代理和用戶代理的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
然後它工作得很好,並且用戶代理更改爲每次重試成功。但我還沒有看到任何人使用這種方法來更改用戶代理。我的問題是,如果以這種方式更改用戶代理是好的,如果不是,我做錯了什麼?