搜尋

首頁  >  問答  >  主體

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

高洛峰高洛峰2766 天前416

全部回覆(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
  • 取消回覆