【发布时间】:2012-12-14 02:21:47
【问题描述】:
如何从项目管道访问 settings.py 中的scrapy设置。文档中提到可以通过扩展中的爬虫访问它,但我没有看到如何访问管道中的爬虫。
【问题讨论】:
标签: python scrapy settings pipeline
如何从项目管道访问 settings.py 中的scrapy设置。文档中提到可以通过扩展中的爬虫访问它,但我没有看到如何访问管道中的爬虫。
【问题讨论】:
标签: python scrapy settings pipeline
好的,所以http://doc.scrapy.org/en/latest/topics/extensions.html 的文档说
Scrapy 扩展的主要入口点(这也包括 中间件和管道)是 from_crawler 类方法 接收一个 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__(),然后根据需要从管道访问设置,而不是在构造函数中将它们全部取出。
【讨论】:
from scrapy.settings import Settings吗?
download_delay。我们能做到吗?
(False, <twisted.python.failure.Failure builtins.AttributeError: 'FilesDownloadPipeline' object has no attribute 'crawler'>)class FilesDownloadPipeline(FilesPipeline)
更新 (2021-05-04)
请注意,这个答案现在已经有大约 7 年的历史了,因此无法再保证其有效性。另外它使用的是 Python2
从your_spider.py 中访问您的 Scrapy 设置(在settings.py 中定义)的方法很简单。所有其他答案都太复杂了。其原因是 Scrapy 文档的维护非常差,以及最近的许多更新和更改。在“设置”文档“How to access settings”和"Settings 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 不能以相同的方式工作,因为它会是更明显的导入选择?
【讨论】:
正确答案是:这取决于您希望在管道中的哪个位置访问设置。
avaleske 的回答好像您想访问管道之外的设置 process_item 方法,但很可能这是您需要设置的地方,因此当 Spider 实例本身通过时,有一种更简单的方法in 作为参数。
class PipelineX(object):
def process_item(self, item, spider):
wanted_setting = spider.settings.get('WANTED_SETTING')
【讨论】:
open_spider 方法更有意义,因为我只在蜘蛛第一次加载时使用该值。
项目结构很扁平,为什么不呢:
# pipeline.py
from myproject import settings
【讨论】:
myproject