2017-06-17 1 views
0

Je veux avoir quelques fonctionnalités génériques pour les araignées dans une classe d'araignée de base personnalisée.Custom BaseSpider Scrapy

Habituellement, les araignées scrapy héritent de la classe scrapy.Spider.

J'ai essayé de créer une classe de BaseSpider dans le dossier des araignées de scrapy qui ne fonctionne pas

import scrapy 


class BaseSpider(scrapy.Spider): 
    def __init__(self): 
     super(scrapy.Spider).__init__() 

    def parse(self, response): 
     pass 

Et voici mon araignée réelle

import scrapy 
import BaseSpider 


class EbaySpider(BaseSpider): 
    name = "ebay" 
    allowed_domains = ["ebay.com"] 

    def __init__(self): 
     self.redis = Redis(host='redis', port=6379) 
    # rest of the spider code 

donne cette erreur

TypeError: Error when calling the metaclass bases 
    module.__init__() takes at most 2 arguments (3 given) 

Ensuite, j'ai essayé d'utiliser l'héritage multi et faire ressembler mon araignée ebay

class EbaySpider(scrapy.Spider, BaseSpider): 

    name = "ebay" 
    allowed_domains = ["ebay.com"] 

    def __init__(self): 
     self.redis = Redis(host='redis', port=6379) 
    # rest of the spider code 

qui donne

TypeError: Error when calling the metaclass bases 

metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases 

Je suis nouveau en python ainsi que scrapy et je suis en train de mettre en œuvre mon style PHP de codage dans ce qui ne fonctionne pas, je suppose.

Je suis à la recherche d'une approche appropriée.

Merci

Mise à jour

Changé la initialisation signature selon scrapy.Spider

BaseSpider

def __init__(self, *args, **kwargs): 
     super(scrapy.Spider, self).__init__(*args, **kwargs) 

EbaySpider

class EbaySpider(BaseSpider): 
    def __init__(self, *args, **kwargs): 
     super(BaseSpider,self).__init__(*args, **kwargs) 
     self.redis = Redis(host='redis', port=6379) 

encore obtenir

File "/scrapper/scrapper/spiders/ebay.py", line 11, in <module> 
    class EbaySpider(BaseSpider): 
TypeError: Error when calling the metaclass bases 
    module.__init__() takes at most 2 arguments (3 given) 
+0

Avez-vous __init __()? – omdv

+0

init dans quelle classe? –

+0

Votre première erreur avec EbaySpider indique qu'il y a un problème avec __init__. Comment l'avez-vous défini? – omdv

Répondre

3

Jetez un oeil à scrapy.Spider.__init__signature:

def __init__(self, name=None, **kwargs): 
    # ... 

devrait définir __init__ Sous-classes méthodes avec la même signature. Si vous ne se soucient pas de nom et kwargs, il suffit de les passer à la classe de base:

class BaseSpider(scrapy.Spider): 
    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 

    def parse(self, response): 
     pass 

EbaySpider ne pas hériter de scrapy.Spider si elle hérite déjà de BaseSpider.Il devrait également avoir la même signature __init__, et il doit aussi appeler super():

class EbaySpider(BaseSpider): 

    name = "ebay" 
    allowed_domains = ["ebay.com"] 

    def __init__(self, *args, **kwargs): 
     super().__init__(*args, **kwargs) 
     self.redis = Redis(host='redis', port=6379) 

(je suis en utilisant la syntaxe Python 3 pour super())

EDIT

Il y a une supplémentaire problème: vous importez BaseSpider comme ceci:

import BaseSpider 

Vous avez probablement un module nommé BaseSpider (fichier BaseSpider.py) et une classe nommée BaseSpider dans ce module. import BaseSpider vous donne module objet, pas la classe spider. Essayez-le avec from BaseSpider import BaseSpider, et mieux renommer le module pour éviter toute confusion et de suivre pep-8.

+0

J'ai essayé d'implémenter votre suggestion, mais toujours obtenir la même erreur. Pouvez-vous s'il vous plaît vérifier la partie mise à jour. Je me demande comment scrapy appelle son scrapper parce que dans leur documentation, ils n'ont rien mentionné des classes d'araignée parent personnalisé du tout –

+1

Aha, vous avez un problème différent. Voir ma modification. –

+0

Même mon Pycharm se comporte maintenant correctement: D Merci beaucoup bro! Python est si différent lol –