如何从项目管道访问settings.py中的scrapy设置。该文档提到可以通过扩展中的爬虫访问它,但我看不到如何在管道中访问爬虫。
答案 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)
正确答案是:它取决于您希望访问设置的管道中的哪个位置。
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