使用多种配置启动Scrapyd

1 投票
2 回答
623 浏览
提问于 2025-04-18 06:24

我正在开发一个Scrapy应用程序,想根据不同的环境(比如开发环境和生产环境)使用不同的配置。我的问题是,有些设置我不太确定该怎么设置。例如,如果我需要配置数据库,在开发环境中应该是"localhost",而在生产环境中则需要设置成另一个地址。

我该如何在执行scrapy deploy时指定这些设置呢?我可以在命令行中用变量来设置它们吗?

2 个回答

0

你可以参考下面这个链接里的答案:

https://alanbuxton.wordpress.com/2018/10/09/using-local-settings-in-a-scrapy-project/

我在这里复制一下,方便快速查看:

编辑settings.py文件,让它根据SCRAPY_ENV这个环境变量来读取不同的设置文件。

把所有的设置文件移动到一个单独的配置目录里(同时修改scrapy.cfg文件,让它知道去哪里找这些设置)。

设置的关键部分在settings.py的最后:

from importlib import import_module
from scrapy.utils.log import configure_logging
import logging
import os

SCRAPY_ENV=os.environ.get('SCRAPY_ENV',None)
if SCRAPY_ENV == None:
    raise ValueError("Must set SCRAPY_ENV environment var")
logger = logging.getLogger(__name__)
configure_logging({'LOG_FORMAT': '%(levelname)s: %(message)s'})

# Load if file exists; incorporate any names started with an
# uppercase letter into globals()
def load_extra_settings(fname):
    if not os.path.isfile("config/%s.py" % fname):
        logger.warning("Couldn't find %s, skipping" % fname)
        return
    mdl=import_module("config.%s" % fname)
    names = [x for x in mdl.__dict__ if x[0].isupper()]
    globals().update({k: getattr(mdl,k) for k in names})

load_extra_settings("secrets")
load_extra_settings("secrets_%s" % SCRAPY_ENV)
load_extra_settings("settings_%s" % SCRAPY_ENV)  

然后在你想要获取设置中定义的变量的Python文件里,使用以下代码:

from scrapy.utils.project import get_project_settings
settings = get_project_settings()
env_variable = settings.get('ENV_VARIABLE')
1

你应该在你的 scrapy.cfg 文件中设置部署选项。例如:

[deploy:dev]
url = http://dev_url/

[deploy:production]
url = http://production_url/

这样的话,你就可以执行:

scrapyd-deploy def

或者

scrapyd-deploy production

撰写回答