Jak przekazać argument zdefiniowany przez użytkownika w Scrappy spider

Próbuję przekazać argument zdefiniowany przez użytkownika do Scrappy ' ego pająka. Czy ktoś może zasugerować Jak to zrobić?

Czytałem gdzieś o parametrze -a, ale nie mam pojęcia, jak go użyć.

Author: Kara, 2013-03-25

4 answers

Argumenty pająka są przekazywane w Komendzie crawl przy użyciu opcji -a. Na przykład:

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

Pająki mogą uzyskać dostęp do argumentów jako atrybutów:

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

Wzięte z Scrappy doc: http://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments

Aktualizacja 2013 : dodaj drugi argument

Aktualizacja 2015 : Dostosuj sformułowanie

Update 2016: użyj nowszej klasy bazowej i dodaj super, dzięki @ Birla

Aktualizacja 2017: użyj Python3 super

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

Update 2018: jak wskazuje @ eLRuLL, pająki mogą uzyskać dostęp do argumentów jako atrybutów

 126
Author: Steven Almeroth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-19 21:38:53

Poprzednie odpowiedzi były poprawne, ale nie musisz deklarować konstruktora (__init__) za każdym razem, gdy chcesz kodować Scrappy ' ego pająka, możesz po prostu określić parametry jak wcześniej:

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

A w Twoim kodzie pająka możesz po prostu użyć ich jako argumentów pająka:

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
I to po prostu działa.
 8
Author: eLRuLL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-13 14:07:27

Argumenty pająka są przekazywane podczas uruchamiania polecenia crawl przy użyciu opcji-A. Na przykład, jeśli chcę przekazać nazwę domeny jako argument do mojego pająka, zrobię to -

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

I otrzymujemy argumenty w konstruktorach Spidera:

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

...

Będzie działać:)

 6
Author: SrmHitter9062,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-23 21:49:42

Aby przekazać argumenty poleceniem crawl

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

Aby przekazać argumenty do uruchomienia na scrapyd zamień - a na - d

Curl http://your.ip.adres.tutaj: port/harmonogram.json - d spider=myspider-d category= 'mycategory' - d domain='example.com"

Pająk otrzyma argumenty w swoim konstruktorze.


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

Scrappy stawia wszystkie argumenty jako atrybuty Pająka i można całkowicie pominąć metodę init. Uwaga, użyj metody getattr , aby uzyskać te atrybuty, aby Twój kod nie pękł.


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

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

 5
Author: Hassan Raza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-28 11:15:13