【问题标题】:exceptions.TypeError: __init__() takes exactly 1 argument (3 given)exceptions.TypeError: __init__() 只需要 1 个参数(给定 3 个)
【发布时间】:2015-09-29 08:29:57
【问题描述】:

我正在通过继承 RFPDupeFilter 创建自定义过滤器。 这是我使用代码的链接: https://github.com/j4s0nh4ck/wiki-spider/blob/master/wiki/wiki/SeenURLFilter.py

注意:我在 settings.py 所在的同一目录中名为 custom_filters.py 的自定义文件中有上述代码,然后在 settings.py 中我有此代码。

DUPEFILTER_CLASS = 'myspider.custom_filters.SeenURLFilter'

但是当我运行机器人时,我得到了这个错误:

exceptions.TypeError: __init__() 只接受 1 个参数(给定 3 个)

【问题讨论】:

  • 这个蜘蛛怎么称呼?
  • 我在持久性方面落后于蜘蛛,因此使用此命令调用蜘蛛'scrapy crawl somespider -s JOBDIR=crawls/somespider-1'....但即使没有持久性命令,我也会收到该错误。即'scrapy crawl somespider'。
  • 你能发布完整的回溯吗?
  • 您能否提供更长的堆栈跟踪,因为此错误代码可以是任何内容。
  • 2015-09-29 14:33:34 [scrapy] 信息:Spider 在 Deferred 中打开了未处理的错误:2015-09-29 14:33:34 [twisted] CRITICAL:Deferred 中的未处理错误: ............. 文件“/usr/local/lib/python2.7/dist-packages/scrapy/core/scheduler.py”,第 28 行,在 from_crawler dupefilter = dupefilter_cls .from_settings(settings) 文件“/usr/local/lib/python2.7/dist-packages/scrapy/dupefilters.py”,第 44 行,from_settings return cls(job_dir(settings), debug) exceptions.TypeError: __init__( ) 只需要 1 个参数(给定 3 个)

标签: python web-scraping scrapy scrapy-spider


【解决方案1】:

正如您在回溯中看到的那样,您的过滤器的 from_settings() 方法被调用 - 然后它会创建您的自定义欺骗过滤器的实例。但是,由于您没有指定自己的from_settings() 方法the one from built-in RFPDupeFilter is used

@classmethod
def from_settings(cls, settings):
    debug = settings.getbool('DUPEFILTER_DEBUG')
    return cls(job_dir(settings), debug)

它尝试使用 pathdebug 构造函数参数实例化您的自定义欺骗过滤器。而您的 SeenURLFilter 构造函数不接受 debug 参数。

您需要让您的 dupefilter 也接受 debug parameter

from scrapy.dupefilter import RFPDupeFilter

class SeenURLFilter(RFPDupeFilter):
    """A dupe filter that considers the URL"""

    def __init__(self, path=None, debug=False):  # FIX WAS APPLIED HERE
        self.urls_seen = set()
        RFPDupeFilter.__init__(self, path, debug)  # AND HERE

    def request_seen(self, request):
        if request.url in self.urls_seen:
            return True
        else:
            self.urls_seen.add(request.url)

【讨论】:

  • 为了避免镜像可能改变的默认参数之类的东西(而且你不知道),最好将它设为def __init__(self, *args, **kwargs): ... RFPDupeFilter.__init__(self, *args, **kwargs),这样你就可以在适当的时候直接使用超类的默认参数,而不是将它们复制到您自己的原型中并假设它们永远不会改变。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 2018-03-29
  • 2018-07-14
相关资源
最近更新 更多