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