如何从项目管道访问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设置的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个 Scrapy 项目中为不同的蜘蛛使用不同的管道

python爬虫从0到1 - Scrapy框架的实战应用

pycharm 下scrapy项目

我应该创建管道以使用scrapy保存文件吗?

常用的scrapy setting

#yyds干货盘点# python scrapy 管道学习,并拿在行练手爬虫项目