Comment passer un argument défini par l’utilisateur dans scrapy spider

J’essaie de transmettre un argument défini par l’utilisateur à l’araignée d’un scrapy. Quelqu’un peut-il suggérer comment faire cela?

J’ai lu à propos d’un paramètre -a quelque part mais je ne sais pas comment l’utiliser.

    Les arguments d’araignée sont passés dans la commande d’parsing à l’aide de l’option -a . Par exemple:

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

    Les araignées peuvent accéder aux arguments dans leurs initialiseurs:

     class MySpider(scrapy.Spider): name = 'myspider' def __init__(self, category='', **kwargs): self.start_urls = ['http://www.example.com/category/%s' % category] super().__init__(**kwargs) # python3 self.log(self.domain) # system 

    Tiré de la doc de scrapy: http://doc.scrapy.org/en/latest/topics/spiders.html#spider-arguments

    Mise à jour 2013 : Ajouter un deuxième argument

    Mise à jour 2015 : ajuster le libellé

    Mise à jour 2016 : utilisez une classe de base plus récente et ajoutez un super, merci @Birla

    Mise à jour 2017 : Utiliser Python3 super

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

    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’un scrapy, vous pouvez simplement spécifier les parameters comme précédemment:

     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 juste.

    Les arguments d’araignée sont transmis lors de l’exécution de la commande d’parsing à l’aide de l’option -a. Par exemple, si je veux transmettre un nom de domaine comme argument à mon araignée, je le ferai.

    scrapy myspider -a domain = “http://www.example.com”

    Et recevez des arguments dans les constructeurs d’araignées:

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

    ça va marcher 🙂

    Pour passer des arguments avec la commande d’parsing

    scrapy myspider -a category = ‘mycategory’ -a domain = ‘example.com’

    Pour passer des arguments à exécuter sur scrapyd, remplacez -a par -d

    curl http://your.ip.address.here:port/schedule.json -d spider = myspider -d catégorie = ‘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’atsortingbuts spider et vous pouvez ignorer complètement la méthode init . Attention, utilisez la méthode getattr pour obtenir ces atsortingbuts afin que votre code ne se casse pas.

     class MySpider(Spider): name="myspider" start_urls = ('https://httpbin.org/ip',) def parse(self,response): print getattr(self,'category','') print getattr(self,'domain','')