Scrapy: Как получить доступ к пользовательским настройкам CLI, переданным из метода __init __ () класса паука? - PullRequest
2 голосов
/ 07 октября 2019

Мне нужно получить доступ к пользовательским настройкам, переданным из интерфейса командной строки, используя:

-s SETTING_NAME="SETTING_VAL" из метода __init __ () класса паука .

get_project_settings() позволяет мне получить доступ только к статическим настройкам.

Документы объясняют, как вы можете получить доступ к этим пользовательским настройкам из конвейера, настраивающего новый конвейер через:

@classmethod
def from_crawler(cls, crawler):
    settings = crawler.settings

Но есть лиспособ получить к ним доступ из __init__() метода паука?

Ответы [ 2 ]

2 голосов
/ 07 октября 2019

Просто используйте settings.get например

print(self.settings.get('SETTING_NAME'))

напечатает

SETTING_VAL

Если вы хотите получить доступ к настройке в вашем пауке __init__ у вас естьпара вариантов. Если параметры командной строки являются просто аргументом spider, используйте -a вместо -s. Если по какой-то причине вам необходим доступ к фактическим настройкам вашего паука __init__, вам необходимо переопределить from_crawler classmethod, как описано в документах .

Вотпример:

import scrapy

class ArgsSpider(scrapy.Spider):
    name = "my_spider"

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        print('kwargs =', kwargs)

    @classmethod
    def from_crawler(cls, crawler, *args, **kwargs):
        spider = cls(
            *args,
            my_setting=crawler.settings.get("MY_SETTING"),
            **kwargs
        )
        spider._set_crawler(crawler)
        return spider

запустите, например, scrapy runspider args_spider.py -s MY_SETTING=hello,world!, и вы увидите настройки в диктовке kwargs. Конечно, вы можете получить и другие настройки таким же образом

0 голосов
/ 08 октября 2019

Ответ @tomjn работает, я просто хочу отметить, что если вы используете расширения или промежуточное программное обеспечение, которым нужен объект для сканирования, вам нужно изменить его фабричный метод следующим образом:

@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
    obj = cls(
        *args,
        my_setting=crawler.settings.get("MY_SETTING"),
        **kwargs
    )
    obj.crawler = crawler
    return obj

Неконечно, если вам нужно это сделать, если вы создаете экземпляр самого паука, но в моем случае, когда я унаследовал его, мой скрипт вылетал с жалобой на отсутствие атрибута сканера, пока я не сделал это таким образом.

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