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