1. 程式人生 > >scrapy框架系列 (3) Item Pipline

scrapy框架系列 (3) Item Pipline

comment 順序 spi .py ini params config con ensure

item pipeline

當Item在Spider中被收集之後,它將會被傳遞到Item Pipeline,這些Item Pipeline組件按定義的順序處理Item。

每個Item Pipeline都是實現了簡單方法的Python類,比如決定此Item是丟棄而存儲。以下是item pipeline的一些典型應用:

  • 驗證爬取的數據(檢查item包含某些字段,比如說name字段)
  • 查重(並丟棄)
  • 將爬取結果保存到文件或者數據庫中

編寫item pipeline

編寫item pipeline很簡單,item pipiline組件是一個獨立的Python類,其中process_item()方法必須實現:

import something

class SomethingPipeline(object):
    def __init__(self):    
        # 可選實現,做參數初始化等
        # doing something

    def process_item(self, item, spider):
        # item (Item 對象) – 被爬取的item
        # spider (Spider 對象) – 爬取該item的spider
        # 這個方法必須實現,每個item pipeline組件都需要調用該方法,
        # 這個方法必須返回一個 Item 對象,被丟棄的item將不會被之後的pipeline組件所處理。
        return item

    def open_spider(self, spider):
        # spider (Spider 對象) – 被開啟的spider
        # 可選實現,當spider被開啟時,這個方法被調用。

    def close_spider(self, spider):
        # spider (Spider 對象) – 被關閉的spider
        # 可選實現,當spider被關閉時,這個方法被調用

完善之前的案例:

item寫入JSON文件

以下pipeline將所有(從所有‘spider‘中)爬取到的item,存儲到一個獨立地items.json 文件,每行包含一個序列化為‘JSON‘格式的‘item‘:

import json

class ItcastJsonPipeline(object):

    def __init__(self):
        self.file = open(‘teacher.json‘, ‘wb‘)

    def process_item(self, item, spider):
        content = json.dumps(dict(item), ensure_ascii=False) + "\n"
        self.file.write(content)
        return item

    def close_spider(self, spider):
        self.file.close()

啟用一個Item Pipeline組件

為了啟用Item Pipeline組件,必須將它的類添加到 settings.py文件ITEM_PIPELINES 配置,就像下面這個例子:

# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
    #‘mySpider.pipelines.SomePipeline‘: 300,
    "mySpider.pipelines.ItcastJsonPipeline":300
}

分配給每個類的整型值,確定了他們運行的順序,item按數字從低到高的順序,通過pipeline,通常將這些數字定義在0-1000範圍內(0-1000隨意設置,數值越低,組件的優先級越高)

重新啟動爬蟲

將parse()方法改為4.2中最後思考中的代碼,然後執行下面的命令:

scrapy crawl itcast

查看當前目錄是否生成teacher.json

scrapy框架系列 (3) Item Pipline