2
votes

Scrapy: Comment accéder aux paramètres personnalisés transmis par la CLI à partir de la méthode __init __ () d'une classe spider?

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?


0 commentaires

3 Réponses :


3
votes

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


11 commentaires

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.



0
votes

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 >


0 commentaires

0
votes

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>


0 commentaires