迷茫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並且打出失敗日誌
大家讲道理2017-04-18 10:00:30
遞歸呼叫自身進行retrycount來限制是一種最直接的方法。
但是有個問題:
如果對方地址只是暫時失敗,例如重啟服務了。立刻重試還是失敗,重試5次的時間很短,當對方服務好了之後這個請求就已經過掉了,因為重試了5次
我用的機制是 重試五次,分別等待30s 1分鐘 10分鐘 30分鐘 1個小時 如果還是失敗就認為確實失敗了。
當然 這個用法是根據具體業務邏輯來做處理。不同的業務需求,對請求的要求也是不一樣的。