scrapy框架系列 (3) Item Pipline
阿新 • • 發佈:2018-04-01
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