如何从项目管道访问scrapy设置

ava*_*ske 24 python settings pipeline scrapy

如何从项目管道访问settings.py中的scrapy设置.文档提到可以通过扩展中的爬虫访问它,但我没有看到如何访问管道中的爬虫.

not*_*bit 28

settings.py从内部访问Scrapy设置(如定义)的方法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'))
        ...
Run Code Online (Sandbox Code Playgroud)

如您所见,无需使用@classmethod或重新定义from_crawler()__init__()功能.希望这可以帮助.

PS.我仍然不确定为什么使用from scrapy.settings import Settings不会以相同的方式工作,因为它将是更明显的导入选择?

  • 此方法**不识别[从命令行覆盖]的设置(http://doc.scrapy.org/en/0.24/topics/settings.html#command-line-options).如果您需要此功能,请使用@ avaleske的答案. (4认同)

ava*_*ske 25

好的,所以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)
Run Code Online (Sandbox Code Playgroud)

然后,爬虫引擎调用管道的init函数my_setting,如下所示:

def __init__(self, my_setting):
    self.my_setting = my_setting
Run Code Online (Sandbox Code Playgroud)

self.my_setting正如预期的那样,其他功能可以访问它.

或者,在from_crawler()函数中,您可以将crawler.settings对象传递给__init__(),然后根据需要从管道访问设置,而不是在构造函数中将它们全部拉出.

  • @ user1147688我会使用这种方法,因为它符合基于依赖注入的scrapy内部API.您的建议可能有效,但看起来并不能保证将来会继续使用,因为内部API可能会被移动. (2认同)
  • 这是非常令人困惑的。有人可以解释什么代码进入什么文件吗? (2认同)

Dar*_*ody 19

正确答案是:它取决于您希望访问设置的管道中的哪个位置.

avaleske已回答好像您想要访问管道process_item方法之外的设置,但很可能这是您需要设置的地方,因此当Spider实例本身作为参数传入时,有一种更简单的方法.

class PipelineX(object):

    def process_item(self, item, spider):
         wanted_setting = spider.settings.get('WANTED_SETTING')
Run Code Online (Sandbox Code Playgroud)