Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用其他URL重试失败的刮取?_Python_Scrapy - Fatal编程技术网

Python 如何使用其他URL重试失败的刮取?

Python 如何使用其他URL重试失败的刮取?,python,scrapy,Python,Scrapy,我有一个功能强大的刮板,可以从数据库中刮取大量网站,并将结果读取到同一个数据库中。我从数据库中获取域,并手动附加。在url上。即使此url不正确,绝大多数站点都可以正确重定向爬行器,但对于少数站点,我得到了DNSLookup错误,因为没有重定向,即使站点显然存在,并且可以通过浏览器访问 我的问题是,有没有一种方法可以使用不同的URL重试出现DNSLookup错误的刮取?我目前正在errback中处理我的错误,根据我遇到的错误类型向数据库插入必要的信息。有没有办法从刮取结果中请求新的刮取?当您向某

我有一个功能强大的刮板,可以从数据库中刮取大量网站,并将结果读取到同一个数据库中。我从数据库中获取域,并手动附加。在url上。即使此url不正确,绝大多数站点都可以正确重定向爬行器,但对于少数站点,我得到了DNSLookup错误,因为没有重定向,即使站点显然存在,并且可以通过浏览器访问


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

当您向某个url发出请求时,除了
回调
,您还可以设置
errback
,在那里您可以捕获此类情况。在官方文档中,您可以找到非常好的使用示例:


还要检查一下,也许
RetryMiddleware
符合您的目标。在这里查看官方文档中的
scrapy

当您向某个url发出请求时,除了
回调
,您还可以设置
errback
,在这里您可以捕获此类情况。在官方文档中,您可以找到非常好的使用示例:


还要检查一下,也许
RetryMiddleware
符合您的目标。查看官方文档中的
scrapy
此处:

您能提供一些您已经尝试过的代码示例吗?请参阅如何编写MCVE的指南。您可以提供一些您已经尝试过的代码示例吗?请参阅如何编写MCVE的指南谢谢您的回答。恐怕我的问题有点不清楚;我已经在使用errback捕捉错误了——我希望的是从errback重新启动一个scrape,使用与以前不同的start\u url。当我输入这个时,我意识到这是一个很多问题,可能没有一个简单的方法来做,但其他的选择需要在这一次对程序进行太多的重组。谢谢你的回答。恐怕我的问题有点不清楚;我已经在使用errback捕捉错误了——我希望的是从errback重新启动一个scrape,使用与以前不同的start\u url。当我输入这个时,我意识到这是一个很大的问题,可能没有一个简单的方法来做,但其他的选择需要在这个时候对程序进行太多的重组。
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)