1. 前言
在item
被spider
抓取之後,它會被髮送到Item Pipeline
,該管道通過幾個按順序執行的組件來處理它。
每一個item pipeline組件
都是Python
的類。它們接收item
,並對它執行操作,還決定該項目是否應繼續通過管道,或者是否應刪除並不再處理。
item pipeline
的典型用途有:
- 清理
HTML
數據 - 驗證抓取的數據(檢查項目是否包含某些字段)
- 檢查重複項(並刪除它們)
- 將爬取的項目存儲在數據庫中
2. 自定義item pipeline
每個item pipeline組件
都是一個python
類,必須實現以下方法:
process_item(self, item, spider):
# 調用每一個item pipeline組件的此方法。
pass
open_spider(self, spider):
# 當spider打開時調用此方法。
pass
close_spider(self, spider):
# 當spider關閉時調用此方法
pass
from_crawler(cls, crawler):
# 如果存在,從一個crawler創建一個pipeline實例。
pass
3. 示例
- 驗證
item
字段和刪除不合格的item
- 將
item
寫入json
文件 - 將
item
存入MongoDB
詳情見 Scrapy 官方文檔 - Item Pipeline
4. 重複過濾器
查找並刪除已處理的重複item
。假設我們的item
有一個唯一的ID
,但是我們的spider
返回多個ID
相同的item
:
from scrapy.exceptions import DropItem
class DuplicatesPipeline(object):
def __init__(self):
self.ids_seen = set()
def process_item(self, item, spider):
if item['id'] in self.ids_seen:
raise DropItem("Duplicate item found: %s" % item)
else:
self.ids_seen.add(item['id'])
return item
5. 激活item pipeline組件
若要激活項管道組件,必須將其類添加到ITEM_PIPELINES
設置,如以下示例中所示:
ITEM_PIPELINES = {
'myproject.pipelines.PricePipeline': 300,
'myproject.pipelines.JsonWriterPipeline': 800,
}
在此設置中分配給類的整數值決定了它們的運行順序:item從低到高依次運行。習慣上把這些數字定義在0-1000範圍內。