當 scrapy.Spider
爬蟲抓到資料後,會將資料送往 Item Pipelines
進行一系列的處理。常見的使用情境是:
Pipelines 中每一個組件都是一個 Python 類別,不需要繼承其他類別,但必須實作這個方法:
dict
物件、Item
物件、Twisted Deferred 或拋出 DropItem 例外。另外還可以視需求另外實作其他方法:
跟 Item 相同,建立好專案後,專案目錄中會有一個 pipelines.py
檔案,其中有 Scrapy 根據專案名稱自動建立的 IthomeCrawlersPipeline
類別。
class IthomeCrawlersPipeline(object):
def process_item(self, item, spider):
return item
假設我們不想要保存瀏覽次數小於 20 的文章可以這樣做:(只是找個範例沒有別的意思)
from scrapy.exceptions import DropItem
class IthomeCrawlersPipeline(object):
def process_item(self, item, spider):
if item['view_count'] < 20:
raise DropItem(f'[{item["title"]}] 瀏覽數小於 20')
return item
建立 Pipeline 元件後還需要設定每個元件的執行順序。在專案目錄中的 settings.py
檔案中有一個 dict
型態的 ITEM_PIPELINE 變數,key 是元件的完整名稱,value 是 0~1000 的整數,數字小的會先執行。
把我們剛剛建立的元件加入後會長這樣:
ITEM_PIPELINES = {
'ithome_crawlers.pipelines.IthomeCrawlersPipeline': 300,
}
最後執行 scrapy crawl ithome -o ithome.csv
指令來執行爬蟲,可以在啟動的 log 中看到元件已經被加入 Pipeline 中。
執行過程中,有可能會看到這樣的 log,代表有文章被過濾掉了。
最後檢查輸出的 ithome.csv
檔案中沒有瀏覽數小於 20 的文章。