0
votes

Quels sont les risques de remplacement d'une méthode __init__ Scrapy.Spider?

Dans certaines piles Whidflow Questions J'ai vu des réponses acceptées lorsque la méthode __ init __ de la superclasse Scrapy.Spider est remplacée par l'araignée définie par l'utilisateur. Par exemple: sélénium avec skérapie pour la page dynamique .

Ma question est, quels sont les risques de le faire? Le __ init __ de la super classe ressemble à ceci: xxx

donc, si je devais définir un __ init __ dans mon Spider qui hérite de cette classe et n'incluait pas d'appel à la superclasse __ init __ serait-ce que je serais enfreindre des fonctionnalités de skérapie? Comment atténuer ce risque? Appelez le Super __ init __ dans mon araignée? À la recherche de meilleures pratiques pour la session et aussi une meilleure compréhension de __ init __ appels dans le contexte de l'héritage de classe.


0 commentaires

3 Réponses :


3
votes

None si vous utilisez super () .__ init __ (* args, ** kwargs) .

Quelque chose d'autre est un risque. Vous copiez le code de la méthode méthode de SPIDER dans une version Scrapy spécifique, par conséquent, le seul chemin de mise à niveau sécurisé consiste à vérifier comment l'araignée .__ init __ Modification de la mise en œuvre dans les nouvelles versions Scrapy et l'application des modifications à votre implémentation personnalisée lorsque vous mettez à niveau la carrossement.

Si vous pouvez implémenter la même logique en gardant un appel à Super () .__ init __ (* args, ** kwargs) , ce serait mieux.

Sinon, à la recherche de nouvelles implémentations, ou à ouvrir une demande de fonctionnalité afin que Scrapy puisse accueillir votre cas d'utilisation de manière sécurisée, constituerait de meilleures solutions à long terme.


2 commentaires

Ainsi, en utilisant super () .__ init __ (* args, ** kwargs) conserve la funcitonalité de la superclasse. Si j'avais aussi besoin de passer des arguments à l'araignée spécifique au __ init __ On ne sait pas pour moi comment Python saura quels arguments vont. Pour m'aider à comprendre pourriez-vous être plus explicite sur la façon dont les deux __ init __ sont des méthodes lorsqu'ils sont tous les deux présents?


Si vous utilisez __ init __ (* args, *, nom = nul, ** kwargs) dans votre signature de votre araignée, nom ne sera accepté que comme paramètre mot-clé seulement (en évitant Problèmes dans le scénario improbable que la classe mère introduit de nouveaux arguments de position), et nom ne serait pas inclus dans kwargs , il ne serait donc pas transmis à la classe d'araignée parente lorsque en utilisant super () .__ init __ (* args, ** kwargs) . L'esprit que si nom est également utilisé par la classe d'araignée parente, vous empêcheriez la classe d'araignée parente d'obtenir ce paramètre.



2
votes

Si vous voyez le Spider .__ init __ , il ne prend en charge que auto.name et self.start_urls . Si vous les gérez par vous-même dans les attributs de classe, comme l'exemple de réponse que vous avez mentionné, vous pouvez complètement ignorer la méthode init et cela fonctionnerait toujours bien.

dans Python, init est juste une fonction qui est appelée à une initialisation personnalisée et si vous ne le définissez pas, c'est équivalent à faire def __init __ (auto): passe . .

super () .__ init __ est bon d'avoir pour héritage coopératif dans lequel vous avez plusieurs classes de base. Pour Spider, il est surtout sans rapport, à moins que vous n'écrivez à une tonne d'araignées liées et en réalité besoin d'héritage coopératif.

lt; DR: Vous pouvez le sauter complètement. Assurez-vous simplement que vous définissez nom et start_urls dans vos attributs init ou en classe


0 commentaires

0
votes

Je l'obtiens maintenant. Merci.

Afin de préserver la fonctionnalité d'une super classe ' __ init __ tout en prolongeant la fonctionnalité de votre sous-classe personnalisée que vous le feriez.

dans la sous-classe __ init __ Méthode Vous ajouteriez que vous êtes personnalisé mot-clé arguments puis terminez en passant * args, ** kwargs . Ensuite, appelez explicitement super () .__ init __ (* args, ** kwargs) dans le corps du __ init __ . Comme ceci: xxx

Les arguments personnalisés seront géré par votre code personnalisé, puis * args, ** kwargs sera consommé par la super classe ' __ init __ . Soyez prudent que vous obteniez l'ordre du __ init __ appels à droite s'ils dépendent l'un de l'autre.

Un exemple parfait de tout ce genre est le seleniumrequest de Scrapy-selenium middleware.


0 commentaires