我有一个功能强大的刮板,可以从数据库中刮除大量网站,并将结果读取到同一数据库中。我从数据库中获取域,然后手动附加https://www。在网址上。即使此url不正确,绝大多数站点仍可以正确地重定向蜘蛛,但是对于一些站点,由于没有重定向,即使站点明显存在并且可以通过浏览器访问,我也会收到DNSLookup错误。 。

我的问题是,有没有一种方法可以重试出现DNSLookup错误但URL不同的抓取工具?我目前正在处理errback中的错误,在该错误中,我会根据收到的错误类型在数据库中插入必要的信息。有没有办法从刮擦结果中请求新的刮擦?

最佳答案

当您生成对某些URL的请求时,除了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

关于python - 如何使用其他网址重试失败的剪贴簿?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55574047/

10-15 13:04