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 Exceptionres = 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 Exceptionres = 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 Exceptionres = 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 Exceptionres = 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 Exceptionres = baidu()
print(res)

05

有触发条件的retry语句

from tenacity import retry ,retry_if_exception_type ,retry_if_resultimport 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库 重试代码相关推荐

  1. python 加注拼音-一个将汉字转换成汉语拼音的python库的代码

    下边代码段是关于一个将汉字转换成汉语拼音的python库的代码. #!/usr/bin/env python """ Author:cleverdeng E-mail:c ...

  2. thinkphp跨库操作代码实例

    实例一:配置config.php文件配置多个数据库配置 'DB_CONFIG2' => 'mysql://root:1234@localhost:3306/thinkphp', 控制器中调用方法 ...

  3. Java写js的Ajax代码_用JS写的一个Ajax库(实例代码)

    myajax是一个用js编写的一个跨浏览器的ajax库,支持get, post, jsonp请求,精巧,简单. 一.发送GET请求: myajax.get({ data: {}, //参数 url: ...

  4. mysql创建数据表代码_MYSQL 简单的建库操作代码

    一.查询所有数据库 代码:show databases; 成功后如下图: 二.建立一个数据库 代码:create database test3: 成功后如下图: 三.连接数据库 代码:use test ...

  5. NTL密码算法开源库(数论库)代码分析项目--综述

    2021SC@SDUSC NTL密码算法开源库(数论库)代码分析项目--综述 项目综述 NTL开源代码库的安装和使用 NTL代码开源库主要解决的问题 项目分工以及核心代码的分配 项目综述 NTL算法库 ...

  6. python汉字转拼音代码,一个将汉字转换成汉语拼音的python库的代码

    下边代码段是关于一个将汉字转换成汉语拼音的python库的代码. #!/usr/bin/env python """ Author:cleverdeng E-mail:[ ...

  7. ios静态库和代码同名_使用一个代码库开始制作NativeScript iOS和Android应用程序

    ios静态库和代码同名 Users can choose whatever operating system they prefer, but every operating system use d ...

  8. mysql建库代码_MYSQL 简单的建库操作代码

    一.查询所有数据库 代码:show databases; 成功后如下图: 二.建立一个数据库 代码:create database test3: 成功后如下图: 三.连接数据库 代码:use test ...

  9. 长文梳理Muduo库核心代码及优秀编程细节剖析

    一.前言: 代码地址: https://github.com/yyg192/Cpp11-Muduo-MultiReactor  Muduo库是陈硕个人开发的Tcp网络编程库,支持Reactor模型.本 ...

  10. PyAudio库录音代码

    PyAudio库录音代码 PyAudio库安装 代码 PyAudio库安装 开始用的小写pyaudio,发现安装不上,这里需要用大写的. pip install PyAudio 代码 import p ...

最新文章

  1. 如何进行有效的需求调研
  2. keras 的使用例子
  3. springboot整合fastdfs
  4. UESTC 2014 Summer Training #19
  5. php 类自动执行方法,php类讲解8:PHP 自动加载类 __autoload() 方法
  6. sql去除字符串中首尾空格
  7. 博微软件网络服务器安装,负载均衡服务器nginx详细安装教程及网络部署
  8. 关于UI设计学习,推荐6个高质量的学习网站!
  9. android sdk所有版本下载,android sdk全平台版本集成
  10. delphi 通过TNetHTTPClient解析抖音无水印高清视频原理及解决X-Bogus签名验证2023-5-1
  11. Highcharts3D环形图
  12. Coremail2022Q4邮件安全报告:暴力破解骤降,盗号问题有所缓解?
  13. 【小程序模板】功能模块+红色招聘信息资讯小程序网页模板+行业职位招聘小程序+招聘信息网页下载
  14. Flutter 画面渲染的全面解析
  15. DSP 中的基础算法和模型的详细解析
  16. J0ker的CISSP之路: Why CISSP
  17. lynda.com教程之Learning Python and Django_手把手零基础搭建Django项目
  18. 解决Linux服务器中TCP的FIN_WAIT2,CLOSE_WAIT状态连接过多的问题
  19. 《分布式服务框架原理与实践》读书笔记2
  20. flex..................

热门文章

  1. VUE读取Vcard文件,并获取/筛选想要的内容
  2. 启动修复 您想用系统还原还原计算机吗,sony笔记本电脑如何恢复系统
  3. AI在线画图(文生图,通过文字绘制图片)
  4. 如何显示隐藏的 Chrome 扩展程序图标
  5. 新版Win10开机任务栏卡死的原因和解决方法
  6. android 清理缓存功能 的实现,android实现清理缓存功能
  7. 11.11如何卖到一个亿:从0到1的电商爆品打造术 电子书 PDF
  8. 数据集成之数据整合(Data Consolidation)
  9. 淘宝订单同步及解决方法
  10. 华为S5700交换机链路聚合配置