Scrapy框架中的Pipeline使用詳解
前言
Scrapy 中的 Pipeline 為我們提供了處理數(shù)據(jù)的功能,在實(shí)際開發(fā)中我們經(jīng)常使用它來(lái)清洗/驗(yàn)證數(shù)據(jù)、去重和數(shù)據(jù)保存。在一個(gè)項(xiàng)目中會(huì)存在多種 Pipeline ,每個(gè) Pipeline 都是一個(gè) class ,其中包含了一些處理的 Item 的方法。 Item 會(huì)在這些 Pipeline 中按順序依次傳遞,如果其中一個(gè) Pipeline 丟棄了 Item ,那么后面未執(zhí)行到的 Pipeline 將不會(huì)收到這個(gè) Item 。
自定義 Pipeline
自定義 Pipeline 其實(shí)很簡(jiǎn)單,只需要實(shí)現(xiàn)指定的方法即可。
process_item (self,item,spider)
解釋:
該方法必須實(shí)現(xiàn),處理數(shù)據(jù)的工作都在這個(gè)方法中進(jìn)行,方法返回 dict 、Item 、 Twisted Deferred 或者是 DropItem 異常。
參數(shù):
- item : 被爬取的 Item ;
- spider : 爬取 Item 時(shí)所使用的 Spider 。
Tip : 如果在 process_item 方法中丟棄了 Item ,那么這個(gè) Item 將不會(huì)向后續(xù) Pipeline 傳遞這個(gè) Item 。
open_spider(self,spider)
解釋:
爬蟲開始運(yùn)行時(shí),將會(huì)在這個(gè)方法中執(zhí)行一些初始化工作,例如打開數(shù)據(jù)庫(kù)、打開文件等。
參數(shù):
- spider : 當(dāng)前正在使用的
Spider close_spider(self,spider)
解釋:
爬蟲關(guān)閉時(shí),將會(huì)在這個(gè)方法中執(zhí)行一些后續(xù)工作,例如關(guān)閉數(shù)據(jù)庫(kù)、關(guān)閉文件等。
參數(shù):
- spider : 當(dāng)前正在使用的 Spider
from_crawl(self,crawler)
解釋:
方法為類方法,通過(guò)初始化 crawler 對(duì)象返回 Pipeline 實(shí)例。我們可以通過(guò) crawler 返回所有 Scrapy 核心組件。
特殊的 Pipeline
在一些項(xiàng)目中我們不僅要爬取網(wǎng)頁(yè)的數(shù)據(jù),還需要爬取文件或圖片,并保存在本地。這時(shí)我們就需要用到 Scrapy 中特殊的 Pipeline :FilesPipeline 和 ImagesPipeline ,它們具有一些相同的方法和結(jié)構(gòu)與,我們稱這種 Pipeline 為 MediaPipeline 。FilesPipeline 和 ImagesPipeline 都包含如下特性:
- 避免重復(fù)下載數(shù)據(jù)
- 指定存儲(chǔ)位置
ImagesPipeline 又包含如下特性:
- 圖片轉(zhuǎn)換為 JPG 格式或者 RGB 格式
- 生成縮略圖
- 限制圖片下載的最大/最小寬高
Tip:Scrapy Pipeline 避免重復(fù)下載的方法是將要下載的文件的 URL 放入一個(gè)隊(duì)列中,并且和 Response 關(guān)聯(lián),從而避免了重復(fù)下載。
FilesPipeline
FilesPipeline 下載文件的工作流程非常簡(jiǎn)單,一共有四個(gè)步驟:
- 爬蟲把獲取到的 Item 和希望下載的文件的 URL 保存到 file_urls 中;
- 爬蟲返回的 Item 進(jìn)入到 Pipeline 內(nèi)部;
- Item 按照順序傳遞到 FilesPipeline 時(shí),file_urls 中的 URL 會(huì)被內(nèi)置的調(diào)度器和下載器下載。在這個(gè)時(shí)候 Item 是被鎖定的,直到需要下載的文件下載完成或者報(bào)錯(cuò),Item 才解除鎖定;
- 下載完成后,結(jié)果將被保存在 files 中,files 是一個(gè)列表,每條數(shù)據(jù)是 dict 類型。
ImagesPipeline
ImagesPipeline 是繼承自 FilesPipeline ,也就是說(shuō)它的大部分步驟和 FilesPipeline 一樣。 唯一不同的是 ImagesPipeline 將需要下載的圖片 URL 保存到了 image_urls 中,下載完成的結(jié)果保存到 images 中。
Tip:Pipeline 中不僅僅包含了這兩個(gè)特殊的 Pipeline ,因?yàn)?FilesPipeline 和 ImagesPipeline 是比較常用的,因此我在這里進(jìn)行了講解。更多的內(nèi)置 Pipeline 大家可以去 Scrapy 官網(wǎng)查看具體的文檔。
我們?cè)诰帉懲?Pipeline 后需要在 settings.py 文件中進(jìn)行注冊(cè),將我們編寫的 Pipeline 注入到 Scrapy 中。
ITEM_PIPELINS= { '自定義Pipeline 路徑':'優(yōu)先級(jí)' }
總結(jié)
本篇文章主要講解了 Pipeline 的理論知識(shí),雖然很短,但是這些知識(shí)是 Pipeline 的核心知識(shí)。下一節(jié)我將通過(guò)代碼的形式來(lái)展現(xiàn) Pipeline 的使用。
到此這篇關(guān)于Scrapy框架中的Pipeline使用詳解的文章就介紹到這了,更多相關(guān)Pipeline使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用Dijkstra算法實(shí)現(xiàn)求解圖中最短路徑距離問題詳解
這篇文章主要介紹了Python使用Dijkstra算法實(shí)現(xiàn)求解圖中最短路徑距離問題,簡(jiǎn)單描述了Dijkstra算法的原理并結(jié)合具體實(shí)例形式分析了Python使用Dijkstra算法實(shí)現(xiàn)求解圖中最短路徑距離的相關(guān)步驟與操作技巧,需要的朋友可以參考下2018-05-05python中浮點(diǎn)數(shù)比較判斷!為什么不能用==(推薦)
這篇文章主要介紹了python中浮點(diǎn)數(shù)比較判斷!為什么不能用==,本文給大家分享問題解決方法,需要的朋友可以參考下2023-09-09Python實(shí)現(xiàn)強(qiáng)制復(fù)制粘貼的示例詳解
下個(gè)文檔還要馬內(nèi)?還好我會(huì)Python,本文就來(lái)教大家來(lái)一手如何利用Python實(shí)現(xiàn)強(qiáng)制復(fù)制粘貼。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-12-12詳解numpy矩陣的創(chuàng)建與數(shù)據(jù)類型
這篇文章主要介紹了詳解numpy矩陣的創(chuàng)建與數(shù)據(jù)類型,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10淺談PyTorch的可重復(fù)性問題(如何使實(shí)驗(yàn)結(jié)果可復(fù)現(xiàn))
今天小編就為大家分享一篇淺談PyTorch的可重復(fù)性問題(如何使實(shí)驗(yàn)結(jié)果可復(fù)現(xiàn)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02Python 統(tǒng)計(jì)Jira的bug 并發(fā)送郵件功能
這篇文章主要介紹了Python 統(tǒng)計(jì)Jira的bug 并發(fā)送郵件,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01python線程如何強(qiáng)制暫停、恢復(fù)、停止(非標(biāo)志位)
這篇文章主要介紹了python線程如何強(qiáng)制暫停、恢復(fù)、停止(非標(biāo)志位),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02