python爬蟲學習筆記 4.4 (Item Pipline)

python爬蟲學習筆記 4.4 (Item Pipline)

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’。

打開 pipelines.py 文件,寫入下面代碼:

# pipelines.py

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

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