日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

scrapy的Middleware

發(fā)布時(shí)間:2023/12/15 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 scrapy的Middleware 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

對(duì)于下載中間件

settings里的數(shù)字大小:

  • process_request的順序 數(shù)字越小,越先調(diào)用
  • process_response 的順序, 數(shù)字越大,越先調(diào)用
返回值: process_request: 【None :繼續(xù)調(diào)用下一個(gè)中間件的process_request方法;】          【Response object:預(yù)示著下載已經(jīng)完成,就以返回的response作為下載結(jié)果,進(jìn)而開(kāi)始調(diào)用process_response方法】          【Request object: 將這個(gè)請(qǐng)求request添加到任務(wù)隊(duì)列中,當(dāng)前的request的process_request流程就結(jié)束了,沒(méi)有其他操作了】          【拋出IgnoreRequest異常:將調(diào)用process_exception(),process_exception()如果沒(méi)有處理該異常,則會(huì)繼續(xù)調(diào)用errback來(lái)處理,如果errback           中也沒(méi)有對(duì)它處理的,就會(huì)忽視該異?!?/span> process_response : 【Response :這個(gè)response可以是傳過(guò)來(lái)的response,也可以是一個(gè)新的response,將繼續(xù)調(diào)用下一個(gè)process_response】           【Request :這個(gè)request將被添加到請(qǐng)求隊(duì)列,然后該response的process_response流程就結(jié)束了】            【拋出IgnoreRequest異常:將調(diào)用request.errback方法處理,如果該方法中沒(méi)有對(duì)此異常進(jìn)行處理,此異常 將被忽視】
process_exception : 【None : 繼續(xù)調(diào)用其他process_exception處理這個(gè)異常】           【Response object:開(kāi)始調(diào)用process_response方法】           【Request object: 此request將被添加到請(qǐng)求隊(duì)列,process_exception流程就結(jié)束了】
process_exception是在下載處理器(download handler)或下載中間件的process_request拋出異常時(shí)被調(diào)用的。 from_crawler : 這個(gè)方法是scrapy的核心屬性的一個(gè)入口,用于創(chuàng)建中間件實(shí)例 。如果需要用到signals,settings,spiders等,可以通過(guò)crawler.settings這種操作來(lái) 獲取,cls(crawler.stats)是調(diào)用這個(gè)方法所在的class來(lái)實(shí)例化一個(gè)對(duì)象,crawler.stats相當(dāng)于傳給__init__(self,stats)的參數(shù)stats @classmethod from_crawler(cls,crawler):   instance = cls(crawler.stats)   return instance? 自定義retry中間件 from scrapy.downloadermiddlewares.retry import RetryMiddleware import time? class CustomRetryMiddleware(RetryMiddleware): ? ? ? def __init__(self,settings): ? ? ? ? self.request_error = 0 ? ? ? ? super(CustomRetryMiddleware, self).__init__(settings) ? ? def process_response(self, request, response, spider): ? ? ? ? if request.meta.get('dont_retry', False): ? ? ? ? ? ? return response ? ? ? ? if response.status in self.retry_http_codes: ? ? ? ? ? ? if response.status==429: #在這里可以添加一些邏輯,在重試請(qǐng)求之前, ? ? ? ? ? ? ? ? spider.logger.info("[response]retry Middleware,Got 429 error,would stop 6 minutes,%s",request.url) ? ? ? ? ? ? ? ? time.sleep(60*6) ? ? ? ? ? ? spider.logger.info("[response]Retry Middleware ,response.status :%d,will start retry request,%s",response.status,request.url) ? ? ? ? ? ? reason = response_status_message(response.status) ? ? ? ? ? ? return self._retry(request, reason, spider) or response ? ? ? ? return response ? ? ? ? def process_exception(self, request, exception, spider): ? ? ? ? if isinstance(exception, self.EXCEPTIONS_TO_RETRY) \ ? ? ? ? ? ? ? ? and not request.meta.get('dont_retry', False): ? ? ? ? ? ? spider.logger.info("[exception]Retry Middleware ,exception :%s,will start retry request,%s",exception,request.url) ? ? ? ? ? ? #返回一個(gè)request,到schedule中,等待下載,從重新走所有的middleware。? ?? ? ? ? ? ? ? return self._retry(request, exception, spider) ?

?

要啟用自定義的retry middleware ,需要將默認(rèn)的RetryMiddleware設(shè)置為None

'DOWNLOADER_MIDDLEWARES' :{

'dayspider.middlewares.my_retry_middleware.CustomRetryMiddleware': 550,
'scrapy.downloadermiddlewares.retry.RetryMiddleware' : None,
},

?

下載異常

  • 像是 響應(yīng)超時(shí),網(wǎng)絡(luò)連接異常, forbidden 502這類的沒(méi)有response的異常? 直接被process_exception 捕獲
  • 像是 429(請(qǐng)求太頻繁,403(禁止訪問(wèn))500(服務(wù)器端返回一個(gè)表示錯(cuò)誤的代碼),有收到response的異常,可以用process_response進(jìn)行處理

?

轉(zhuǎn)載于:https://www.cnblogs.com/Ting-light/p/9582843.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的scrapy的Middleware的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。