アイテムパイプラインからsettings.pyのスクレイピー設定にアクセスするにはどうすればよいですか。ドキュメントには、拡張機能でクローラーを介してアクセスできると記載されていますが、パイプラインでクローラーにアクセスする方法はわかりません。
_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
_の使用が同じように機能しない理由はまだわかりません。インポート?
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__()
に渡し、パイプラインから設定にアクセスできます必要に応じて、コンストラクターですべてを引き出す代わりに。
正解は、パイプラインのどこに設定にアクセスするかによって異なります。
パイプラインの外部の設定にアクセスしたいかのようにavaleskeが回答しましたprocess_item
メソッドですが、ここで設定が必要になる可能性が非常に高いため、Spiderインスタンス自体が引数として渡されるため、はるかに簡単な方法があります。
class PipelineX(object):
def process_item(self, item, spider):
wanted_setting = spider.settings.get('WANTED_SETTING')
プロジェクト構造は非常にフラットですが、なぜですか:
# pipeline.py
from myproject import settings