初識 Scrapy - Item Pipeline

1. 前言

itemspider抓取之後,它會被髮送到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範圍內。

6. 參考文獻

[1] Scrapy 官方文檔 - Item Pipeline

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章