小白學 Python 爬蟲(37):爬蟲框架 Scrapy 入門基礎(五) Spider Middleware

人生苦短,我用 Pythonhtml

前文傳送門:數據庫

小白學 Python 爬蟲(1):開篇框架

小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝異步

小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門scrapy

小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門ide

小白學 Python 爬蟲(5):前置準備(四)數據庫基礎測試

小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝網站

小白學 Python 爬蟲(7):HTTP 基礎url

小白學 Python 爬蟲(8):網頁基礎spa

小白學 Python 爬蟲(9):爬蟲基礎

小白學 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 爬蟲(19):Xpath 基操

小白學 Python 爬蟲(20):Xpath 進階

小白學 Python 爬蟲(21):解析庫 Beautiful Soup(上)

小白學 Python 爬蟲(22):解析庫 Beautiful Soup(下)

小白學 Python 爬蟲(23):解析庫 pyquery 入門

小白學 Python 爬蟲(24):2019 豆瓣電影排行

小白學 Python 爬蟲(25):爬取股票信息

小白學 Python 爬蟲(26):爲啥買不起上海二手房你都買不起

小白學 Python 爬蟲(27):自動化測試框架 Selenium 從入門到放棄(上)

小白學 Python 爬蟲(28):自動化測試框架 Selenium 從入門到放棄(下)

小白學 Python 爬蟲(29):Selenium 獲取某大型電商網站商品信息

小白學 Python 爬蟲(30):代理基礎

小白學 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 只提供了一些基礎的功能,咱們若是須要擴展其功能,實現一個自定義的爬蟲中間件,只須要實現如下某幾個方法便可。

核心方法以下:

  • processspiderinput(response, spider)
  • processspideroutput(response, result, spider)
  • processspiderexception(response, exception, spider)
  • processstartrequests(start_requests, spider)

只須要實現其中一個方法就能夠定義一個爬蟲中間件。

processspiderinput(response, spider)

參數:

response (response 對象)–正在處理的響應

spider (spider 對象)–此響應預期用於的蜘蛛

對於經過 Spider Middleware 並進入 Spider 進行處理的每一個響應,都會調用此方法。

processspiderinput() )應該返回 None 或引起異常。

若是返回 None ,則 Scrapy 將繼續處理此響應,並執行全部其餘中間件,直到最終將響應交給蜘蛛進行處理。

若是引起異常, Scrapy 不會費心調用任何其餘蜘蛛中間件 processspiderinput() ,而且會在存在錯誤時調用請求 errback ,不然它將啓動 processspiderexception() 鏈。 errback 的輸出在另外一個方向上鍊回,以供 processspideroutput() 處理,或者若是引起異常,則連接到 processspiderexception() 。

processspideroutput(response, result, spider)

參數:

response ( response 對象)–從蜘蛛生成此輸出的響應

result (可迭代的 Request , dict 或 Item 對象)– spider 返回的結果

spider ( spider 對象)–正在處理其結果的蜘蛛

處理完響應後,將使用 Spider 從返回的結果中調用此方法。

processspideroutput() 必須返回 Request , dict 或 Item 對象的可迭代對象。

processspiderexception(response, exception, spider)

參數:

response ( response 對象)–引起異常時正在處理的響應

exception (Exception對象)–引起的異常

spider ( spider 對象)–引起異常的蜘蛛

當 Spider 或 processspideroutput() 方法(來自先前的 Spider 中間件)引起異常時,將調用此方法。

processspiderexception() 應該返回 None 或可迭代的 Request , dict 或 Item 對象。

若是返回 None ,則 Scrapy 將繼續處理此異常,並在如下中間件組件中執行任何其餘 processspiderexception() ,直到沒有剩餘中間件組件且異常到達引擎爲止(記錄並丟棄該異常)。

若是返回可迭代,則從下一個蜘蛛中間件開始, processspideroutput() 管道將啓動,而且不會調用其餘 processspiderexception() 。

processstartrequests(start_requests, spider)

參數:

start_requests (可迭代的 Request )–啓動請求

spider ( spider 對象)–啓動請求所屬的蜘蛛

此方法是由 Spider 的啓動請求調用的,其工做原理與 processspideroutput() 方法相似,不一樣之處在於它沒有關聯的響應,而且僅返回請求(不返回項目)。

它接收一個可迭代的(在 start_requests 參數中),而且必須返回另外一個可迭代的 Request 對象。

在實際使用過程當中, Spider Middleware 的使用率並不如 Downloader Middleware 高,小編這裏就不作示例了,在一些必要的狀況下, Spider Middleware 能夠用做一些數據處理。

參考

https://docs.scrapy.org/en/latest/topics/spider-middleware.html

若是個人文章對您有幫助,請掃碼關注下做者的公衆號:獲取最新干貨推送:)
相關文章
相關標籤/搜索