Какой самый простой способ иметь «профили настроек» в Scrapy? - PullRequest
1 голос
/ 13 марта 2019

Scrapy выбирает настройки из settings.py (есть настройки по умолчанию, настройки проекта, а также настройки для каждого паука). То, что я ищу, - это возможность иметь более одного файла с настройками и возможность переключаться между ними при быстром запуске моих пауков. Если между файлами есть какое-то наследование, это тоже было бы здорово.

Если вы знаете Spring Boot из мира Java, есть идея профиля. У вас есть файл 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 ]

2 голосов
/ 14 марта 2019

Во-первых, если вы собираетесь изменить только одно или два значения, тогда было бы проще использовать одну динамическую settings.py (как упомянуто в ответ Галлайо * ).

Однако, если вам действительно нужны отдельные настройки, существует еще более короткий путь, определяя отдельные «проекты» в scrapy.cfg ( документы ):

[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 ( пример ).

1 голос
/ 14 марта 2019

Я считаю, что SCRAPY_SETTINGS_MODULE - лучший подход.

В качестве альтернативы, поскольку модуль настроек представляет собой скрипт Python, вы можете динамически изменять настройки из settings.py.Я видел, как это было сделано, например, чтобы автоматически определять, работает ли паук на локальном компьютере или на сервере Scrapyd, и соответствующим образом изменять настройки во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...