無駄と文化

実用的ブログ

Scrapy の Item Pipeline の中で settings を参照する for v1.0.3

最近はPython書いてます。


さて、settings.py に記述したカスタムの設定をItem Pipelineで使いましょう。
Scrapyのバージョンは1.0.3を想定しています。

まぁ、公式ドキュメントのサンプルそのままなんですけど。


まずは settings.py に適当に書く

ssettings.py

# -*- coding: utf-8 -*-

# Scrapy settings for sample project
#
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
#
#     http://doc.scrapy.org/en/latest/topics/settings.html
#     http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
#     http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html

BOT_NAME = 'sample'

# ... 中略 ...

# カスタム設定
FOO = "foo_value"


Item Pipeline に渡す

pipeline.py の中でfrom_crawler()を定義して、Crawlerが持っているsettingsを受け取る。
そしてItem Pipelineに渡す。

pipeline.py

# -*- coding: utf-8 -*-

# Scrapy 1.0.3

class SamplePipeline(object):
    def __init__(self, settings):
        # __init__() の引数に settings を追加して
        # from_crawler() から受け取る

        # そして使う
        self.foo = settings["FOO"]

        # あんまり良くないけど settings をまるごと
        # インスタンス変数にしちゃうこともできる
        self.settings = settings

    @classmethod
    def from_crawler(cls, crawler):
        settings = crawler.settings

        # cls() を呼び出して __init__() に受け渡す
        # あんまり良くないけど crawler.settings をまるごと渡しちゃう
        return cls(settings)

    def process_item(self, item, spider):
        print self.foo             # => foo_value

        print self.settings["FOO"] # => foo_value

        return item

いい感じですね。


取り急ぎ、私からは以上です。