Scrapy:如何捕获下载错误并重试下载
在我进行爬虫的时候,有些页面因为意外的重定向而没有返回响应,导致请求失败。我想知道怎么才能捕捉到这种错误,并且重新请求原始的URL,而不是被重定向后的URL。
在我来这里提问之前,我在谷歌上搜索了很多,发现有两种方法可以解决这个问题。一种是在下载中间件中捕捉异常,另一种是在爬虫请求的错误回调中处理下载异常。对于这两种方法,我有一些疑问。
- 对于方法一,我不知道怎么把原始的URL传递给process_exception函数。下面是我尝试过的示例代码。
class ProxyMiddleware(object): def process_request(self, request, spider): request.meta['proxy'] = "http://192.168.10.10" log.msg('>>>> Proxy %s'%(request.meta['proxy'] if request.meta['proxy'] else ""), level=log.DEBUG) def process_exception(self, request, exception, spider): log_msg('Failed to request url %s with proxy %s with exception %s' % (request.url, proxy if proxy else 'nil', str(exception))) #retry again. return request
对于方法二,我不知道怎么把外部参数传递给爬虫中的errback函数。我不知道怎么从这个errback函数中获取原始的URL,以便重新请求。
下面是我尝试的方法二的示例:
class ProxytestSpider(Spider): name = "proxytest" allowed_domains = ["baidu.com"] start_urls = ( 'http://www.baidu.com/', ) def make_requests_from_url(self, url): starturl = url request = Request(url, dont_filter=True,callback = self.parse, errback = self.download_errback) print "make requests" return request def parse(self, response): pass print "in parse function" def download_errback(self, e): print type(e), repr(e) print repr(e.value) print "in downloaderror_callback"
对于这个重新爬取的问题,任何建议都非常感谢。提前谢谢大家。
祝好
Bing
2 个回答
0
你可以在settings.py文件中覆盖RETRY_HTTP_CODES这个设置。
这是我用来处理代理错误的设置:
RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 403, 404, 408]
2
你可以把一个叫做“lambda”的东西当作错误处理函数来用:
request = Request(url, dont_filter=True,callback = self.parse, errback = lambda x: self.download_errback(x, url))
这样的话,你就可以在这个错误处理函数里面访问到网址(url)了:
def download_errback(self, e, url):
print url