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


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

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

4 70

4 ответа:

аргументы Spider передаются в С помощью . Например:

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 doc:http://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments

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

обновление 2015: измените формулировку

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

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

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

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

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

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

и это просто работает.

аргументы 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]
        #

...

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

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

scrapy crawl myspider-a category= 'mycategory' - a domain='example.com'

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

curl http://your.интеллектуальная собственность.адрес.здесь:порт/расписание.json - d spider=myspider-D категория= 'mycategory' - D домен='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','')