我正在使用scrapy抓取一个超过400万个产品的产品网站。但是,在搜寻大约50k产品之后,它开始引发500 HTTP错误。我将“自动限制”设置为“ false”,因为启用了“非常慢”功能后,大约需要20-25天才能完成抓取。我认为服务器会在一段时间后开始临时阻止搜寻器。任何解决方案可以做什么?
我正在使用Sitemap搜寻器-如果服务器没有响应,我想从url本身中提取一些信息,然后继续下一个url而不是完成爬网和关闭蜘蛛程序,因为我正在查看Request中的errback参数。但是,由于我使用的是站点地图搜寻器,因此我没有明确创建请求对象。是否有我可以覆盖的默认errback函数,或在哪里可以定义它。

这里定义了另一种方法-Scrapy:In a request fails (eg 404,500), how to ask for another alternative request?

最佳答案

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作为参数),您应该会很好。

关于python - 500内部服务器错误爬取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23327460/

10-12 16:51