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

Mak*_*ski 2 scrapy

Scrapy 从 settings.py 中获取设置(还有默认设置、项目设置、每个蜘蛛设置)。我正在寻找的是能够拥有多个带有设置的文件,并且能够在我快速启动我的蜘蛛时在它们之间切换。如果文件之间有一些继承,那也会很棒。

如果您从 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
Run Code Online (Sandbox Code Playgroud)

mal*_*rts 6

首先,如果您只想更改一两个值,那么使用单个动态会更简单settings.py(如Gallaecio 的回答中所述)。

但是,如果您确实需要单独的设置,则可以通过在scrapy.cfg( docs ) 中定义单独的“项目”来缩短方法:

[settings]
default = myproject.settings.dev
dev = myproject.settings.dev
prod = myproject.settings.prod
Run Code Online (Sandbox Code Playgroud)

然后运行一个特定的:

SCRAPY_PROJECT=prod scrapy crawl myspider
SCRAPY_PROJECT=dev scrapy crawl myspider
Run Code Online (Sandbox Code Playgroud)

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


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

myproject/settings/__init__.py
myproject/settings/base.py
myproject/settings/dev.py
myproject/settings/prod.py
Run Code Online (Sandbox Code Playgroud)

base.py你可以拥有你所拥有的settings.py。然后在每个覆盖文件的顶部添加:

from .base import *

# Override settings in the same way as if they were declared in settings.py
Run Code Online (Sandbox Code Playgroud)

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