J'essaie de passer un argument défini par l'utilisateur à l'araignée d'une scrapy. Quelqu'un peut-il suggérer comment faire cela?
J'ai lu sur un paramètre -a
quelque part mais je ne sais pas comment l'utiliser.
Les arguments de l'araignée sont passés dans la commande crawl
à l'aide de la commande -a
option. Par exemple:
scrapy crawl myspider -a category=electronics -a domain=system
Les araignées peuvent accéder aux arguments en tant qu'attributs:
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
Tiré de la doc Scrapy: http://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments
Mise à jour 2013 : Ajoute un deuxième argument
Update 2015 : Ajuster le libellé
Mise à jour 2016 : Utilisez la nouvelle classe de base et ajoutez super, merci @Birla
Mise à jour 2017 : Utilisez super Python3
# previously
super(MySpider, self).__init__(**kwargs) # python2
Mise à jour 2018 : Comme le souligne @eLRuLL , les araignées peuvent accéder aux arguments en tant qu'attributs
Les réponses précédentes étaient correctes, mais vous n'avez pas à déclarer le constructeur (__init__
) chaque fois que vous voulez coder l’araignée d’une scrapy, vous pouvez simplement spécifier les paramètres comme auparavant:
scrapy crawl myspider -a parameter1=value1 -a parameter2=value2
et dans votre code d'araignée, vous pouvez simplement les utiliser comme arguments d'araignée:
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
Et ça marche.
Pour passer des arguments avec la commande d'exploration
scrapy crawl myspider -a category = 'ma catégorie' -a domain = 'example.com'
Pour passer des arguments à exécuter sur scrapyd, remplacez - a par - d
curl http://votre.ip.address.here:port/schedule.json -d spider = myspider -d category = 'mycategory' -d domaine = 'example.com'
L'araignée recevra des arguments dans son constructeur.
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 met tous les arguments en tant qu’attributs spider et vous pouvez ignorer complètement la méthode init . Attention, utilisez la méthode getattr pour obtenir ces attributs afin que votre code ne soit pas endommagé.
class MySpider(Spider):
name="myspider"
start_urls = ('https://httpbin.org/ip',)
def parse(self,response):
print getattr(self,'category','')
print getattr(self,'domain','')
Les arguments de l'araignée sont passés lors de l'exécution de la commande d'analyse à l'aide de l'option -a. Par exemple, si je veux passer un nom de domaine en argument à mon araignée, je le ferai-
scrapy crawl myspider -a domain = "http://www.example.com"
Et recevoir des arguments dans les constructeurs de l'araignée:
class MySpider(BaseSpider):
name = 'myspider'
def __init__(self, domain='', *args, **kwargs):
super(MySpider, self).__init__(*args, **kwargs)
self.start_urls = [domain]
#
...
ça va marcher :)