Как получить доступ к настройкам scrapy из пункта Pipeline - программирование
Подтвердить что ты не робот

Как получить доступ к настройкам scrapy из пункта Pipeline

Как получить доступ к настройкам scrapy в settings.py из конвейера элементов. В документации упоминается, что к нему можно получить доступ через искатель в расширениях, но я не вижу, как обращаться к искателю в конвейерах.

4b9b3361

Ответ 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