124 votes

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

J'essaie de passer un argument défini par l'utilisateur à un spider de scrapy. Quelqu'un peut-il me suggérer comment le faire ?

J'ai lu un article sur un paramètre -a quelque part, mais je ne sais pas comment l'utiliser.

228voto

Steven Almeroth Points 2546

Les arguments de l'araignée sont passés dans le crawl en utilisant 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 : Ajouter un deuxième argument

Mise à jour 2015 : Ajuster la formulation

Mise à jour 2016 : Utiliser une classe de base plus récente et ajouter 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

50voto

eLRuLL Points 1031

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 un spider de scrapy, vous pouvez simplement spécifier les paramètres comme auparavant :

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

et dans votre code araignée, vous pouvez simplement les utiliser comme arguments 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.

21voto

Hassan Raza Points 36

Pour passer des arguments avec la commande crawl

scrapy crawl myspider -a category='mycategory' -a domain='example.com'

Pour passer des arguments à exécuter sur scrapyd remplacer -a con -d

bouclette http://your.ip.address.here:port/schedule.json -d spider=myspider -d category='mycategory' -d domain='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 place tous les arguments en tant qu'attributs de l'araignée et vous pouvez sauter l'élément init complètement la méthode. Attention à l'utilisation getattr pour obtenir ces attributs afin que votre code ne soit pas cassé.

class MySpider(Spider):
    name="myspider"
    start_urls = ('https://httpbin.org/ip',)

    def parse(self,response):
        print getattr(self,'category','')
        print getattr(self,'domain','')

11voto

Siyaram Malav Points 1478

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

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

1voto

Nagendran Points 142

Alternativement, nous pouvons utiliser ScrapyD qui exposent une API où nous pouvons passer le start_url et le nom du spider. ScrapyD a des API pour arrêter/démarrer/établir/lister les spiders.

pip install scrapyd scrapyd-deploy
scrapyd
scrapyd-deploy local -p default

scrapyd-deploy va déployer l'araignée sous forme d'œuf dans le démon et même il maintient la version de l'araignée. En démarrant le spider, vous pouvez mentionner la version du spider à utiliser.

class MySpider(CrawlSpider):

    def __init__(self, start_urls, *args, **kwargs):
        self.start_urls = start_urls.split('|')
        super().__init__(*args, **kwargs)
    name = testspider

curl http://localhost:6800/schedule.json -d project=default -d spider=testspider -d start_urls="https://www.anyurl...|https://www.anyurl2"

L'avantage supplémentaire est que vous pouvez construire votre propre interface utilisateur pour accepter l'URL et d'autres paramètres de l'utilisateur et planifier une tâche en utilisant l'API de planification scrapyd ci-dessus.

Voir Documentation de l'API scrapyd pour plus de détails

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X