首页 > 解决方案 > 如何使用不同的 URL 重试失败的抓取?

问题描述

我有一个功能性刮板,它从数据库中刮取大量网站,并将结果读取到同一个数据库中。我从数据库中获取域,并手动附加https://www。在网址上。即使这个 url 不正确,绝大多数网站都可以正确重定向蜘蛛,但对于少数几个网站,我得到一个 DNSLookup 错误,因为没有重定向,即使该网站明显存在并且可以通过浏览器访问.

我的问题是,有没有办法重试获取 DNSLookup 错误但使用不同 URL 的抓取?我目前正在处理 errback 中的错误,我根据收到的错误类型将必要的信息插入到数据库中。有没有办法从抓取结果中请求新的抓取?

标签: pythonscrapy

解决方案


当您向某个 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会符合你的目标。在此处查看官方文档scrapyhttps ://docs.scrapy.org/en/latest/topics/downloader-middleware.html#module-scrapy.downloadermiddlewares.retry


推荐阅读