如何从项目管道访问 settings.py 中的scrapy设置。文档中提到可以通过扩展中的爬虫访问它,但我看不到如何访问管道中的爬虫。
4 回答
更新 (2021-05-04)
请注意,这个答案现在已经有 7 年的历史了,所以它的有效性不再得到保证。此外,它使用 Python2
从内部访问您的 Scrapy 设置(如 定义settings.py
)的your_spider.py
方法很简单。所有其他答案都太复杂了。其原因是 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()
or__init__()
函数。希望这可以帮助。
PS。我仍然不确定为什么 usingfrom scrapy.settings import Settings
不能以同样的方式工作,因为这将是更明显的导入选择?
好的,所以http://doc.scrapy.org/en/latest/topics/extensions.html上的文档说
Scrapy 扩展(也包括中间件和管道)的主要入口点是 from_crawler 类方法,它接收 Crawler 实例,该实例是控制 Scrapy 爬虫的主要对象。通过该对象,您可以访问设置、信号、统计信息,还可以控制爬虫的行为,如果您的扩展程序需要这样的话。
所以你可以有一个功能来获取设置。
@classmethod
def from_crawler(cls, crawler):
settings = crawler.settings
my_setting = settings.get("MY_SETTING")
return cls(my_setting)
然后爬虫引擎使用 调用管道的 init 函数my_setting
,如下所示:
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