日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

如何用item pipeline(管道)清洗数据

發(fā)布時(shí)間:2025/3/19 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何用item pipeline(管道)清洗数据 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

管道是什么

Item管道(Item Pipeline):

  • 主要負(fù)責(zé)處理有蜘蛛從網(wǎng)頁中抽取的Item,主要任務(wù)是清洗、驗(yàn)證和存儲(chǔ)數(shù)據(jù)。
  • 當(dāng)頁面被蜘蛛解析后,將被發(fā)送到Item管道,并經(jīng)過幾個(gè)特定的次序處理數(shù)據(jù)。
  • 每個(gè)Item管道的組件都是有一個(gè)簡單的方法組成的Python類。
  • 它們獲取了Item并執(zhí)行它們的方法,同時(shí)還需要確定是否需要在Item管道中繼續(xù)執(zhí)行下一步或是直接丟棄掉不處理。
  • 類(Class): 用來描述具有相同的屬性和方法的對(duì)象的集合。它定義了該集合中每個(gè)對(duì)象所共有的屬性和方法。對(duì)象是類的實(shí)例。

管道的作用

  • 清理HTML數(shù)據(jù)
  • 驗(yàn)證抓取的數(shù)據(jù)(檢查項(xiàng)目是否包含特定字段)
  • 檢查重復(fù)(并刪除)
    考慮到性能的原因,去重最好在鏈接中去重,或者利用數(shù)據(jù)庫主鍵的唯一性去重
  • 將刮取的項(xiàng)目存儲(chǔ)在數(shù)據(jù)庫中

接著上文《如何使用scrapy的item來封裝數(shù)據(jù)》,我現(xiàn)在需要實(shí)現(xiàn)額外的三個(gè)處理——將價(jià)格的單位英鎊轉(zhuǎn)換為人民幣、去除掉書名相同的重復(fù)數(shù)據(jù)、將數(shù)據(jù)存入MongoDB中。

如何實(shí)現(xiàn)Item Pipeline

一個(gè)Item Pipeline不需要繼承特定基類,只需要實(shí)現(xiàn)某些特定方法,如process_item、open_spider、close_spider等。

process_item(item , spider):

每個(gè) Item Pipeline 組件都需要調(diào)用該方法,這個(gè)方法必須返回一個(gè) Item (或任何繼承類)對(duì)象, 或是拋出 DropItem 異常,被丟棄的 item 將不會(huì)被之后的 pipeline 組件所處理

需要傳入的參數(shù)為:

  • item (Item 對(duì)象) : 被爬取的 item
  • spider (Spider 對(duì)象) : 爬取該 item 的 spider

    該方法會(huì)被每一個(gè) item pipeline 組件所調(diào)用,process_item 必須返回以下其中的任意一個(gè)對(duì)象:

  • 一個(gè) dict

  • 一個(gè) Item 對(duì)象或者它的子類對(duì)象
  • 一個(gè) Twisted Deferred 對(duì)象
  • 一個(gè) DropItem exception;如果返回此異常,則該 item 將不會(huì)被后續(xù)的 item pipeline 所繼續(xù)訪問

    注意:該方法是Item Pipeline必須實(shí)現(xiàn)的方法,其它三個(gè)方法(open_spider/close_spider/from_crawler)是可選的方法

如果process_item返回了一項(xiàng)數(shù)據(jù)(item或字典),返回的數(shù)據(jù)會(huì)傳遞給下一級(jí)Item Pipeline繼續(xù)處理,如果沒有則結(jié)束處理。
另外,當(dāng)process_item在處理某項(xiàng)item時(shí)拋出DropItem異常,該項(xiàng)item便會(huì)被拋棄,不再傳遞給后面的Item Pipeline處理,也不會(huì)導(dǎo)出到文件。

open_spider(self , spider ):——爬蟲啟動(dòng)時(shí)調(diào)用

Spider打開時(shí),即處理數(shù)據(jù)前,會(huì)回調(diào)該方法。該方法通常用于在開始處理數(shù)據(jù)前完成一些初始化工作,比如連接數(shù)據(jù)庫。

close_spider(self , spider):——爬蟲關(guān)閉時(shí)調(diào)用

與open_spider相對(duì),為Spider關(guān)閉時(shí),即處理數(shù)據(jù)后,會(huì)回調(diào)該方法。該方法通常用于在處理完所有數(shù)據(jù)之后完成某些清理工作,比如關(guān)閉數(shù)據(jù)庫。

from_crawler(cls, crawler):——也是在爬蟲啟動(dòng)時(shí)調(diào)用,但是比open_spider早

創(chuàng)建Item Pipeline對(duì)象時(shí)回調(diào)該類方法。該類方法用來從 Crawler 中初始化得到一個(gè) pipeline 實(shí)例;它必須返回一個(gè)新的 pipeline 實(shí)例;Crawler 對(duì)象提供了訪問所有 Scrapy 核心組件的接口,包括 settings 和 signals

代碼實(shí)現(xiàn)

新建bookpipelines.py文件

from scrapy.exceptions import DropItem from scrapy.item import Item import pymongo#實(shí)現(xiàn)價(jià)格轉(zhuǎn)換——第一個(gè)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# 實(shí)現(xiàn)去除重復(fù)書名的數(shù)據(jù)——第二個(gè)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#實(shí)現(xiàn)將數(shù)據(jù)存入mongoDB中——第三個(gè)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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。