【一塊兒學爬蟲】scrapy中的pipline詳解

scrapy中的pipline主要能夠用來:html

  • 清洗爬取到的數據
  • 數據去重
  • 去除無效數據
  • 數據存儲

在定義pipline時,只須要定義一個類並實現process_item(self, item, spider)方法,參數中的item就是爬取到的每個數據對象,spider是爬蟲的實例。該方法主要有兩種返回值:java

  • item對象
  • DropItem 異常:即拋棄當前的item

另外,在自定義的類中還能夠實現下面幾個方法:python

  • open_spider(self, spider):當spider打開的時候該方法會被調用
  • close_spider(self, spider):當spider關閉的時候該方法會被調用
  • from_crawler(cls, crawler):當建立一個pipline實例的時候該方法會被調用,該方法必須返回一個pipline實例對象,通常用於獲取scrapy項目的配置setting中配置的值

自定義pipline

1.數據清洗加工pipline實例面試

from scrapy.exceptions import DropItem

class PricePipeline(object):

    vat_factor = 1.15

    def process_item(self, item, spider):
        if item.get('price'):
            if item.get('price_excludes_vat'):
                item['price'] = item['price'] * self.vat_factor
            return item
        else:
            raise DropItem("Missing price in %s" % item)
複製代碼

若是價格信息沒有缺失的話就進行一些操做,更新該值;不然直接丟棄該item數據庫

2.將數據保存到jsonline文件json

import json

class JsonWriterPipeline(object):

    def open_spider(self, spider):
        self.file = open('items.jl', 'w')

    def close_spider(self, spider):
        self.file.close()

    def process_item(self, item, spider):
        line = json.dumps(dict(item)) + "\n"
        self.file.write(line)
        return item
複製代碼

3.將數據寫到mongdb數據庫 MongoDB 的URI和數據庫名字都配置在Scrapy項目的 settings文件中;scrapy

import pymongo

class MongoPipeline(object):

    collection_name = 'scrapy_items'

    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db

 @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
        )

    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]

    def close_spider(self, spider):
        self.client.close()

    def process_item(self, item, spider):
        self.db[self.collection_name].insert_one(dict(item)) 
        return item  # 依舊須要返回item
複製代碼

4.數據去重ide

from scrapy.exceptions import DropItem

class DuplicatesPipeline(object):

    def __init__(self):
        self.ids_seen = set()

    def process_item(self, item, spider):
        if item['id'] in self.ids_seen:
            raise DropItem("Duplicate item found: %s" % item)
        else:
            self.ids_seen.add(item['id'])
            return item
複製代碼

pipline的使用

寫好pipline後咱們須要使pipline生效,咱們須要把pipline類配置到setting文件中:學習

ITEM_PIPELINES = {
    'myproject.pipelines.PricePipeline': 300,
    'myproject.pipelines.JsonWriterPipeline': 800,
}
複製代碼

後面的300、800表示的是優先級,數字值越小,優先級越高,優先級高的pipline優先被調用大數據


另外,scrapy中還有middleware的概念,它主要是用來操做request和response的,例如配置代理:

有關middleware的詳細介紹能夠查看 官網的介紹

資料分享

java學習筆記、10T資料、100多個java項目分享


歡迎關注我的公衆號【菜鳥名企夢】,公衆號專一:互聯網求職面經javapython爬蟲大數據等技術分享**: 公衆號菜鳥名企夢後臺發送「csdn」便可免費領取【csdn】和【百度文庫】下載服務; 公衆號菜鳥名企夢後臺發送「資料」:便可領取5T精品學習資料java面試考點java面經總結,以及幾十個java、大數據項目資料很全,你想找的幾乎都有

掃碼關注,及時獲取更多精彩內容。(博主今日頭條大數據工程師)
相關文章
相關標籤/搜索