您好,登錄后才能下訂單哦!
如何在scrapy請(qǐng)求異常之后再設(shè)置代理IP,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
我們都知道 scrapy 可以設(shè)置代理 IP,但是不知道大家有沒(méi)有遇到這樣一個(gè)場(chǎng)景:
常規(guī)的代理 IP 設(shè)置,會(huì)對(duì)每個(gè)請(qǐng)求都生效,也就是說(shuō)每個(gè)請(qǐng)求都會(huì)去使用代理
但是有些請(qǐng)求根本不需要代理,我希望當(dāng)我的請(qǐng)求出現(xiàn)錯(cuò)誤或超時(shí)的時(shí)候再去設(shè)置代理 IP
這樣既節(jié)省了資源,又縮短了請(qǐng)求的時(shí)間,畢竟有些代理質(zhì)量真的一言難盡
那么怎么才能讓它請(qǐng)求超時(shí)的時(shí)候,再使用代理 IP 進(jìn)行重新請(qǐng)求呢?
很容易就想到下載中間件,DowmloaderMiddleware
一個(gè)介于 request, response 中間的鉤子,用于修改 request 和處理 response
首先我們需要捕獲超時(shí)等異常的請(qǐng)求,在下載中間件中添加如下代碼:
from twisted.internet.error import TCPTimedOutError, TimeoutError
def process_exception(self, request, exception, spider):
if isinstance(exception, TimeoutError):
self.process_request_back(request, spider) # 連接超時(shí)才啟用代理ip機(jī)制
return request
elif isinstance(exception, TCPTimedOutError):
self.process_request_back(request, spider)
return request
以上代碼的作用就是捕獲異常請(qǐng)求,同時(shí)調(diào)用設(shè)置代理 IP 的函數(shù),并返回該請(qǐng)求
下面的設(shè)置 IP 的代碼
def process_request_back(self, request, spider):
request.meta["proxy"] = xun.proxy
request.headers["Proxy-Authorization"] = xun.headers
注意不能使用 process_request()
方法, 如果代理添加在該方法下,就是常規(guī)的代理 IP 方法
同時(shí)對(duì)于 scrapy 出現(xiàn) TimeoutError,TCPTimedOutError 等異常的時(shí)候,還可以通過(guò)以下幾種方案來(lái)解決:
主要通過(guò)設(shè)置文件來(lái)更改
CONCURRENT_REQUESTS = 5
DOWNLOAD_TIMEOUT = 300
RETRY_TIMES = 5
關(guān)于如何在scrapy請(qǐng)求異常之后再設(shè)置代理IP問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。