scrapy中的下載器中間件

scrapy中的下載器中間件

下載中間件

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

編寫(xiě)下載器中間件

1. process_request(request, spider)

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

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

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

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

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

參數(shù):

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

2. process_response(request, response, spider)

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

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

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

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

參數(shù):

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

3.process_exception(request, exception, spider)

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

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

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

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

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

參數(shù):

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

總結(jié):

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

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

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

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

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