如何實現item pipeline
乙個item pipeline不需要繼承特定基類,只需要實現某些特定方法,如process_item、open_spider、close_spider等。
process_item(item , spider):
每個 item pipeline 元件都需要呼叫該方法,這個方法必須返回乙個 item (或任何繼承類)物件, 或是丟擲 dropitem 異常,被丟棄的 item 將不會被之後的 pipeline 元件所處理
需要傳入的引數為:
item (item 物件) : 被爬取的 item
spider (spider 物件) : 爬取該 item 的 spider
該方法會被每乙個 item pipeline 元件所呼叫,process_item 必須返回以下其中的任意乙個物件:
乙個 dict
乙個 item 物件或者它的子類物件
乙個 twisted deferred 物件
乙個 dropitem exception;如果返回此異常,則該 item 將不會被後續的 item pipeline 所繼續訪問
注意:該方法是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
如何用軟文推廣
如何用軟文推廣呢?2 作為 魚餌 讓客戶通過付出一些行動,比如幫忙推廣10個ip,或者通過加qq,留下郵箱 手機號等方式,獲得大量的精準潛在客戶資料庫,最大化軟文的效率。高質量軟文製作技巧 寫作軟文前,一定要做好規劃,明確軟文推廣要達到的目的,了解消費者的對產品的各種問題和顧慮,針對性的提出解決方案...
如何用gitbook寫書
生成一本小書,它有前言,章節1,章節2,後記。例如 簡介 第一章 如何造火箭 1.燃料學 2.空氣動力學 3.工程學 第二章 如何 火箭 1.自動控制原理 2.二次利用要點 結束建乙個寫書的目錄,以後所有工作都在這個目錄下搞。例如 users raywill gitbook first在電腦上建立整...
如何用好Google?
如何提高自己的搜尋技術?男性凱格爾運動 掌握搜尋邏輯和搜尋思路。願意為優質的付費是高效的解決問題思路。盡量少使用搜尋引擎 針對不同的問題使用不同的資料庫。搜尋心法 找什麼 找 怎麼找。搜尋技巧 遇到問題 第一件事就是搜尋 搜尋。搜尋也是可以轉變思維方式 書友沙龍 可直接看轉化為 樊登讀書會 舉辦的讀...