溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spider Middleware是什么有什么用

發(fā)布時(shí)間:2020-07-29 14:28:19 來源:億速云 閱讀:253 作者:清晨 欄目:編程語(yǔ)言

這篇文章主要介紹Spider Middleware是什么有什么用,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

Spider Middleware 是 Scrapy 的 Spider 處理機(jī)制的一個(gè)鉤子框架,我們可以在其中插入自定義功能,以處理發(fā)送到 Spider 進(jìn)行處理的響應(yīng)以及處理 Spider 生成的請(qǐng)求和項(xiàng)目。

內(nèi)置爬蟲中間件

和前文介紹過的 Downloader Middleware 一樣, Scrapy 同樣為我們內(nèi)置了一部分的 Spider Middleware ,這些內(nèi)置的 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 會(huì)被加入到 SPIDER_MIDDLEWARES 的設(shè)置中,該設(shè)置會(huì)和 Scrapy 中定義的 SPIDER_MIDDLEWARES_BASE 合并,根據(jù)數(shù)值的大小進(jìn)行優(yōu)先級(jí)排序,第一個(gè) Middleware 是靠近引擎的,最后一個(gè) Middleware 是靠近 Spider 的。

自定義爬蟲中間件

Scrapy 內(nèi)置的 Spider Middleware 只提供了一些基礎(chǔ)的功能,我們?nèi)绻枰獢U(kuò)展其功能,實(shí)現(xiàn)一個(gè)自定義的爬蟲中間件,只需要實(shí)現(xiàn)以下某幾個(gè)方法即可。

核心方法如下:

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

只需要實(shí)現(xiàn)其中一個(gè)方法就可以定義一個(gè)爬蟲中間件。

processspiderinput(response, spider)

參數(shù):

response (response 對(duì)象)–正在處理的響應(yīng)

spider (spider 對(duì)象)–此響應(yīng)預(yù)期用于的蜘蛛

對(duì)于通過 Spider Middleware 并進(jìn)入 Spider 進(jìn)行處理的每個(gè)響應(yīng),都會(huì)調(diào)用此方法。

processspiderinput() )應(yīng)該返回 None 或引發(fā)異常。

如果返回 None ,則 Scrapy 將繼續(xù)處理此響應(yīng),并執(zhí)行所有其他中間件,直到最終將響應(yīng)交給蜘蛛進(jìn)行處理。

如果引發(fā)異常, Scrapy 不會(huì)費(fèi)心調(diào)用任何其他蜘蛛中間件 processspiderinput() ,并且會(huì)在存在錯(cuò)誤時(shí)調(diào)用請(qǐng)求 errback ,否則它將啟動(dòng) processspiderexception() 鏈。 errback 的輸出在另一個(gè)方向上鏈回,以供 processspideroutput() 處理,或者如果引發(fā)異常,則鏈接到 processspiderexception() 。

processspideroutput(response, result, spider)

參數(shù):

response ( response 對(duì)象)–從蜘蛛生成此輸出的響應(yīng)

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

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

處理完響應(yīng)后,將使用 Spider 從返回的結(jié)果中調(diào)用此方法。

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

processspiderexception(response, exception, spider)

參數(shù):

response ( response  對(duì)象)–引發(fā)異常時(shí)正在處理的響應(yīng)

exception (Exception對(duì)象)–引發(fā)的異常

spider ( spider 對(duì)象)–引發(fā)異常的蜘蛛

當(dāng) Spider 或 processspideroutput() 方法(來自先前的 Spider 中間件)引發(fā)異常時(shí),將調(diào)用此方法。

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

如果返回 None ,則 Scrapy 將繼續(xù)處理此異常,并在以下中間件組件中執(zhí)行任何其他 processspiderexception() ,直到?jīng)]有剩余中間件組件且異常到達(dá)引擎為止(記錄并丟棄該異常)。

如果返回可迭代,則從下一個(gè)蜘蛛中間件開始, processspideroutput() 管道將啟動(dòng),并且不會(huì)調(diào)用其他 processspiderexception() 。

processstartrequests(start_requests, spider)

參數(shù):

start_requests (可迭代的 Request )–啟動(dòng)請(qǐng)求

spider ( spider 對(duì)象)–啟動(dòng)請(qǐng)求所屬的蜘蛛

此方法是由 Spider 的啟動(dòng)請(qǐng)求調(diào)用的,其工作原理與 processspideroutput() 方法類似,不同之處在于它沒有關(guān)聯(lián)的響應(yīng),并且僅返回請(qǐng)求(不返回項(xiàng)目)。

它接收一個(gè)可迭代的(在 start_requests 參數(shù)中),并且必須返回另一個(gè)可迭代的 Request 對(duì)象。

在實(shí)際使用過程中, Spider Middleware 的使用率并不如 Downloader Middleware 高,小編這里就不做示例了,在一些必要的情況下, Spider Middleware 可以用作一些數(shù)據(jù)處理。

以上是Spider Middleware是什么有什么用的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI