2015-12-21 47 views
2

我已經在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 

然後它工作得很好,並且用戶代理更改爲每次重試成功。但我還沒有看到任何人使用這種方法來更改用戶代理。我的問題是,如果以這種方式更改用戶代理是好的,如果不是,我做錯了什麼?

回答

1

如果您始終想要控制哪個用戶代理程序在該中間件上使用,那麼確定,setdefault會做的是檢查之前是否沒有指定User-Agent,這可能是因爲其他中間件可能會這樣做,甚至從蜘蛛中分配它。

另外我認爲你也應該禁用默認的UserAgentMiddleware甚至給你的中間件設置一個更高的優先級,檢查UserAgentMiddlewarepriority is 400,所以把你設置爲之前(400之前的某個數字)。

相關問題