Scrapy下载错误和remove_request错误

时间:2016-01-20 00:49:01

标签: python scrapy twisted

作者注:您可能认为这篇文章缺乏上下文或信息,这只是因为我不知道从哪里开始。我很乐意根据您的要求编辑其他信息。

运行scrapy我在所有链接中看到以下错误:

ERROR: Error downloading <GET http://www.fifa.com/fifa-tournaments/players-coaches/people=44630/index.html>
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 588, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "/Library/Python/2.7/site-packages/scrapy/core/downloader/__init__.py", line 75, in _deactivate
    self.active.remove(request)
KeyError: <GET http://www.fifa.com/fifa-tournaments/players-coaches/people=44630/index.html>
2016-01-19 15:57:20 [scrapy] INFO: Error while removing request from slot
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/twisted/internet/defer.py", line 588, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "/Library/Python/2.7/site-packages/scrapy/core/engine.py", line 140, in <lambda>
    d.addBoth(lambda _: slot.remove_request(request))
  File "/Library/Python/2.7/site-packages/scrapy/core/engine.py", line 38, in remove_request
    self.inprogress.remove(request)
KeyError: <GET http://www.fifa.com/fifa-tournaments/players-coaches/people=44630/index.html>

当我使用:

简单地在该单个URL上运行scrappy时
scrappy shell http://www.fifa.com/fifa-tournaments/players-coaches/people=44630/index.html

没有发生错误。我正在废弃成千上万的类似链接没有问题,但我在~10个链接上看到了这个问题。我正在使用来自垃圾邮件的默认180秒下载超时。 我也没有在网络浏览器中看到这些链接有任何问题。

解析由请求启动:

  request = Request(url_nrd,meta = {'item' : item},callback=self.parse_player,dont_filter=True)

在功能中处理:

  def parse_player(self, response):
    if response.status == 404:
       #doing stuff here
      yield item
    else:
      #doing stuff there
      request = Request(url_new,meta = {'item' : item},callback=self.parse_more,dont_filter=True)
      yield request

  def parse_more(self, response):
    #parsing more stuff here
    return item

另外:我没有在scrappy中更改下载重试的默认设置(但我也没有看到我的日志文件中的任何重试)。

附加说明: 我的抓取完成后,从dont_filter=True我可以看到在某些时候无法下载前一个错误的链接,在上一次和后续请求中调用时都没有失败。

可能的答案: 我看到我在其中一个蜘蛛上得到KeyError并且该蜘蛛的解除配置失败(remove_request)。是否可能是因为我正在设置dont_filter=True并在同一个URL上执行多个请求,并且蜘蛛的密钥似乎是该URL?蜘蛛是否被同一网址上的先前并发请求解除分配?

在这种情况下,如何为每个请求设置唯一密钥而不在URL上建立索引?

修改

我认为parse_player中的代码是问题所在,我不确定,因为我编辑了代码,但我记得在yield request上看到了一个错误的缩进。

  def parse_player(self, response):
    if response.status == 404:
       #doing stuff here
      yield item
    else:
      paths = sel.xpath('some path extractor here')
      for path in paths:
        if (some_condition):
          #doing stuff there
          request = Request(url_new,meta = {'item' : item},callback=self.parse_more,dont_filter=True)
        # Bad indent of yield request here!
        yield request

如果您认为可能导致此问题,请与我们联系。

1 个答案:

答案 0 :(得分:5)

如果你只是忽略错误??

 def parse_player(self, response):
    if response.status == 200:
      paths = sel.xpath('some path extractor here')
      for path in paths:
        if (some_condition):
          #doing stuff there
          request = Request(url_new,meta = {'item' : item},callback=self.parse_more,dont_filter=True)
        # Bad indent of yield request here!
        yield request