【问题标题】:What's the easiest way to have "settings profiles" in Scrapy?在 Scrapy 中拥有“设置配置文件”的最简单方法是什么?
【发布时间】:2019-03-13 16:57:32
【问题描述】:

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

【问题讨论】:

    标签: scrapy


    【解决方案1】:

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

    但是,如果您确实需要单独的设置,还有更短的方法,即在 scrapy.cfg (docs) 中定义单独的“项目”:

    [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)。

    【讨论】:

    • 非常好的答案!正是我想要的!非常感谢!
    【解决方案2】:

    我相信SCRAPY_SETTINGS_MODULE 是最好的方法。

    另外,由于设置模块是 Python 脚本,您可以在 settings.py 中动态更改设置。我已经看到这样做了,例如,自动检测蜘蛛是在本地机器上还是在 Scrapyd 服务器上运行,并在运行时相应地调整设置。

    【讨论】:

    • 非常感谢!这是一个我没有想到的好主意。
    猜你喜欢
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多