Scrapy Item Pipeline

参考資料

Item Pipeline — Scrapy 1.5.1 documentation

バージョン

  • Python 3.6.5

  • Scrapy 1.5.1

  • pymongo 3.7.2

概要

spiderによって取得したアイテムは Item Pipelineへ送られる。 Item Pipelineには主に4つの役割がある。

  • HTMLデータを整理する
  • データのvalidationを行う
  • データにダブりがないか確認して、あれば弾く。
  • DBにアイテムを保存する。

pipelineクラスは四つのメソッドによって実装する。

process_item(self, item, spider)

このメソッドは全てのpipelineコンポーネントで呼び出される。

このメソッドはスパイダーが取得したitemをdict型なり、下位のオブジェクトなりデータベースに適した形に整形する役割を持っている。

    open_spider(self, spider)

このメソッドはspiderが開始されたときに呼び出される。

close_spider(self, spider)

このメソッドはspiderが終了したときに呼び出される。

from_crawler(cls, crawler)

このメソッドが宣言されている場合はcrawler本体からpipelineクラスを呼び出し、そのインスタンスを作ることができる。これがpipelineとその他のコンポーネントとの通路のような役割を果たす。

具体例

下記はmongoDBと接続する時の例。

# 1
import pymongo

class MongoPipeline(object):
    # 2
    collection_name = 'scrapy_items'

    # 3
    def __init__(self, mongo_uri, mongo_db):
        self.mongo_uri = mongo_uri
        self.mongo_db = mongo_db
    # 4
    @classmethod
    def from_crawler(cls, crawler):
        return cls(
            mongo_uri=crawler.settings.get('MONGO_URI'),
            mongo_db=crawler.settings.get('MONGO_DATABASE', 'items')
        )
    # 5
    def open_spider(self, spider):
        self.client = pymongo.MongoClient(self.mongo_uri)
        self.db = self.client[self.mongo_db]
    # 6
    def close_spider(self, spider):
        self.client.close()
    # 7
    def process_item(self, item, spider):
        self.db[self.collection_name].insert_one(dict(item))
        return item
  1. pymongoを利用してmongoDBと接続する。
  2. collection_nameはitemクラスの名前がつけられる。
  3. 初期化メソッドnewで呼ばれる。3で説明。
  4. from_crawlerメソッド。crawler本体で呼ばれるメソッド。ここでこのクラスのインスタンスが作られる。内部的にsettingsファイルから変数MONGO_URIとMONGO_DATABASEを取ってきてそれを2番のようにアクセサメソッドとして格納。
  5. 2/3の設定を使ってmongoDBに入場。
  6. mongoDBから退場。
  7. process_itemメソッド。ここでmongoDBにitemがうまく入るように整形。dbとその中のitemクラスを指定して引数のitemを辞書型に変換してinsertしている。

その他

activating-an-item-pipeline-component (重要)

これを設定しないとコンポーネント自体が動かない。

Item Pipeline — Scrapy 1.5.1 documentation

pythonインスタンスメソッドとクラスメソッド

@classmethodとは?第一引数がselfのメソッドはインスタンスメソッド。インスタンスメソッドはその名の通り作られたインスタンスに持たせるメソッド。クラスメソッドはクラスが持っているメソッド。ここではmongo_uriとmongo_dbの二つのアクセサメソッドをもつクラスを返すメソッドが定義されている。

pymongo

Installing / Upgrading — PyMongo 3.7.2 documentation

pymongo-3.7.2をインストール。インストール時のメッセージ特になし。