人生苦短,我用 Pythonhtml
前文傳送門:python
小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝框架
小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門異步
小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門scrapy
小白學 Python 爬蟲(5):前置準備(四)數據庫基礎ide
小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝測試
小白學 Python 爬蟲(10):Session 和 Cookies
小白學 Python 爬蟲(11):urllib 基礎使用(一)
小白學 Python 爬蟲(12):urllib 基礎使用(二)
小白學 Python 爬蟲(13):urllib 基礎使用(三)
小白學 Python 爬蟲(14):urllib 基礎使用(四)
小白學 Python 爬蟲(15):urllib 基礎使用(五)
小白學 Python 爬蟲(16):urllib 實戰之爬取妹子圖
小白學 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 獲取某大型電商網站商品信息
小白學 Python 爬蟲(31):本身構建一個簡單的代理池
小白學 Python 爬蟲(32):異步請求庫 AIOHTTP 基礎入門
小白學 Python 爬蟲(33):爬蟲框架 Scrapy 入門基礎(一)
小白學 Python 爬蟲(34):爬蟲框架 Scrapy 入門基礎(二)
小白學 Python 爬蟲(35):爬蟲框架 Scrapy 入門基礎(三) Selector 選擇器
小白學 Python 爬蟲(36):爬蟲框架 Scrapy 入門基礎(四) Downloader Middleware
Spider Middleware 是 Scrapy 的 Spider 處理機制的一個鉤子框架,咱們能夠在其中插入自定義功能,以處理髮送到 Spider 進行處理的響應以及處理 Spider 生成的請求和項目。
和前文介紹過的 Downloader Middleware 同樣, Scrapy 一樣爲咱們內置了一部分的 Spider Middleware ,這些內置的 Spider Middleware 被保存在變量 SPIDER_MIDDLEWARES_BASE
中,具體以下:
{ 'scrapy.spidermiddlewares.httperror.HttpErrorMiddleware': 50, 'scrapy.spidermiddlewares.offsite.OffsiteMiddleware': 500, 'scrapy.spidermiddlewares.referer.RefererMiddleware': 700, 'scrapy.spidermiddlewares.urllength.UrlLengthMiddleware': 800, 'scrapy.spidermiddlewares.depth.DepthMiddleware': 900, }
一樣和 Downloader Middleware 同樣的是, Spider Middleware 會被加入到 SPIDER_MIDDLEWARES
的設置中,該設置會和 Scrapy 中定義的 SPIDER_MIDDLEWARES_BASE
合併,根據數值的大小進行優先級排序,第一個 Middleware 是靠近引擎的,最後一個 Middleware 是靠近 Spider 的。
Scrapy 內置的 Spider Middleware 只提供了一些基礎的功能,咱們若是須要擴展其功能,實現一個自定義的爬蟲中間件,只須要實現如下某幾個方法便可。
核心方法以下:
只須要實現其中一個方法就能夠定義一個爬蟲中間件。
參數:
response (response 對象)–正在處理的響應
spider (spider 對象)–此響應預期用於的蜘蛛
對於經過 Spider Middleware 並進入 Spider 進行處理的每一個響應,都會調用此方法。
process_spider_input() )應該返回 None 或引起異常。
若是返回 None ,則 Scrapy 將繼續處理此響應,並執行全部其餘中間件,直到最終將響應交給蜘蛛進行處理。
若是引起異常, Scrapy 不會費心調用任何其餘蜘蛛中間件 process_spider_input() ,而且會在存在錯誤時調用請求 errback ,不然它將啓動 process_spider_exception() 鏈。 errback 的輸出在另外一個方向上鍊回,以供 process_spider_output() 處理,或者若是引起異常,則連接到 process_spider_exception() 。
參數:
response ( response 對象)–從蜘蛛生成此輸出的響應
result (可迭代的 Request , dict 或 Item 對象)– spider 返回的結果
spider ( spider 對象)–正在處理其結果的蜘蛛
處理完響應後,將使用 Spider 從返回的結果中調用此方法。
process_spider_output() 必須返回 Request , dict 或 Item 對象的可迭代對象。
參數:
response ( response 對象)–引起異常時正在處理的響應
exception (Exception對象)–引起的異常
spider ( spider 對象)–引起異常的蜘蛛
當 Spider 或 process_spider_output() 方法(來自先前的 Spider 中間件)引起異常時,將調用此方法。
process_spider_exception() 應該返回 None 或可迭代的 Request , dict 或 Item 對象。
若是返回 None ,則 Scrapy 將繼續處理此異常,並在如下中間件組件中執行任何其餘 process_spider_exception() ,直到沒有剩餘中間件組件且異常到達引擎爲止(記錄並丟棄該異常)。
若是返回可迭代,則從下一個蜘蛛中間件開始, process_spider_output() 管道將啓動,而且不會調用其餘 process_spider_exception() 。
參數:
start_requests (可迭代的 Request )–啓動請求
spider ( spider 對象)–啓動請求所屬的蜘蛛
此方法是由 Spider 的啓動請求調用的,其工做原理與 process_spider_output() 方法相似,不一樣之處在於它沒有關聯的響應,而且僅返回請求(不返回項目)。
它接收一個可迭代的(在 start_requests 參數中),而且必須返回另外一個可迭代的 Request 對象。
在實際使用過程當中, Spider Middleware 的使用率並不如 Downloader Middleware 高,小編這裏就不作示例了,在一些必要的狀況下, Spider Middleware 能夠用做一些數據處理。
https://docs.scrapy.org/en/latest/topics/spider-middleware.html
原文出處:https://www.cnblogs.com/babycomeon/p/12182537.html