33

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

4

4 回答 4

37

更新 (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不能以同样的方式工作,因为这将是更明显的导入选择?

于 2014-01-06T19:28:21.947 回答
28

好的,所以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__(),然后根据需要从管道访问设置,而不是在构造函数中将它们全部取出。

于 2012-12-28T21:19:39.267 回答
22

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

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

class PipelineX(object):

    def process_item(self, item, spider):
         wanted_setting = spider.settings.get('WANTED_SETTING')
于 2014-02-12T17:35:52.550 回答
3

项目结构很扁平,为什么不呢:

# pipeline.py
from myproject import settings
于 2014-11-28T07:38:44.287 回答