如何从项目管道访问scrapy设置
Posted
技术标签:
【中文标题】如何从项目管道访问scrapy设置【英文标题】:How to access scrapy settings from item Pipeline 【发布时间】:2012-12-14 02:21:47 【问题描述】:如何从项目管道访问 settings.py 中的scrapy设置。文档中提到可以通过扩展中的爬虫访问它,但我没有看到如何访问管道中的爬虫。
【问题讨论】:
【参考方案1】:好的,所以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
吗?
@user1147688 我会使用这个方法,因为它符合scrapy的基于依赖注入的内部API。您的建议可能有效,但似乎无法保证它在未来会继续有效,因为内部 API 可能会被转移。
@avaleske,这很棒,但是您知道我们如何使用它来设置设置吗?例如,在其他一些功能中,假设我想更改其中一个设置值,例如download_delay
。我们能做到吗?
这很令人困惑。有人能解释一下什么代码进入什么文件吗?
在项目管道中添加上述代码后,我得到(False, <twisted.python.failure.Failure builtins.AttributeError: 'FilesDownloadPipeline' object has no attribute 'crawler'>)
class FilesDownloadPipeline(FilesPipeline)
【参考方案2】:
更新 (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 的方法,但我仍然更喜欢这种方式,因为它有效且易于理解。 此方法没有识别overridden from the command line的设置。如果您需要此功能,请使用@avaleske 的答案。 另外,您不会让设置被蜘蛛覆盖【参考方案3】:正确答案是:这取决于您希望在管道中的哪个位置访问设置。
avaleske 的回答好像您想访问管道之外的设置 process_item
方法,但很可能这是您需要设置的地方,因此当 Spider 实例本身通过时,有一种更简单的方法in 作为参数。
class PipelineX(object):
def process_item(self, item, spider):
wanted_setting = spider.settings.get('WANTED_SETTING')
【讨论】:
很好的答案。对于我的项目,将逻辑放入open_spider
方法更有意义,因为我只在蜘蛛第一次加载时使用该值。【参考方案4】:
项目结构很扁平,为什么不呢:
# pipeline.py
from myproject import settings
【讨论】:
然后你每次开始一个新的时候都会改变myproject
你不会让设置被蜘蛛覆盖以上是关于如何从项目管道访问scrapy设置的主要内容,如果未能解决你的问题,请参考以下文章