版權聲明:本文爲博主原創文章,轉載請註明出處;若是博客中有錯誤之處抑或有能夠改進的地方,歡迎在評論區留言。 https://blog.csdn.net/f156207495/article/details/81428011
管道是什麼
Item管道(Item Pipeline):
主要負責處理有蜘蛛從網頁中抽取的Item,主要任務是清洗、驗證和存儲數據。
當頁面被蜘蛛解析後,將被髮送到Item管道,並通過幾個特定的次序處理數據。
每一個Item管道的組件都是有一個簡單的方法組成的Python類。
它們獲取了Item並執行它們的方法,同時還須要肯定是否須要在Item管道中繼續執行下一步或是直接丟棄掉不處理。
類(Class): 用來描述具備相同的屬性和方法的對象的集合。它定義了該集合中每一個對象所共有的屬性和方法。對象是類的實例。
管道的做用
清理HTML數據
驗證抓取的數據(檢查項目是否包含特定字段)
檢查重複(並刪除)
考慮到性能的緣由,去重最好在連接中去重,或者利用數據庫主鍵的惟一性去重
將刮取的項目存儲在數據庫中
接着上文《如何使用scrapy的item來封裝數據》,我如今須要實現額外的三個處理——將價格的單位英鎊轉換爲人民幣、去除掉書名相同的重複數據、將數據存入MongoDB中。python
如何實現Item Pipeline
一個Item Pipeline不須要繼承特定基類,只須要實現某些特定方法,如process_item、open_spider、close_spider等。mongodb
process_item(item , spider):數據庫
每一個 Item Pipeline 組件都須要調用該方法,這個方法必須返回一個 Item (或任何繼承類)對象, 或是拋出 DropItem 異常,被丟棄的 item 將不會被以後的 pipeline 組件所處理 python爬蟲
須要傳入的參數爲: scrapy
item (Item 對象) : 被爬取的 item
spider (Spider 對象) : 爬取該 item 的 spider ide
該方法會被每個 item pipeline 組件所調用,process_item 必須返回如下其中的任意一個對象:post
一個 dict性能
一個 Item 對象或者它的子類對象
一個 Twisted Deferred 對象
一個 DropItem exception;若是返回此異常,則該 item 將不會被後續的 item pipeline 所繼續訪問 .net
注意:該方法是Item Pipeline必須實現的方法,其它三個方法(open_spider/close_spider/from_crawler)是可選的方法
若是process_item返回了一項數據(item或字典),返回的數據會傳遞給下一級Item Pipeline繼續處理,若是沒有則結束處理。
另外,當process_item在處理某項item時拋出DropItem異常,該項item便會被拋棄,再也不傳遞給後面的Item Pipeline處理,也不會導出到文件。對象
open_spider(self , spider ):——爬蟲啓動時調用
Spider打開時,即處理數據前,會回調該方法。該方法一般用於在開始處理數據前完成一些初始化工做,好比鏈接數據庫。
close_spider(self , spider):——爬蟲關閉時調用
與open_spider相對,爲Spider關閉時,即處理數據後,會回調該方法。該方法一般用於在處理完全部數據以後完成某些清理工做,好比關閉數據庫。
from_crawler(cls, crawler):——也是在爬蟲啓動時調用,可是比open_spider早
建立Item Pipeline對象時回調該類方法。該類方法用來從 Crawler 中初始化獲得一個 pipeline 實例;它必須返回一個新的 pipeline 實例;Crawler 對象提供了訪問全部 Scrapy 核心組件的接口,包括 settings 和 signals
代碼實現
新建bookpipelines.py文件
from scrapy.exceptions import DropItem
from scrapy.item import Item
import pymongo
#實現價格轉換——第一個Item Pipeline,執行順序較次
class PricePipeline(object):
exchange_rate = 8.5309
def process_item(self , item , spider):
price = float(item['price'][1:]) * self.exchange_rate
item['price'] = '¥ %.2f' % price
return item
# 實現去除重複書名的數據——第二個Item Pipeline,執行順序最優
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
#實現將數據存入mongoDB中——第三個Item Pipeline,執行順序最後
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 item
collection.insert_one(post)
return item
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051python爬蟲 第6天 數據清洗 天然語言處理 128頁數據清洗編寫代碼清洗數據數據存儲後再清洗strip() 方法用於移除字符串頭尾指定的字符(默認爲空格)。 string.punctuation 來獲取 Python 全部的標點符天然語言處理馬爾可夫模...--------------------- 做者:chen_you_Nick 來源:CSDN 原文:https://blog.csdn.net/f156207495/article/details/81428011 版權聲明:本文爲博主原創文章,轉載請附上博文連接!