Scrapy:如何从蜘蛛 class 的 __init__() 方法访问自定义的 CLI 传递设置?

Scrapy: How to access the custom, CLI passed settings from the __init__() method of a spider class?

我需要使用以下方法访问从 CLI 传递的自定义设置:

-s SETTING_NAME="SETTING_VAL" 来自蜘蛛的__init__()方法class.

get_project_settings() 只允许我访问静态设置。

文档解释了如何通过以下方式从管道设置新管道来访问这些自定义设置:

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

但是有什么方法可以从 __init__() 蜘蛛方法访问它们吗?

只需使用 settings.get 例如

print(self.settings.get('SETTING_NAME'))

将打印

SETTING_VAL

如果你想访问蜘蛛程序中的设置__init__,你有几个选择。如果您的命令行选项只是一个 spider 参数,请使用 -a 而不是 -s。如果由于某种原因你需要在你的蜘蛛 __init__ 中访问实际设置,那么你必须按照 docs.

中所述覆盖 from_crawler classmethod

这是一个例子:

import scrapy

class ArgsSpider(scrapy.Spider):
    name = "my_spider"

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        print('kwargs =', kwargs)

    @classmethod
    def from_crawler(cls, crawler, *args, **kwargs):
        spider = cls(
            *args,
            my_setting=crawler.settings.get("MY_SETTING"),
            **kwargs
        )
        spider._set_crawler(crawler)
        return spider

运行 例如scrapy runspider args_spider.py -s MY_SETTING=hello,world! 你会在 kwargs 字典中看到你的设置。您当然也可以通过这种方式获得其他设置

@tomjn 的答案有效,我只是想指出,如果您使用需要爬虫对象的扩展或中间件,您需要这样修改他的工厂方法:

@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
    obj = cls(
        *args,
        my_setting=crawler.settings.get("MY_SETTING"),
        **kwargs
    )
    obj.crawler = crawler
    return obj

不确定如果实例化蜘蛛本身是否需要这样做,但就我而言,当我继承它时,我的脚本会崩溃并抱怨缺少爬虫属性,直到我这样做为止。

None 的响应在使用 CrawlSpider 时有效,因为 _follow_links 等方法将丢失。

以下代码有效:

@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
    spider = super().from_crawler(
            crawler,
            *args,
            some_arg=crawler.settings.get("SOME_ARG"), **kwargs
    )
    return spider