Scrapy 下载错误和 remove_request 错误
Scrapy download error and remove_request error
作者注:您可能认为post缺乏上下文或信息,那只是因为我不知道从哪里开始。我很乐意根据您的要求使用其他信息进行编辑。
运行 scrapy 我在所有 link 我正在抓取的内容中看到以下错误:
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 shell http://www.fifa.com/fifa-tournaments/players-coaches/people=44630/index.html
没有错误发生。我正在废弃数千个类似的 links 没有问题,但我在 ~10 links 上看到了这个问题。我使用的是 scrappy 默认的 180
秒下载超时。
我在网络浏览器中也没有发现这些 link 有任何问题。
请求发起解析:
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
我可以看到 link 在某些时候由于之前的错误而无法下载,在之前和后续请求中调用时没有失败。
可能的答案:
我看到我在其中一个蜘蛛上得到了 KeyError
,并且该蜘蛛的取消分配失败了 (remove_request
)。有没有可能是因为我设置了dont_filter=True
,在同一个URL上做了几个请求,蜘蛛的key好像是那个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
如果您认为这可能导致了问题,请告诉我。
如果您只是忽略错误 ??
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
作者注:您可能认为post缺乏上下文或信息,那只是因为我不知道从哪里开始。我很乐意根据您的要求使用其他信息进行编辑。
运行 scrapy 我在所有 link 我正在抓取的内容中看到以下错误:
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 shell http://www.fifa.com/fifa-tournaments/players-coaches/people=44630/index.html
没有错误发生。我正在废弃数千个类似的 links 没有问题,但我在 ~10 links 上看到了这个问题。我使用的是 scrappy 默认的 180
秒下载超时。
我在网络浏览器中也没有发现这些 link 有任何问题。
请求发起解析:
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
我可以看到 link 在某些时候由于之前的错误而无法下载,在之前和后续请求中调用时没有失败。
可能的答案:
我看到我在其中一个蜘蛛上得到了 KeyError
,并且该蜘蛛的取消分配失败了 (remove_request
)。有没有可能是因为我设置了dont_filter=True
,在同一个URL上做了几个请求,蜘蛛的key好像是那个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
如果您认为这可能导致了问题,请告诉我。
如果您只是忽略错误 ??
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