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'un scrapy. Quelqu'un peut-il suggérer comment le faire?

J'ai lu un paramètre -a quelque part mais je n'ai aucune idée de comment l'utiliser.

70
demandé sur Kara 2013-03-25 13:35:13

4 réponses

Les arguments Spider sont passés dans la commande crawl en utilisant l'option -a. 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

Extrait du Doc 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 nouvelle classe de base et ajoutez super, merci @ Birla

Mise à Jour 2017 : utiliser python3 super

# 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

126
répondu Steven Almeroth 2018-09-19 21:38:53

Les réponses précédentes étaient correctes, mais vous n'avez pas besoin de déclarer le constructeur (__init__) chaque fois que vous voulez coder l'Araignée d'un scrapy, vous pouvez simplement spécifier les paramètres comme avant:

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

Et dans votre code spider, vous pouvez simplement les utiliser comme arguments spider:

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.

8
répondu eLRuLL 2016-12-13 14:07:27

Les arguments Spider sont passés lors de l'exécution de la commande crawl à l'aide de l'option-a. Par exemple, si je veux passer un nom de domaine comme argument à mon araignée alors je vais le faire-

Scrapy crawl myspider-un domaine="http://www.example.com"

Et recevoir des arguments dans les constructeurs de spider:

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

...

Cela fonctionnera :)

6
répondu SrmHitter9062 2017-01-23 21:49:42

Pour passer des arguments avec la commande crawl

Scrapy analyse myspider -categorie='mycategory' -un domain='example.com'

Pour passer des arguments À exécuter sur scrapyd remplacer un avec -d

Curl http://your.IP.adresse.ici: port / horaire.json - d spider=myspider -catégorie d='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éthodeinit . Méfiez-vous utilisez getattr méthode pour obtenir ces attributs 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','')

5
répondu Hassan Raza 2018-04-28 11:15:13