500内部服务器错误scrapy

时间:2014-04-27 18:45:05

标签: python web-crawler scrapy

我正在使用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?

1 个答案:

答案 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为参数),你应该好好去。

相关问题