我有一个功能强大的刮板,可以从数据库中刮除大量网站,并将结果读取到同一数据库中。我从数据库中获取域,然后手动附加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/