java - python使用httplib库如何实现请求失败重试机制?
高洛峰
高洛峰 2017-04-18 09:58:30
0
2
412
高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(2)
迷茫

謝天謝地我剛剛找到了解決方案

用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並且打出失敗日誌

大家讲道理

遞歸呼叫自身進行retrycount來限制是一種最直接的方法。
但是有個問題:
如果對方地址只是暫時失敗,例如重啟服務了。立刻重試還是失敗,重試5次的時間很短,當對方服務好了之後這個請求就已經過掉了,因為重試了5次

我用的機制是 重試五次,分別等待30s 1分鐘 10分鐘 30分鐘 1個小時 如果還是失敗就認為確實失敗了。
當然 這個用法是根據具體業務邏輯來做處理。不同的業務需求,對請求的要求也是不一樣的。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!