前文傳送門: 小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝 小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門 小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門 小白學 Python 爬蟲(5):前置準備(四)數(shù)據(jù)庫基礎 小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝 小白學 Python 爬蟲(10):Session 和 Cookies 小白學 Python 爬蟲(11):urllib 基礎使用(一) 小白學 Python 爬蟲(12):urllib 基礎使用(二) 小白學 Python 爬蟲(13):urllib 基礎使用(三) 小白學 Python 爬蟲(14):urllib 基礎使用(四) 小白學 Python 爬蟲(15):urllib 基礎使用(五) 小白學 Python 爬蟲(16):urllib 實戰(zhàn)之爬取妹子圖 小白學 Python 爬蟲(17):Requests 基礎使用 小白學 Python 爬蟲(18):Requests 進階操作 小白學 Python 爬蟲(21):解析庫 Beautiful Soup(上) 小白學 Python 爬蟲(22):解析庫 Beautiful Soup(下) 小白學 Python 爬蟲(23):解析庫 pyquery 入門 小白學 Python 爬蟲(26):為啥買不起上海二手房你都買不起 小白學 Python 爬蟲(27):自動化測試框架 Selenium 從入門到放棄(上) 小白學 Python 爬蟲(28):自動化測試框架 Selenium 從入門到放棄(下) 小白學 Python 爬蟲(29):Selenium 獲取某大型電商網(wǎng)站商品信息 小白學 Python 爬蟲(31):自己構建一個簡單的代理池 小白學 Python 爬蟲(32):異步請求庫 AIOHTTP 基礎入門 小白學 Python 爬蟲(33):爬蟲框架 Scrapy 入門基礎(一) 小白學 Python 爬蟲(34):爬蟲框架 Scrapy 入門基礎(二) 小白學 Python 爬蟲(35):爬蟲框架 Scrapy 入門基礎(三) Selector 選擇器 引言Downloader Middleware 直譯過來是下載器中間件,本文后續(xù)就叫它下載中間件了,。 下載器中間件主要用于 Scrapy 的 Request 和 Response 處理。 Downloader Middleware 的功能非常的強大,,可以修改 UA 頭,、處理重定向、設置代理,、設置超時時間,、失敗重試、設置 Cookies 等功能,。 內(nèi)置下載器中間件Scrapy 已經(jīng)為我們提供相當多的內(nèi)置的下載器中間件,,用于各種功能,列表如下:
這些列表定義在 這些列表的數(shù)據(jù)結(jié)構是一個字典格式,,后面的值代表了優(yōu)先級,數(shù)字越小代表了越靠近 Scrapy 引擎,,數(shù)字越大越靠近下載器,,數(shù)字小的會被優(yōu)先調(diào)用。 自定義下載器中間件如果要在項目自定義一個下載器中間件,,需要我們自己設置 每個下載器中間件都是一個Python類,,該類定義了以下定義的一個或多個方法。 核心方法共有 4 個,,如下:
而我們至少只需要實現(xiàn)其中的一個方法就可以定義一個下載器中間件,。 process_request(request, spider)參數(shù):
對于通過下載中間件的每個請求,都會調(diào)用此方法,。 process_request() 應該是:return None,,返回一個 Response 對象,,返回一個Request 對象或引發(fā) IgnoreRequest 異常。 如果返回 None ,,則 Scrapy 將繼續(xù)處理此請求,,執(zhí)行所有其他中間件,直到最終將適當?shù)南螺d程序處理程序稱為執(zhí)行的請求(并下載了其響應),。 如果它返回一個 Response 對象,, Scrapy 不會打擾調(diào)用任何其他 process_request() 或 process_exception() 方法,或相應的下載功能; 它將返回該響應,。 process_response() 總是在每個響應上調(diào)用已安裝中間件的方法,。 如果返回一個 Request 對象, Scrapy 將停止調(diào)用 process_request 方法并重新計劃返回的請求,。一旦執(zhí)行了新返回的請求,,就會在下載的響應上調(diào)用適當?shù)闹虚g件鏈。 如果引發(fā) IgnoreRequest 異常,,則所有的下載器中間件的方法 process_exception() 會依次執(zhí)行,,如果沒有一個方法處理該異常,那么 Request 的 errback() 方法就會回調(diào),,如果該異常還沒處理,,那么就會忽略。 process_response(request, response, spider)參數(shù):
process_response() 應該:返回響應對象,,返回請求對象或引發(fā) IgnoreRequest 異常,。 如果它返回一個 Response (它可以是相同的給定響應,也可以是全新的響應),,那么該響應將繼續(xù)使用鏈中下一個中間件的 process_response() 進行處理,。 如果它返回一個 Request 對象,則中間件鏈將暫停,,并將返回的請求重新安排為將來下載,。 這與從 process_request() 返回請求的行為相同。 如果引發(fā) IgnoreRequest 異常,,則調(diào)用請求的 errback 函數(shù)(Request.errback),。 如果沒有代碼處理引發(fā)的異常,則將其忽略并且不記錄(與其他異常不同),。 process_exception(request, exception, spider)參數(shù):
當下載處理程序或 process_request() (從下載程序中間件中)引發(fā)異常(包括 IgnoreRequest 異常)時,, Scrapy 會調(diào)用 process_exception() 。 process_exception() 應該返回:無,,響應對象或請求對象,。 如果返回 None ,則 Scrapy 將繼續(xù)處理此異常,,執(zhí)行已安裝中間件的任何其他 process_exception() 方法,,直到?jīng)]有中間件為止,,并且默認異常處理開始。 如果返回 Response 對象,,則會啟動已安裝中間件的 process_response() 方法鏈,,并且 Scrapy 不會費心調(diào)用中間件的任何其他 process_exception() 方法。 如果它返回一個 Request 對象,,則將返回的請求重新安排為將來下載,。 這將停止執(zhí)行中間件的 process_exception() 方法,,就像返回響應一樣,。 from_crawler(cls, crawler)參數(shù):
如果存在,則調(diào)用該類方法以從 Crawler 創(chuàng)建中間件實例,。 它必須返回中間件的新實例,。 搜尋器對象提供對所有 Scrapy 核心組件(如設置和信號)的訪問; 它是中間件訪問它們并將其功能連接到 Scrapy 中的一種方式,。 示例首先,,我們還是在前面的 Scrapy 的項目上新建一個 Spider ,具體代碼如下:
使用如下命令運行一下:
結(jié)果部分截取如下:
可以看到,,這里的 UA 頭是 這里我們通過修改一下 UA 頭,,當然修改 UA 頭可以通過 settings 中的 USER_AGENT 進行設置,,這里我們要演示下載器中間件嘛,所以就使用下載器中間件設置一下,。 首先我們在
新增完成后,還需要在配置文件 settings 中開啟這個下載器中間件,,找到
到這里,,我們的修改就完成了,,可以重新運行這只爬蟲:
結(jié)果部分截取如下:
可以看到,這里響應的 UA 已經(jīng)變成了我們剛才設置的 UA 頭,,證明我們的修改是成功的,。 本篇就先到這里了,希望各位同學可以自己動手試一下,。 示例代碼本系列的所有代碼小編都會放在代碼管理倉庫 Github 和 Gitee 上,,方便大家取用。 參考https://docs./en/latest/topics/settings.html#std:setting-DOWNLOADER_MIDDLEWARES_BASE |
|