tenacity库 重试代码
00
前言
在爬虫过程中,经常会由于一些网络或其他不可控因素,从而遇到一些功能性问题。比如在发送请求时,会因为网络不稳定,往往会有请求超时的问题。这种情况下,我们通常会在代码中加入重试的代码。重试的代码本身不难实现,但如何写得优雅、易用,是我们要考虑的问题。
Tenacity是一个通用的retry库,简化为任何任务加入重试的功能,它实现了几乎我们可以使用到的所有重试场景。先pip为敬:
pip install tenacity
不懂这个库怎么用, 很简单,哦对了,可能还需要你知道装饰器就是那个@啦就够了,上菜!
01
无条件重试,重试之间无间隔
import tenacity
import requests
# 直接加上retry装饰器,代码抛出异常会一直重试,直到代码运行成功
@tenacity.retry()
def baidu():
response = requests.get(url = 'http://www.baidu.com')
if response.status_code == 200:
return response.text
raise Exception
res = baidu()
print(res)
这里呢,我们使用requests请求了百度,并输出response,在code=200的位置上,如果code不等于200,这个程序就会被retry重试。理就是这么个理,够不够优雅?
无条件重试,但是在重试之前要等待 3秒:
from tenacity import retry , stop_after_attempt , stop_after_delay , wait_fixed
import requests
# 在程序重试前固定等待时间
@retry(wait = wait_fixed(3))
def baidu():
web = requests.get(url = 'http://www.baidu.com')
if web.status_code == 200:
return web.text
raise Exception
res = baidu()
print(res)
02
设置停止的基本条件
只重试3次
from tenacity import retry,stop_after_attempt
import requests
# 加上终止条件的retry
# 重试三次之后不再重试
@retry(stop=stop_after_attempt(3))
def baidu():
res = requests.get(url = 'http://www.baidu.com')
if res.status_code == 200:
return res.text
raise Exception
web = baidu()
print(web)
这次呢还是访问百度,但是加了一个条件,可以看到哈,重试三次之后不再重试,一般用于使用账号密码登录的爬虫,有的账号一天只能登录5次,超过5次就无法登录了
在运行程序的时候,使用retry + stop_after_attempt()简直就是用了飘柔一样的柔顺啊!!!
重试5秒后不再重试
from tenacity import retry , stop_after_attempt , stop_after_delay
import requests
# 指定5s重试间隔
@retry(stop=stop_after_delay(5))
def baidu():
web = requests.get(url = 'http://www.baidu.com')
if web.status_code == 200:
return web.text
raise Exception
res = baidu()
print(res)
用|连接多个重试条件
from tenacity import retry , stop_after_attempt , stop_after_delay
import requests
# 使用'|' 连接多个条件组合使用
@retry(stop=stop_after_delay(5) | stop_after_attempt(3))
def baidu():
web = requests.get(url = 'http://www.baidu.com')
if web.status_code == 200:
return web.text
raise Exception
res = baidu()
print(res)
03
在重试前设置随机等待时间
from tenacity import retry , stop_after_attempt , stop_after_delay , wait_fixed , wait_random
import requests
# 在程序重试前设置随机等待时间
@retry(wait = wait_random(min=1,max=2))
def baidu():
web = requests.get(url = 'http://www.baidu.com')
if web.status_code == 200:
return web.text
raise Exception
res = baidu()
print(res)
04
按照指定数等待时间
from tenacity import retry , stop_after_attempt , stop_after_delay , wait_fixed , wait_random , wait_exponential
import requests
# 按照指定数等待时间
@retry(wait = wait_exponential(multiplier=2,min = 3,max = 100))
def baidu():
web = requests.get(url = 'http://www.baidu.com')
if web.status_code == 200:
return web.text
raise Exception
res = baidu()
print(res)
05
有触发条件的retry语句
from tenacity import retry ,retry_if_exception_type ,retry_if_result
import requests
# 有触发条件的retry语句
@ retry(retry = retry_if_exception_type(IOError))
def fun_1():
print('巴拉巴拉巴拉巴拉')
raise Exception
def fun_2(value):
return value is None
@ retry(retry = retry_if_exception_type(fun_2))
def fun_3():
print('滴滴滴滴滴')
@ retry(retry=(retry_if_result(fun_2)|retry_if_exception_type()))
def fun_4():
print('呼呼呼呼呼呼')
06
在retry前后增加log
from tenacity import retry , stop_after_attempt ,before_log ,after_log , before_sleep_log
import logging
logger = logging.getLogger(__name__)
@ retry(stop = stop_after_attempt(3),before = before_log(logger,logging.DEBUG))
def fun_1():
raise Exception('Error')
@ retry(stop = stop_after_attempt(3),after = after_log(logger,logging.DEBUG))
def fun_2():
raise Exception('Error')
@ retry(stop = stop_after_attempt(3),before_sleep = before_sleep_log(logger,logging.DEBUG))
def fun_3():
raise Exception('Error')
就是这么easy~~~~~~
tenacity库 重试代码相关推荐
- python 加注拼音-一个将汉字转换成汉语拼音的python库的代码
下边代码段是关于一个将汉字转换成汉语拼音的python库的代码. #!/usr/bin/env python """ Author:cleverdeng E-mail:c ...
- thinkphp跨库操作代码实例
实例一:配置config.php文件配置多个数据库配置 'DB_CONFIG2' => 'mysql://root:1234@localhost:3306/thinkphp', 控制器中调用方法 ...
- Java写js的Ajax代码_用JS写的一个Ajax库(实例代码)
myajax是一个用js编写的一个跨浏览器的ajax库,支持get, post, jsonp请求,精巧,简单. 一.发送GET请求: myajax.get({ data: {}, //参数 url: ...
- mysql创建数据表代码_MYSQL 简单的建库操作代码
一.查询所有数据库 代码:show databases; 成功后如下图: 二.建立一个数据库 代码:create database test3: 成功后如下图: 三.连接数据库 代码:use test ...
- NTL密码算法开源库(数论库)代码分析项目--综述
2021SC@SDUSC NTL密码算法开源库(数论库)代码分析项目--综述 项目综述 NTL开源代码库的安装和使用 NTL代码开源库主要解决的问题 项目分工以及核心代码的分配 项目综述 NTL算法库 ...
- python汉字转拼音代码,一个将汉字转换成汉语拼音的python库的代码
下边代码段是关于一个将汉字转换成汉语拼音的python库的代码. #!/usr/bin/env python """ Author:cleverdeng E-mail:[ ...
- ios静态库和代码同名_使用一个代码库开始制作NativeScript iOS和Android应用程序
ios静态库和代码同名 Users can choose whatever operating system they prefer, but every operating system use d ...
- mysql建库代码_MYSQL 简单的建库操作代码
一.查询所有数据库 代码:show databases; 成功后如下图: 二.建立一个数据库 代码:create database test3: 成功后如下图: 三.连接数据库 代码:use test ...
- 长文梳理Muduo库核心代码及优秀编程细节剖析
一.前言: 代码地址: https://github.com/yyg192/Cpp11-Muduo-MultiReactor Muduo库是陈硕个人开发的Tcp网络编程库,支持Reactor模型.本 ...
- PyAudio库录音代码
PyAudio库录音代码 PyAudio库安装 代码 PyAudio库安装 开始用的小写pyaudio,发现安装不上,这里需要用大写的. pip install PyAudio 代码 import p ...
最新文章
- 如何进行有效的需求调研
- keras 的使用例子
- springboot整合fastdfs
- UESTC 2014 Summer Training #19
- php 类自动执行方法,php类讲解8:PHP 自动加载类 __autoload() 方法
- sql去除字符串中首尾空格
- 博微软件网络服务器安装,负载均衡服务器nginx详细安装教程及网络部署
- 关于UI设计学习,推荐6个高质量的学习网站!
- android sdk所有版本下载,android sdk全平台版本集成
- delphi 通过TNetHTTPClient解析抖音无水印高清视频原理及解决X-Bogus签名验证2023-5-1
- Highcharts3D环形图
- Coremail2022Q4邮件安全报告:暴力破解骤降,盗号问题有所缓解?
- 【小程序模板】功能模块+红色招聘信息资讯小程序网页模板+行业职位招聘小程序+招聘信息网页下载
- Flutter 画面渲染的全面解析
- DSP 中的基础算法和模型的详细解析
- J0ker的CISSP之路: Why CISSP
- lynda.com教程之Learning Python and Django_手把手零基础搭建Django项目
- 解决Linux服务器中TCP的FIN_WAIT2,CLOSE_WAIT状态连接过多的问题
- 《分布式服务框架原理与实践》读书笔记2
- flex..................