python - 如何使用不同的 URL 重试失败的抓取?
问题描述
我有一个功能性刮板,它从数据库中刮取大量网站,并将结果读取到同一个数据库中。我从数据库中获取域,并手动附加https://www。在网址上。即使这个 url 不正确,绝大多数网站都可以正确重定向蜘蛛,但对于少数几个网站,我得到一个 DNSLookup 错误,因为没有重定向,即使该网站明显存在并且可以通过浏览器访问.
我的问题是,有没有办法重试获取 DNSLookup 错误但使用不同 URL 的抓取?我目前正在处理 errback 中的错误,我根据收到的错误类型将必要的信息插入到数据库中。有没有办法从抓取结果中请求新的抓取?
解决方案
当您向某个 url 产生 Request 时callback
,您还可以设置errback
,您可以在其中捕获此类情况。在官方文档中,您可以找到很好的用法示例: http: //doc.scrapy.org/en/latest/topics/request-response.html#topics-request-response-ref-errbacks
def start_requests(self):
for u in self.start_urls:
yield scrapy.Request(u, callback=self.parse_httpbin,
errback=self.errback_httpbin,
dont_filter=True)
def errback_httpbin(self, failure):
# log all failures
self.logger.error(repr(failure))
if failure.check(DNSLookupError):
# this is the original request
request = failure.request
self.logger.error('DNSLookupError on %s', request.url)
还要检查一下,也许RetryMiddleware
会符合你的目标。在此处查看官方文档scrapy
:https ://docs.scrapy.org/en/latest/topics/downloader-middleware.html#module-scrapy.downloadermiddlewares.retry