web-dev-qa-db-fra.com

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

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.

84
L Lawliet

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

155
Steven Almeroth

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.

21
eLRuLL

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','')

9
Hassan Raza

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 :)

7
Siyaram Malav