我正在使用scrapy来抓取超过400万种产品的产品网站。然而,在爬行约50k产品后,它开始抛出500 HTTP错误。我已将自动限制设置为false,因为启用它非常慢并且需要大约20-25天才能完成抓取。我认为服务器会在一段时间后暂时阻止爬虫。任何解决方案都可以做到? 我正在使用站点地图抓取工具 - 我想从网址本身提取一些信息,如果服务器没有响应并继续下一个网址而不是完成抓取和关闭蜘蛛,因为我正在查看请求中的errback参数。但是,由于我使用的是站点地图抓取工具,因此我不会显式创建请求对象。是否有我可以覆盖的默认errback函数或我可以在哪里定义它。
此处定义了另一种方法 - Scrapy:In a request fails (eg 404,500), how to ask for another alternative request?
答案 0 :(得分:4)
HTTP 500 typically indicates an internal server error。当被阻止时,您更有可能看到403或404.(或者可能是302重定向到"您已被阻止"页面)您很可能访问导致服务器端崩溃的链接。您应该存储导致错误的请求并尝试自己访问它。可能是网站被破坏的情况。
好的..我明白了但是你能说出在哪里以及如何定义errback函数以便我可以处理这个错误并且我的蜘蛛没有完成
I took a look at SitemapSpider,遗憾的是,它不允许您指定errback函数,因此您必须自己添加对它的支持。我的基础是the source for SitemapSpider。
首先,您希望通过添加处理错误的函数来更改sitemap_rules
的工作方式:
sitemap_rules = [
('/product/', 'parse_product'),
('/category/', 'parse_category'),
]
将成为:
sitemap_rules = [
('/product/', 'parse_product', 'error_handler'),
('/category/', 'parse_category', 'error_handler'),
]
接下来,在init
中,您希望将新回调存储在_cbs
中。
for r, c in self.sitemap_rules:
if isinstance(c, basestring):
c = getattr(self, c)
self._cbs.append((regex(r), c))
将成为:
for r, c, e in self.sitemap_rules:
if isinstance(c, basestring):
c = getattr(self, c)
if isinstance(e, basestring):
e = getattr(self, e)
self._cbs.append((regex(r), c, e))
最后,在_parse_sitemap
的末尾,您可以指定新的errback函数
elif s.type == 'urlset':
for loc in iterloc(s):
for r, c in self._cbs:
if r.search(loc):
yield Request(loc, callback=c)
break
将成为:
elif s.type == 'urlset':
for loc in iterloc(s):
for r, c, e in self._cbs:
if r.search(loc):
yield Request(loc, callback=c, errback=e)
break
从那里开始,只需实现你的errback函数(记住它以Twisted Failure为参数),你应该好好去。