Как получить доступ к настройкам scrapy в settings.py из конвейера элементов. В документации упоминается, что к нему можно получить доступ через искатель в расширениях, но я не вижу, как обращаться к искателю в конвейерах.
Как получить доступ к настройкам scrapy из пункта Pipeline
Ответ 1
Способ доступа к настройкам Scrapy (как определено в settings.py
) из your_spider.py
прост. Все остальные ответы слишком сложны. Причиной этого является очень плохое обслуживание документации Scrapy в сочетании со многими последними обновлениями и изменениями. Ни в документации "Настройки" Как получить доступ к настройкам, ни в API настроек они потрудились дать какой-нибудь практичный пример. Вот пример, как получить текущую строку USER_AGENT.
Просто добавьте следующие строки в your_spider.py
:
# To get your settings from (settings.py):
from scrapy.utils.project import get_project_settings
...
class YourSpider(BaseSpider):
...
def parse(self, response):
...
settings = get_project_settings()
print "Your USER_AGENT is:\n%s" % (settings.get('USER_AGENT'))
...
Как вы можете видеть, нет необходимости использовать @classmethod
или переопределить функции from_crawler()
или __init__()
. Надеюсь, это поможет.
PS. Я все еще не уверен, почему использование from scrapy.settings import Settings
не работает одинаково, так как это был бы более очевидный выбор импорта?
Ответ 2
Итак, документация в http://doc.scrapy.org/en/latest/topics/extensions.html говорит, что
Основная точка входа для расширения Scrapy (это также включает middlewares и pipelines) - метод класса from_crawler, который получает экземпляр Crawler, который является основным объектом, управляющим Скальпинг. Через этот объект вы можете получить доступ к настройкам, сигналам, статистика, а также управлять поведением искателя, если требуется расширение к такому веществу.
Итак, вы можете получить функцию для получения настроек.
@classmethod
def from_crawler(cls, crawler):
settings = crawler.settings
my_setting = settings.get("MY_SETTING")
return cls(my_setting)
Затем движок искателя вызывает функцию init init конвейера с помощью my_setting
, например:
def __init__(self, my_setting):
self.my_setting = my_setting
И другие функции могут получить к нему доступ с self.my_setting
, как и ожидалось.
Альтернативно, в функции from_crawler()
вы можете передать объект crawler.settings
на __init__()
, а затем получить доступ к настройкам из конвейера по мере необходимости, а не вытаскивать их из конструктора.
Ответ 3
Правильный ответ: это зависит от того, где в конвейере вы хотите получить доступ к настройкам.
avaleske ответил так, как будто вы хотели получить доступ к настройкам за пределами метода process_item
вашего конвейера, но, скорее всего, это именно то, где вы захотите установить этот параметр, и, следовательно, есть гораздо более простой способ, с помощью которого сам экземпляр Spider в качестве аргумента.
class PipelineX(object):
def process_item(self, item, spider):
wanted_setting = spider.settings.get('WANTED_SETTING')
Ответ 4
структура проекта довольно плоская, почему бы и нет:
# pipeline.py
from myproject import settings
Ответ 5
Вот хороший пример подхода @avaleske из документов:
https://docs.scrapy.org/en/latest/topics/item-pipeline.html#write-items-to-mongodb