python程序的重试机制,在爬虫,http请求获取数据的时候比较常用。
import requests
def url_retry(url,num_retries=3):
print("access!")
try:
request = requests.get(url,timeout=60)
#raise_for_status(),如果不是200会抛出HTTPError错误
request.raise_for_status()
html = request.content
except requests.HTTPError as e:
html=None
if num_retries>0:
#如果不是200就重试,每次递减重试次数
return url_retry(url,num_retries-1)
#如果url不存在会抛出ConnectionError错误,这个情况不做重试
except requests.exceptions.ConnectionError as e:
return
return html装饰器实现:
import requests
#定义一个重试修饰器,默认重试一次
def retry(num_retries=1):
#用来接收函数
def wrapper(func):
#用来接收函数的参数
def wrapper(*args,**kwargs):
#为了方便看抛出什么错误定义一个错误变量
last_exception =None
#循环执行包装的函数
for _ in range(num_retries):
try:
#如果没有错误就返回包装的函数,这样跳出循环
return func(*args, **kwargs)
except Exception as e:
#捕捉到错误不要return,不然就不会循环了
last_exception = e
#如果要看抛出错误就可以抛出
# raise last_exception
return wrapper
return wrapper
if __name__=="__main__":
@retry(5)
def url_retry(url):
request = requests.get(url, timeout=60)
print("access!")
request.raise_for_status()
html = request.content
print(html)
return html
url_retry(url)