在我的爬行过程中,一些页面由于意外重定向而失败并且没有返回响应。如何捕获此类错误并使用原始 url(而不是重定向的 url)重新安排请求?
在我问这里之前,我用谷歌做了很多搜索。看起来有两种方法可以解决这个问题。一种是在下载中间件中捕获异常,另一种是在spider请求的errback中处理下载异常。对于这两个问题,我有一些疑问。
- 对于方法1,我不知道如何将原始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
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"
对此重新抓取问题的任何建议都将受到高度赞赏。提前致谢。
Regards
Bing
您可以将 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)