Scrapy:如何捕获下载错误并重试下载

7 投票
2 回答
4610 浏览
提问于 2025-04-18 12:04

在我进行爬虫的时候,有些页面因为意外的重定向而没有返回响应,导致请求失败。我想知道怎么才能捕捉到这种错误,并且重新请求原始的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

撰写回答