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ć.
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
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.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ć:)
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','')
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