[英]Python (Scrapy) - How can call a self object from __init__ to a custom_settings?
[英]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.