爬蟲框架Scrapy之Item Pipeline


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

如果報UnicodeEncodeError: 'ascii' codec can't encode characters錯誤,在itcast.py文件上添加下面代碼指定編碼格式:

import sys reload(sys) sys.setdefaultencoding('utf-8')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM