requests使用retry策略

Posted thomaszdxsn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了requests使用retry策略相关的知识,希望对你有一定的参考价值。

网络请求往往会有很多不受控制的意外情况发生,有时候我们要让它let it crash,有时候我们想多尝试几次。

以前,使用retry策略,我一般会使用tenacity1这个第三方库。这个库的API相当得漂亮,很多大V也推荐过。

最近,我看了一篇文章2,是requests的作者之一写的。他告诉我们,requests原生就支持retry。

在urllib3中使用retry

urllib3使用PoolManager,可以对特定的response设置retry。

比如,下面我们对500错误进行了retry:

from urllib3.util import Retry
from urllib3 import PoolManager

retries = Retry(total=5, status_forcelist=[500])
manager = PoolManager(retries=retries)
response = manager.request('GET', 'https://httpbin.org/status/500')

在requests中使用retry

from requests.packages.urllib3.util import Retry
from requests.adapters import HTTPAdapter
from requests import Session, exceptions

s = Session()
s.mount('https://', HTTPAdapter(
    max_retries=Retry(total=5, status_forcelist=[500])
    )
)

s.get('https://httpbin.org/status/500')

可以看到requests的API一贯的简洁。另外需要知道的是这里利用了requests的"传输适配器(Transport Adapter)",如果你对这个不了解,请看这篇博客3.

以上是关于requests使用retry策略的主要内容,如果未能解决你的问题,请参考以下文章

如何在async.race函数中使用async.retry

使用requests爬取报错“Max retries exceeded with url“的解决方法

python http requests失败重试方法, 退避算法(Retrying HTTP Requests with Backoff)

python http requests失败重试方法, 退避算法(Retrying HTTP Requests with Backoff)

guava-retrying 源码解析(停止策略详解)

guava-retrying 源码解析(时间限制策略)