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

时间:2012-12-28 21:19:39

标签: python scrapy settings pipeline

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

4 个答案:

答案 0 :(得分:26)

settings.py中访问Scrapy设置(如your_spider.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不能以同样的方式工作,因为它会是更明显的导入选择?

答案 1 :(得分:24)

好的,所以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)

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

def __init__(self, my_setting):
    self.my_setting = my_setting

其他功能可以按预期使用self.my_setting访问它。

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

答案 2 :(得分:17)

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

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

class PipelineX(object):

    def process_item(self, item, spider):
         wanted_setting = spider.settings.get('WANTED_SETTING')

答案 3 :(得分:2)

项目结构相当平坦,为什么不呢:

# pipeline.py
from myproject import settings