Как передать пользовательский аргумент в scrapy spider

Я пытаюсь передать аргумент, определяемый пользователем, в scrapy spider. Может ли кто-нибудь предложить, как это сделать?

Я читал о параметре -a где-то, но понятия не имею, как его использовать.

Ответ 1

Аргументы паука передаются в команде crawl с использованием опции -a. Например:

scrapy crawl myspider -a category=electronics -a domain=system

Пауки могут обращаться к аргументам как к атрибутам:

class MySpider(scrapy.Spider):
    name = 'myspider'

    def __init__(self, category='', **kwargs):
        self.start_urls = [f'http://www.example.com/{category}']  # py36
        super().__init__(**kwargs)  # python3

    def parse(self, response)
        self.log(self.domain)  # system

Взято из документа Scrapy: http://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments

Обновление 2013: добавить второй аргумент

Обновление 2015: скорректировать формулировку

Обновление 2016: используйте новый базовый класс и добавьте супер, спасибо @Birla

Обновление 2017: используйте Python3 super

# previously
super(MySpider, self).__init__(**kwargs)  # python2

Обновление 2018: как указывает @eLRuLL, пауки могут обращаться к аргументам как к атрибутам

Ответ 2

Предыдущие ответы были правильными, но вам не нужно объявлять конструктор (__init__) каждый раз, когда вы хотите закодировать паук-спайдер, вы можете просто указать параметры как раньше:

scrapy crawl myspider -a parameter1=value1 -a parameter2=value2

и в вашем коде паука вы можете просто использовать их как аргументы паука:

class MySpider(Spider):
    name = 'myspider'
    ...
    def parse(self, response):
        ...
        if self.parameter1 == value1:
            # this is True

        # or also
        if getattr(self, parameter2) == value2:
            # this is also True

И он просто работает.

Ответ 3

Для передачи аргументов с помощью команды сканирования

myspider сканирования scrapy -a category = 'mycategory' -a domain = 'example.com'

Чтобы передать аргументы для запуска на scrapyd, замените -a на -d

curl http://your.ip.address.here:port/schedule.json -d spider = myspider -d category = 'mycategory' -d domain = 'example.com'

Паук получит аргументы в своем конструкторе.


class MySpider(Spider):
    name="myspider"
    def __init__(self,category='',domain='', *args,**kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.category = category
        self.domain = domain

Scrapy помещает все аргументы как атрибуты паука, и вы можете полностью пропустить метод init. Остерегайтесь использовать метод getattr для получения этих атрибутов, чтобы ваш код не ломался.


class MySpider(Spider):
    name="myspider"
    start_urls = ('https://httpbin.org/ip',)

    def parse(self,response):
        print getattr(self,'category','')
        print getattr(self,'domain','')

Ответ 4

Аргументы Spider передаются во время выполнения команды обхода с использованием опции -a. Например, если я хочу передать доменное имя в качестве аргумента моему пауку, тогда я сделаю это -

scrapy crawl myspider -a domain = "http://www.example.com"

И получить аргументы в конструкторах пауков:

class MySpider(BaseSpider):
    name = 'myspider'
    def __init__(self, domain='', *args, **kwargs):
        super(MySpider, self).__init__(*args, **kwargs)
        self.start_urls = [domain]
        #

...

он будет работать:)