使用多种配置启动Scrapyd

时间:2014-05-13 11:30:33

标签: python scrapy scrapyd

我尝试使用多种配置来开发我的Scrapy应用程序,具体取决于我的环境(例如开发,生产)。我的问题是,有些设置我不确定如何设置它们。例如,如果我必须设置我的数据库,那么在开发中应该是"localhost"并且在生产中必须是另一个。

如何在scrapy deploy进行操作时指定这些设置?我可以在命令行中使用变量设置它们吗?

2 个答案:

答案 0 :(得分:1)

您应该在scrapy.cfg文件中设置deploy选项。例如:

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

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

有了这个,你可以这样做:

scrapyd-deploy def

scrapyd-deploy production

答案 1 :(得分: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')