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)用。如果沒有任何一個方法處理該異常, 則request的errback(Request.errback)方法會被調(diào)用。如果沒有代碼處理拋出的異常, 則該異常被忽略且不記錄(不同于其他異常那樣)。
參數(shù):
request(Request對象) – 處理的requestspider(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)的requestresponse(Response對象) – 被處理的responsespider(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)生異常的requestexception(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