爬蟲|如何在scrapy請求異常之后再設(shè)置代理IP

我們都知道 scrapy 可以設(shè)置代理 IP,但是不知道大家有沒有遇到這樣一個場景:
常規(guī)的代理 IP 設(shè)置,會對每個請求都生效,也就是說每個請求都會去使用代理
但是有些請求根本不需要代理,我希望當我的請求出現(xiàn)錯誤或超時的時候再去設(shè)置代理 IP
這樣既節(jié)省了資源,又縮短了請求的時間,畢竟有些代理質(zhì)量真的一言難盡
那么怎么才能讓它請求超時的時候,再使用代理 IP 進行重新請求呢?
很容易就想到下載中間件,DowmloaderMiddleware
一個介于 request, response 中間的鉤子,用于修改 request 和處理 response
首先我們需要捕獲超時等異常的請求,在下載中間件中添加如下代碼:
from?twisted.internet.error?import?TCPTimedOutError,?TimeoutError
def?process_exception(self,?request,?exception,?spider):
????????if?isinstance(exception,?TimeoutError):
????????????self.process_request_back(request,?spider)??#?連接超時才啟用代理ip機制
????????????return?request
????????elif?isinstance(exception,?TCPTimedOutError):
????????????self.process_request_back(request,?spider)
????????????return?request
以上代碼的作用就是捕獲異常請求,同時調(diào)用設(shè)置代理 IP 的函數(shù),并返回該請求
下面的設(shè)置 IP 的代碼
def?process_request_back(self,?request,?spider):
????????request.meta["proxy"]?=?xun.proxy
????????request.headers["Proxy-Authorization"]?=?xun.headers
注意不能使用 process_request() 方法, 如果代理添加在該方法下,就是常規(guī)的代理 IP 方法
同時對于 scrapy 出現(xiàn) TimeoutError,TCPTimedOutError 等異常的時候,還可以通過以下幾種方案來解決:
主要通過設(shè)置文件來更改
1、降低同時請求的數(shù)量
CONCURRENT_REQUESTS?=?5
2、 增加超時時間
DOWNLOAD_TIMEOUT?=?300
3、 增加異常重試次數(shù)
RETRY_TIMES?=?5
第四種就是開頭所講的,在請求超時后再添加代理 IP
你學廢了嗎?
歡迎大家一起討論
需要您的一個在看?
評論
圖片
表情
