首页  >  问答  >  正文

java - python使用httplib库如何实现请求失败重试机制?

高洛峰高洛峰2765 天前415

全部回复(2)我来回复

  • 迷茫

    迷茫2017-04-18 10:00:30

    谢天谢地我刚刚找到了解决方案

    用python爬虫抓站的一些技巧总结 - Python - 伯乐在线http://python.jobbole.com/81997/ 原文在这里

    def request(url, cookie='xxx', retries=5):
        ret = urlparse.urlparse(url)  # Parse input URL
        if ret.scheme == 'http':
            conn = httplib.HTTPConnection(ret.netloc)
        elif ret.scheme == 'https':
            conn = httplib.HTTPSConnection(ret.netloc)
    
        url = ret.path
        if ret.query: url += '?' + ret.query
        if ret.fragment: url += '#' + ret.fragment
        if not url: url = '/'
    
        try:
            conn.request(method='GET', url=url, headers={'Cookie': cookie})
            res = conn.getresponse()
        except Exception, e:
            print e.message
            if retries > 0:
                return request(url=url, retries= retries - 1)
            else:
                print 'GET Failed'
                return ''
        else:
            pass
        finally:
            pass
    
        if res.status != 200:
            return None
        return res.read()
    

    原理是用一个retries变量存储重试次数,然后每次异常处理的时候就递归本身并且将重试次数-1,判断如果重试次数小于0就直接return并且打出失败日志

    回复
    0
  • 大家讲道理

    大家讲道理2017-04-18 10:00:30

    递归调用自身进行retrycount来限制是一种最直接的方法。
    但是有个问题:
    如果对方地址只是暂时失败,比如重启服务了。立马重试还是失败,重试5次的时间很短,当对方服务好了之后这个请求就已经过掉了,因为重试了5次

    我用的机制是 重试五次,分别等待30s 1分钟 10分钟 30分钟 1个小时 如果还是失败就认为确实失败了。
    当然 这个用法是根据具体业务逻辑来做处理。不同的业务需求,对请求的要求也是不一样的。

    回复
    0
  • 取消回复