繁体   English   中英

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"来自蜘蛛 class 的 __init__() 方法

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

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

@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__中的实际设置,那么您必须按照文档中的描述覆盖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 的答案是有效的,我只想指出,如果您使用需要爬虫 object 的扩展或中间件,您需要这样更改他的工厂方法:

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

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

使用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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM