J'essaye 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 -a
quelque part sur un paramètre mais je n'ai aucune idée de comment l'utiliser.
la source
J'essaye 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 -a
quelque part sur un paramètre mais je n'ai aucune idée de comment l'utiliser.
Les arguments Spider sont passés dans la crawl
commande à l'aide de l' -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
Extrait du document 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 la nouvelle classe de base et ajoutez super, merci @Birla
Mise à jour 2017 : utilisez 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
self.domain
, je ne suis toujours pas en mesure d'y accéder en dehors de la__init__
méthode. Python renvoie une erreur non définie. BTW, pourquoi avez-vous omis l'super
appel? PS. Je travaille avec la classe CrawlSpider__init__
est une méthode de la classe spider. Son implémentation ne rend pas elle-même l'araignée moins robuste et elle est incluse dans la réponse pour montrer que vous pouvez déclarer des valeurs par défaut pour les arguments de mots-clés, mais comme vous l'avez dit, c'est facultatif. Comme nous l'avons souligné l'année dernière, vous n'avez pas besoin d'utiliser,getattr
vous pouvez simplement accéder aux arguments en tant qu'attributs, par exempleself.category
ou comme nous le voyons dans la réponseself.domain
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'un scrapy, vous pouvez simplement spécifier les paramètres comme avant:et dans votre code d'araignée, vous pouvez simplement les utiliser comme arguments d'araignée:
Et ça marche.
la source
Pour passer des arguments avec la commande crawl
Pour passer des arguments à exécuter sur scrapyd, remplacez -a par -d
L'araignée recevra des arguments dans son constructeur.
Scrapy met tous les arguments en tant qu'attributs d'araignée 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 se casse pas.
la source
Les arguments Spider sont transmis 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, je le ferai-
Et recevez des arguments dans les constructeurs d'araignée:
...
ça va marcher :)
la source
Alternativement, nous pouvons utiliser ScrapyD qui expose une API où nous pouvons passer le start_url et le nom de l'araignée. ScrapyD a des API pour arrêter / démarrer / statut / lister les araignées.
scrapyd-deploy
déploiera l'araignée sous forme d'oeuf dans le démon et maintiendra même la version de l'araignée. Lors du démarrage de l'araignée, vous pouvez mentionner la version de l'araignée à utiliser.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 créer votre propre interface utilisateur pour accepter l'url et d'autres paramètres de l'utilisateur et planifier une tâche à l'aide de l'API de planification scrapyd ci-dessus.
Consultez la documentation de l'API scrapyd pour plus de détails
la source