作者注:您可能认为这篇文章缺乏上下文或信息,这只是因为我不知道从哪里开始。我很乐意根据您的要求编辑其他信息。
运行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
如果您认为可能导致此问题,请与我们联系。
答案 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