web-dev-qa-db-ja.com

アイテムパイプラインからスクレイピー設定にアクセスする方法

アイテムパイプラインからsettings.pyのスクレイピー設定にアクセスするにはどうすればよいですか。ドキュメントには、拡張機能でクローラーを介してアクセスできると記載されていますが、パイプラインでクローラーにアクセスする方法はわかりません。

30
avaleske

_settings.py_内から(_your_spider.py_で定義されている)Scrapy設定にアクセスする方法は簡単です。他のすべての答えはあまりにも複雑です。この理由は、Scrapyドキュメントのメンテナンスが非常に貧弱で、最近の多くの更新と変更が組み合わされているためです。 「設定」ドキュメントの「 設定へのアクセス方法 」でも、 「設定API」 でも、実用的な例を提供することに煩わされていません。現在のUSER_AGENT文字列を取得する方法の例を示します。

次の行を_your_spider.py_に追加するだけです。

_# To get your settings from (settings.py):
from scrapy.utils.project import get_project_settings
...
class YourSpider(BaseSpider):
    ...
    def parse(self, response):
        ...
        settings = get_project_settings()
        print "Your USER_AGENT is:\n%s" % (settings.get('USER_AGENT'))
        ...
_

ご覧のとおり、_@classmethod_を使用したり、from_crawler()関数や__init__()関数を再定義したりする必要はありません。お役に立てれば。

PS。_from scrapy.settings import Settings_の使用が同じように機能しない理由はまだわかりません。インポート?

27
not2qubit

OK、それで http://doc.scrapy.org/en/latest/topics/extensions.html のドキュメントはそれを言う

Scrapy拡張機能のメインエントリポイント(これにはミドルウェアとパイプラインも含まれます)は、Scrapyクローラーを制御するメインオブジェクトであるCrawlerインスタンスを受け取るfrom_crawlerクラスメソッドです。そのオブジェクトを介して、設定、シグナル、統計にアクセスし、クローラーの動作を制御することもできます(拡張機能で必要な場合)。

したがって、設定を取得する関数を使用できます。

_@classmethod
def from_crawler(cls, crawler):
    settings = crawler.settings
    my_setting = settings.get("MY_SETTING")
    return cls(my_setting)
_

次に、クローラーエンジンは、次のように_my_setting_を使用してパイプラインのinit関数を呼び出します。

_def __init__(self, my_setting):
    self.my_setting = my_setting
_

そして、他の関数は、期待どおりに_self.my_setting_でそれにアクセスできます。

代わりにfrom_crawler()関数で_crawler.settings_オブジェクトを__init__()に渡し、パイプラインから設定にアクセスできます必要に応じて、コンストラクターですべてを引き出す代わりに。

24
avaleske

正解は、パイプラインのどこに設定にアクセスするかによって異なります。

パイプラインの外部の設定にアクセスしたいかのようにavaleskeが回答しましたprocess_itemメソッドですが、ここで設定が必要になる可能性が非常に高いため、Spiderインスタンス自体が引数として渡されるため、はるかに簡単な方法があります。

class PipelineX(object):

    def process_item(self, item, spider):
         wanted_setting = spider.settings.get('WANTED_SETTING')
19
Darian Moody

プロジェクト構造は非常にフラットですが、なぜですか:

# pipeline.py
from myproject import settings
2
timfeirg