2017-06-17 71 views
0

我想为自定义基本蜘蛛类中的蜘蛛提供一些通用功能。定制BaseSpider Scrapy

通常scrapy蜘蛛继承scrapy.Spider类。

我试图创造scrapy的蜘蛛文件夹BaseSpider类,没有工作

import scrapy 


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

    def parse(self, response): 
     pass 

这里是我的实际蜘蛛

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 

给出了这样的错误

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

然后,我试图使用多继承,并让我的易趣蜘蛛看起来像

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 

这给

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 

我在Python以及scrapy新的,我想实现我在这其中不工作我想编码的PHP风格。

我正在寻找适当的方法。

感谢

更新

改变了初始化签名按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) 

仍然得到

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

你有__init __()吗? – omdv

+0

init在哪个类中? –

+0

您在EbaySpider上的第一个错误表明__init__存在问题。你是如何定义它的? – omdv

回答

3

scrapy.Spider.__init__signature看看:

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

子类应该定义__init__方法具有相同的签名。如果你不关心的姓名和kwargs,只需将它们传递给基类:

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

    def parse(self, response): 
     pass 

EbaySpider不必从scrapy.Spider继承,如果它已经从BaseSpider继承。它也应该有相同的__init__签名,而且还需要调用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) 

(我使用Python的super() 3语法)

编辑

另外还有一种问题:你正在像这样导入BaseSpider:

import BaseSpider 

很可能你有一个名为BaseSpider(BaseSpider.py文件)的模块和一个名为BaseSpider的类。 import BaseSpider给你模块对象,而不是蜘蛛类。尝试使用from BaseSpider import BaseSpider,并更好地重命名模块以避免混淆,并遵循pep-8

+0

我试着实施你的建议,但仍然得到相同的错误。你能否请检查更新的部分。我想知道scrapy如何称它的刮刀,因为在他们的文档中他们没有提到任何与自定义父蜘蛛类相关的任何事情 –

+1

啊哈,你有一个不同的问题。看我的编辑。 –

+0

即使我的Pycharm现在行为正确:D非常感谢! Python是如此不同lol –