在我抓取过程中,由于意外重定向而导致某些页面失败,并且未返回任何响应。如何捕获此类错误并使用原始网址重新安排请求,而不是使用重定向的网址?
在我问这里之前,我在Google上做了很多搜索。看起来有两种方法可以解决这个问题。一个是下载中间件中的catch异常,另一个是在spider的请求中处理errback中的下载异常。对于这两个问题,我有一些问题。
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
对于方法2,我不知道如何将外部参数传递给蜘蛛中的errback函数。我不知道如何从这个errback函数中检索原始url来重新安排请求。
以下是我尝试使用方法2的示例:
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"
对此重新抓取问题的任何建议都非常感谢。提前谢谢。
此致
冰
答案 0 :(得分:1)
你可以将lambda作为errback传递:
request = Request(url, dont_filter=True,callback = self.parse, errback = lambda x: self.download_errback(x, url))
这样你就可以访问errback函数中的url:
def download_errback(self, e, url):
print url
答案 1 :(得分:0)
您可以覆盖settings.py
中的RETRY_HTTP_CODES这是我用于代理错误的设置:
RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 403, 404, 408]