如何用item pipeline(管道)清洗数据
管道是什么
Item管道(Item Pipeline):
- 主要負(fù)責(zé)處理有蜘蛛從網(wǎng)頁中抽取的Item,主要任務(wù)是清洗、驗證和存儲數(shù)據(jù)。
- 當(dāng)頁面被蜘蛛解析后,將被發(fā)送到Item管道,并經(jīng)過幾個特定的次序處理數(shù)據(jù)。
- 每個Item管道的組件都是有一個簡單的方法組成的Python類。
- 它們獲取了Item并執(zhí)行它們的方法,同時還需要確定是否需要在Item管道中繼續(xù)執(zhí)行下一步或是直接丟棄掉不處理。
- 類(Class): 用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
管道的作用
- 清理HTML數(shù)據(jù)
- 驗證抓取的數(shù)據(jù)(檢查項目是否包含特定字段)
- 檢查重復(fù)(并刪除)
考慮到性能的原因,去重最好在鏈接中去重,或者利用數(shù)據(jù)庫主鍵的唯一性去重 - 將刮取的項目存儲在數(shù)據(jù)庫中
接著上文《如何使用scrapy的item來封裝數(shù)據(jù)》,我現(xiàn)在需要實現(xiàn)額外的三個處理——將價格的單位英鎊轉(zhuǎn)換為人民幣、去除掉書名相同的重復(fù)數(shù)據(jù)、將數(shù)據(jù)存入MongoDB中。
如何實現(xiàn)Item Pipeline
一個Item Pipeline不需要繼承特定基類,只需要實現(xiàn)某些特定方法,如process_item、open_spider、close_spider等。
process_item(item , spider):
每個 Item Pipeline 組件都需要調(diào)用該方法,這個方法必須返回一個 Item (或任何繼承類)對象, 或是拋出 DropItem 異常,被丟棄的 item 將不會被之后的 pipeline 組件所處理
需要傳入的參數(shù)為:
- item (Item 對象) : 被爬取的 item
spider (Spider 對象) : 爬取該 item 的 spider
該方法會被每一個 item pipeline 組件所調(diào)用,process_item 必須返回以下其中的任意一個對象:一個 dict
- 一個 Item 對象或者它的子類對象
- 一個 Twisted Deferred 對象
- 一個 DropItem exception;如果返回此異常,則該 item 將不會被后續(xù)的 item pipeline 所繼續(xù)訪問
注意:該方法是Item Pipeline必須實現(xiàn)的方法,其它三個方法(open_spider/close_spider/from_crawler)是可選的方法
如果process_item返回了一項數(shù)據(jù)(item或字典),返回的數(shù)據(jù)會傳遞給下一級Item Pipeline繼續(xù)處理,如果沒有則結(jié)束處理。
另外,當(dāng)process_item在處理某項item時拋出DropItem異常,該項item便會被拋棄,不再傳遞給后面的Item Pipeline處理,也不會導(dǎo)出到文件。
open_spider(self , spider ):——爬蟲啟動時調(diào)用
Spider打開時,即處理數(shù)據(jù)前,會回調(diào)該方法。該方法通常用于在開始處理數(shù)據(jù)前完成一些初始化工作,比如連接數(shù)據(jù)庫。
close_spider(self , spider):——爬蟲關(guān)閉時調(diào)用
與open_spider相對,為Spider關(guān)閉時,即處理數(shù)據(jù)后,會回調(diào)該方法。該方法通常用于在處理完所有數(shù)據(jù)之后完成某些清理工作,比如關(guān)閉數(shù)據(jù)庫。
from_crawler(cls, crawler):——也是在爬蟲啟動時調(diào)用,但是比open_spider早
創(chuàng)建Item Pipeline對象時回調(diào)該類方法。該類方法用來從 Crawler 中初始化得到一個 pipeline 實例;它必須返回一個新的 pipeline 實例;Crawler 對象提供了訪問所有 Scrapy 核心組件的接口,包括 settings 和 signals
代碼實現(xiàn)
新建bookpipelines.py文件
from scrapy.exceptions import DropItem from scrapy.item import Item import pymongo#實現(xiàn)價格轉(zhuǎn)換——第一個Item Pipeline,執(zhí)行順序較次 class PricePipeline(object):exchange_rate = 8.5309def process_item(self , item , spider):price = float(item['price'][1:]) * self.exchange_rateitem['price'] = '¥ %.2f' % pricereturn item# 實現(xiàn)去除重復(fù)書名的數(shù)據(jù)——第二個Item Pipeline,執(zhí)行順序最優(yōu) class DuplicatesPipeline(object):def __init__(self):self.book_set = set()def process_item(self , item , spider):name = item['name']if name in self.book_set:raise DropItem("Duplicate book found: %s" % item)self.book_set.add(name)return item#實現(xiàn)將數(shù)據(jù)存入mongoDB中——第三個Item Pipeline,執(zhí)行順序最后 class MongoDBPipeline(object):def from_crawler(cls , crawler):cls.DB_URI = crawler.settings.get('MONGO_DB_URI' , 'mongodb://localhost:27017/')cls.DB_NAME = crawler.settings.get('MONGO_DB_NAME' , 'scrapy_datas')return cls()def open_spider(self , spider):self.client = pymongo.MongoClient(self.DB_URI)self.db = self.client[self.DB_NAME]def close_spider(self , spider):self.client.close()def process_item(self , item , spider):collection = self.db[spider.name]post = dict(item) if isinstance(item , Item) else itemcollection.insert_one(post)return item總結(jié)
以上是生活随笔為你收集整理的如何用item pipeline(管道)清洗数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何使用scrapy的item来封装数据
- 下一篇: tensorflow中张量、常量、变量、