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