在Scrapy中拥有“设置配置文件”的最简单方法是什么?

时间:2019-03-13 16:57:33

标签: scrapy

Scrapy从settings.py中获取设置(还有默认设置,项目设置,每个蜘蛛设置)。我要寻找的是能够拥有多个具有设置的文件,并且能够在我快速启动Spider时在它们之间切换。如果文件之间存在某种继承,那就太棒了。

如果您从Java世界了解Spring Boot,那么就有一个配置文件的想法。您有带有基本设置的application.settings文件。然后,您可以拥有application-dev.settings和application-prod.settings。如果使用选项-Dspring.profiles.active = dev运行应用程序,则它将选择application.settings并在其之上添加application-dev.settings。这样,您可以并行维护多个配置并在它们之间快速切换。

我发现了不需要支持代码的Scrapy方法。方法是使用SCRAPY_SETTINGS_MODULE并将基本设置文件导入我的dev和prod模块中。您还使用其他方法吗?

在我的情况下,启动行如下所示:

export SCRAPY_SETTINGS_MODULE=projectname.profiles.dev && scrapy crawl myspider

2 个答案:

答案 0 :(得分:2)

首先,如果仅要更改一个或两个值,则使用单个动态settings.py(如Gallaecio's answer中所述)会更简单。

但是,如果您确实需要单独的设置,则可以在scrapy.cfgdocs)中定义单独的“项目”,这是更短的方法:

[settings]
default = myproject.settings.dev
dev = myproject.settings.dev
prod = myproject.settings.prod

然后运行一个特定的

SCRAPY_PROJECT=prod scrapy crawl myspider
SCRAPY_PROJECT=dev scrapy crawl myspider

如果您未指定SCRAPY_PROJECT,它将使用default


是的,您可以从设置文件继承。将您的settings.py文件替换为模块:

myproject/settings/__init__.py
myproject/settings/base.py
myproject/settings/dev.py
myproject/settings/prod.py

base.py中,您可以完全拥有settings.py中的内容。然后在每个替代文件的顶部添加:

from .base import *

# Override settings in the same way as if they were declared in settings.py

通配符导入通常不是一个好习惯,但是在这种情况下,因为它只是一个普通的Python文件,所以最终结果就是所有变量都可用。这是我们在Django(example)中经常使用的技巧。

答案 1 :(得分:1)

我相信SCRAPY_SETTINGS_MODULE是最好的方法。

或者,由于设置模块是Python脚本,因此您可以从settings.py内部动态更改设置。我已经看到了这一点,例如,可以自动检测蜘蛛是在本地计算机上运行还是在Scrapyd服务器上运行,并在运行时相应地调整设置。