scrapy中的下載器中間件

scrapy中的下載器中間件

下載中間件

下載器中間件是介于Scrapy的request/response處理的鉤子框架。 是用于全局修改Scrapy request和response的一個輕量、底層的系統(tǒng)。

編寫下載器中間件

1. process_request(request, spider)

當(dāng)每個request通過下載中間件時,該方法被調(diào)用。
process_request() 必須返回其中之一: 返回 None 、返回一個 Response 對象、返回一個 Request對象或raise IgnoreRequest 。

如果其返回 None ,Scrapy將繼續(xù)處理該request,執(zhí)行其他的中間件的相應(yīng)方法,直到合適的下載器處理函數(shù)(download handler)被調(diào)用, 該request被執(zhí)行(其response被下載)。

如果其返回 Response 對象,Scrapy將不會調(diào)用 任何 其他的 process_request()process_exception() 方法,或相應(yīng)地下載函數(shù); 其將返回該response。 已安裝的中間件的 process_response() 方法則會在每個response返回時被調(diào)用。

如果其返回 Request 對象,Scrapy則停止調(diào)用 process_request方法并重新調(diào)度返回的request。當(dāng)新返回的request被執(zhí)行后, 相應(yīng)地中間件鏈將會根據(jù)下載的response被調(diào)用。

如果其raise一個 IgnoreRequest 異常,則安裝的下載中間件的 process_exception() 方法會被調(diào)用。如果沒有任何一個方法處理該異常, 則requesterrback(Request.errback)方法會被調(diào)用。如果沒有代碼處理拋出的異常, 則該異常被忽略且不記錄(不同于其他異常那樣)。

參數(shù):

  • request (Request 對象) – 處理的request
  • spider (Spider 對象) – 該request對應(yīng)的spider

2. process_response(request, response, spider)

process_response() 必須返回以下之一: 返回一個 Response對象、 返回一個Request 對象或raise一個 IgnoreRequest 異常。

如果其返回一個 Response (可以與傳入的response相同,也可以是全新的對象), 該response會被在鏈中的其他中間件的 process_response() 方法處理。

如果其返回一個 Request 對象,則中間件鏈停止, 返回的request會被重新調(diào)度下載。處理類似于 process_request() 返回request所做的那樣。

如果其拋出一個 IgnoreRequest 異常,則調(diào)用request的errback(Request.errback)。 如果沒有代碼處理拋出的異常,則該異常被忽略且不記錄(不同于其他異常那樣)。

參數(shù):

  • request (Request對象) – response所對應(yīng)的request
  • response (Response 對象) – 被處理的response
  • spider (Spider 對象) – response所對應(yīng)的spider

3.process_exception(request, exception, spider)

當(dāng)下載處理器(download handler)或 process_request() (下載中間件)拋出異常(包括 IgnoreRequest 異常)時, Scrapy調(diào)用 process_exception() 。

process_exception() 應(yīng)該返回以下之一: 返回 None 、 一個 Response 對象、或者一個 Request 對象。

如果其返回 None ,Scrapy將會繼續(xù)處理該異常,接著調(diào)用已安裝的其他中間件的 process_exception() 方法,直到所有中間件都被調(diào)用完畢,則調(diào)用默認(rèn)的異常處理。

如果其返回一個 Response 對象,則已安裝的中間件鏈的 process_response() 方法被調(diào)用。Scrapy將不會調(diào)用任何其他中間件的 process_exception() 方法。

如果其返回一個 Request 對象, 則返回的request將會被重新調(diào)用下載。這將停止中間件的 process_exception() 方法執(zhí)行,就如返回一個response的那樣。

參數(shù):

  • request (是 Request 對象) – 產(chǎn)生異常的request
  • exception (Exception 對象) – 拋出的異常
  • spider (Spider 對象) – request對應(yīng)的spider

總結(jié):

總的來說下載器中間件就是起到處理request請求并且返回response的作用,一切從網(wǎng)頁爬取的url發(fā)起的請求會組成一個請求隊列,然后一個一個排隊經(jīng)過下載器中間件,之后下載器中間件會對request做出相應(yīng)的處理,比如添加請求頭,添加代理等等,然后通過process_response返回一個response,之后就是用得到的response做出相應(yīng)的分析,當(dāng)然這里的內(nèi)容頁可以不實(shí)現(xiàn),但是如果要爬取大型的網(wǎng)站,會遇到被ban的可能就要在下載器中間件這里著手,設(shè)置一些相應(yīng)的請求頭,ip代理等等內(nèi)容。
以上純屬個人逐漸摸索總結(jié)出來的內(nèi)容,如果有什么錯誤歡迎指正

版權(quán)信息所有者:chenjiabing
如若轉(zhuǎn)載請標(biāo)明出處:chenjiabing666.github.io6

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容