Je dois accéder aux paramètres personnalisés transmis par la CLI en utilisant:
-s SETTING_NAME = "SETTING_VAL"
à partir de la méthode __init __ () de la classe spider .
get_project_settings ()
me permet d'accéder uniquement aux paramètres statiques.
La documentation explique comment accéder à ces paramètres personnalisés à partir d'un pipeline en configurant un nouveau pipeline via:
@classmethod def from_crawler(cls, crawler): settings = crawler.settings
Mais y a-t-il un moyen d'y accéder à partir du __init __ ()
méthode spider?
3 Réponses :
Utilisez simplement les paramètres de . get
par exemple
import scrapy class ArgsSpider(scrapy.Spider): name = "my_spider" def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) print('kwargs =', kwargs) @classmethod def from_crawler(cls, crawler, *args, **kwargs): spider = cls( *args, my_setting=crawler.settings.get("MY_SETTING"), **kwargs ) spider._set_crawler(crawler) return spider
imprimera
SETTING_VAL
Si vous voulez accéder à un paramètre dans votre spider __ init__
vous avez quelques options. Si vos options de ligne de commande sont juste un argument spider
, utilisez -a
au lieu de -s
. Si, pour une raison quelconque, vous devez accéder à un paramètre réel dans votre spider __init__
, vous devez remplacer le from_crawler
classmethod
comme décrit dans le docs .
Voici un exemple:
print(self.settings.get('SETTING_NAME'))
exécuter avec par exemple scrapy runspider args_spider.py -s MY_SETTING = bonjour, monde!
et vous verrez votre réglage dans le dict kwargs
. Vous pouvez bien sûr également obtenir d'autres paramètres de cette façon
Une instance de BaseSettings
me donne des valeurs vides. Une instance de Paramètres
contient toujours uniquement les paramètres statiques du projet et non ceux transmis via l'interface de ligne de commande.
@NikolayShindarov où essayez-vous d'accéder aux paramètres? Veuillez publier ce que vous essayez de répondre à votre question.
@tomjin Dans la classe héritée de Spider
. Désolé, j'ai pensé que c'était assez clair, j'ai changé le titre maintenant.
@NikolayShindarov c'est clair. Pouvez-vous ajouter votre code d'araignée? Y accédez-vous dans la fonction __init__
? La réponse ici fonctionne très bien pour obtenir des paramètres ailleurs dans l'araignée.
Cela ne fonctionne pas, je l'ai essayé aussi dans parse ()
. Veuillez noter les détails de ma question: j'ai besoin des paramètres personnalisés transmis via la CLI en utilisant le paramètre -s
. Le code de votre réponse charge uniquement les paramètres statiques, quel que soit l'endroit où il est appelé - à l'intérieur de __init __ ()
ou dans une autre méthode.
@NikolayShindarov ça marche Je l'ai testé. Veuillez publier la ligne exacte que vous utilisez.
CLI: scrapy crawl -a somearg = "someval" -s my_arg = "X"
Code: def parse (self, response): from scrapy.settings import Settings, BaseSettings sett1 = Settings ( ) sett2 = BaseSettings () __import __ ('pprint'). pprint (dict (sett1)) print (sett1.get ('my_arg')) __import __ ('pprint'). pprint (dict (sett2)) print (sett2.get ('my_arg'))
Les deux me donnent Aucun
@NikolayShindarov, vous n’avez rien à faire de tout cela. Faites simplement def parse (self, response): print (self.settings.get ('my_arg'))
. Essayez ça et faites-le moi savoir.
Cela fonctionne en effet, merci. Cependant, mon problème n'est toujours pas résolu car il semble qu'il ne fonctionne pas dans __init __ ()
ou dans une méthode appelée par __init __ ()
. J'ai voté pour votre réponse et modifié les spécifications de mes questions, le problème reste non résolu.
@NikolayShindarov J'ai mis à jour ma réponse pour répondre également à votre nouvelle question
Merci, j'ai réussi à le faire entre-temps en utilisant exactement la méthode d'usine from_crawler. J'ai accepté votre réponse et ajouté la mienne car j'avais besoin de quelques ajustements supplémentaires dans ma situation pour la faire fonctionner.
La réponse de @tomjn fonctionne, je veux juste souligner que si vous utilisez des extensions ou des middlewares qui ont besoin de l'objet crawler, vous devez modifier sa méthode d'usine de cette façon:
@classmethod def from_crawler(cls, crawler, *args, **kwargs): obj = cls( *args, my_setting=crawler.settings.get("MY_SETTING"), **kwargs ) obj.crawler = crawler return obj
Je ne sais pas si vous devez le faire si vous instanciez l'araignée elle-même, mais dans mon cas, lorsque j'en héritais, mon script plantait en se plaignant de l'attribut du robot d'exploration jusqu'à ce que je le fasse de cette façon.
p >
Aucune des réponses ne fonctionne lorsque vous utilisez CrawlSpider
, car certaines méthodes telles que _follow_links
sera manquant.
Le code suivant fonctionne:
@classmethod def from_crawler(cls, crawler, *args, **kwargs): spider = super().from_crawler( crawler, *args, some_arg=crawler.settings.get("SOME_ARG"), **kwargs ) return spider
p>