为了避免由于一些网络或等其他不可控因素,而引起的功能性问题。比如在发送请求时,会因为网络不稳定,往往会有请求超时的问题。

这种情况下,我们通常会在代码中加入重试的代码。重试的代码本身不难实现,但如何写得优雅、易用,是我们要考虑的问题。

这里要给大家介绍的是一个第三方库 - Tenacity ,它实现了几乎我们可以使用到的所有重试场景,比如:

在什么情况下才进行重试?

重试几次呢?

重试多久后结束?

每次重试的间隔多长呢?

重试失败后的回调?

在使用它之前 ,先要安装它

$pip install tenacity

1. 最基本的重试

无条件重试,重试之间无间隔

from tenacity import retry

@retry

def test_retry():

print("等待重试,重试无间隔执行...")

raise Exception

test_retry()

无条件重试,但是在重试之前要等待 2 秒

from tenacity import retry, wait_fixed

@retry(wait=wait_fixed(2))

def test_retry():

print("等待重试...")

raise Exception

test_retry()

2. 设置停止基本条件

只重试7 次

from tenacity import retry, stop_after_attempt

@retry(stop=stop_after_attempt(7))

def test_retry():

print("等待重试...")

raise Exception

test_retry()

重试 10 秒后不再重试

from tenacity import retry, stop_after_delay

@retry(stop=stop_after_delay(10))

def test_retry():

print("等待重试...")

raise Exception

test_retry()

或者上面两个条件满足一个就结束重试

from tenacity import retry, stop_after_delay, stop_after_attempt

@retry(stop=(stop_after_delay(10) | stop_after_attempt(7)))

def test_retry():

print("等待重试...")

raise Exception

test_retry()

3. 设置何时进行重试

在出现特定错误/异常(比如请求超时)的情况下,再进行重试

from requests import exceptions

from tenacity import retry, retry_if_exception_type

@retry(retry=retry_if_exception_type(exceptions.Timeout))

def test_retry():

print("等待重试...")

raise exceptions.Timeout

test_retry()

在满足自定义条件时,再进行重试。

如下示例,当 test_retry 函数返回值为 False 时,再进行重试

from tenacity import retry, stop_after_attempt, retry_if_result

def is_false(value):

return value is False

@retry(stop=stop_after_attempt(3),

retry=retry_if_result(is_false))

def test_retry():

return False

test_retry()

4. 重试后错误重新抛出

当出现异常后,tenacity 会进行重试,若重试后还是失败,默认情况下,往上抛出的异常会变成 RetryError,而不是最根本的原因。

因此可以加一个参数(reraise=True),使得当重试失败后,往外抛出的异常还是原来的那个。

from tenacity import retry, stop_after_attempt

@retry(stop=stop_after_attempt(7), reraise=True)

def test_retry():

print("等待重试...")

raise Exception

test_retry()

5. 设置回调函数

当最后一次重试失败后,可以执行一个回调函数

from tenacity import *

def return_last_value(retry_state):

print("执行回调函数")

return retry_state.outcome.result() # 表示返回原函数的返回值

def is_false(value):

return value is False

@retry(stop=stop_after_attempt(3),

retry_error_callback=return_last_value,

retry=retry_if_result(is_false))

def test_retry():

print("等待重试中...")

return False

print(test_retry())

输出如下

等待重试中...

等待重试中...

等待重试中...

执行回调函数

False

python爬虫网络中断_Python 爬虫总是超时中断?试试Tenacity重试模块相关推荐

  1. python爬虫开发环境_python爬虫开发教程下载|Python爬虫开发与项目实战(范传辉 著)pdf 完整版_ - 极光下载站...

    Python爬虫开发与项目实战pdf扫描版下载.Python爬虫开发是一个Pthyon编程语言与HTML基础知识引领读者入门知识,重点讲述了云计算的相关内容及其在爬虫中的应用,进而介绍如何设计自己的爬 ...

  2. python爬虫今日头条_python爬虫—分析Ajax请求对json文件爬取今日头条街拍美图

    python爬虫-分析Ajax请求对json文件爬取今日头条街拍美图 前言 本次抓取目标是今日头条的街拍美图,爬取完成之后,将每组图片下载到本地并保存到不同文件夹下.下面通过抓取今日头条街拍美图讲解一 ...

  3. python爬虫面试问题_Python爬虫面试总结

    ## Python爬虫面试总结 1. 写一个邮箱地址的正则表达式? [A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$ 2. 谈 ...

  4. python爬虫知识大全_Python爬虫入门有哪些基础知识点

    1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.想抓取什么?这个由你来控制它咯. ...

  5. python爬虫的用途_python爬虫用途

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 专业点来说就是应用多台机器同时实现爬虫任务,这多台机器上的爬虫,就是称作分布式爬 ...

  6. python爬取网页内容_Python爬虫原理解析

    笔者公众号:技术杂学铺 笔者网站:mwhitelab.com 本文将从何为爬虫.网页结构.python代码实现等方面逐步解析网络爬虫. 1. 何为爬虫 如今互联网上存储着大量的信息. 作为普通网民,我 ...

  7. python爬虫酷狗_python爬虫教程:爬取酷狗音乐,零基础小白也能爬取哦

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:python学习教程 ( 想要学习Python?Pyt ...

  8. origin和python有什么不同_python爬虫之git的使用(origin说明)

    1.首先我们回忆两个命令 #git remote add origin 远程仓库链接 #git push -u origin master 我们一起看看这个命令,git是git的一级命令,push就是 ...

  9. python爬虫防屏蔽_python爬虫程序如何预防被限制

    有一些网站不喜欢被爬虫程序访问,所以会检测连接对象,如果是爬虫程序,也就是非人点击访问,它就会不让你继续访问,所以为了要让程序可以正常运行,需要隐藏自己的爬虫程序的身份.此时,我们就可以通过设置Use ...

最新文章

  1. 外观模式 - 设计模式学习
  2. SQL server2008 无法启动调试存储过程
  3. 计算机视觉开源库OpenCV之查找轮廓函数cv2.findContours()介绍
  4. Protobuf在Unity中的通讯使用
  5. linux中更新perl的版本
  6. Windows Embedded从入门到精通4月预告
  7. Python程序开发——第四章 字典与集合
  8. autoupdater 更新后重新运行_Windows 10 总是自动更新?这几个方法教你关闭它
  9. 制作 macOS High Sierra U盘USB启动安装盘方法教程 (全新安装 Mac 系统)
  10. python期末复习卷_【期末复习卷A】六年级科学上册期末复习试题
  11. cpu相关信息(进程、线程、核...)
  12. HG255d 刷最新openwrt Pandorabox并安装njit拨号
  13. ICCV 2021可逆的跨空间映射实现多样化的图像风格传输:Diverse Image Style Transfer via Invertible Cross-Space Mapping
  14. 动态lacp和静态lacp区别_LACP学习笔记
  15. 如何将已有项目导入SVN
  16. 如何获取MySQL中表的最后更新时间
  17. 寻找全排列的下一个数
  18. 关于数据中台、数据平台、数据仓库、数据湖等数据概念的对比解析
  19. Android Weekly #30
  20. Codeforces Round #439 (Div. 2) C.The Intriguing Obsession(组合数、记忆化搜索)

热门文章

  1. 2012-01-17-03
  2. python清理垃圾_用Python自动清理系统垃圾,再也不用360安全卫士了
  3. 2017.9.9 股票交易 思考记录
  4. 2017.8.17 陌上花开 思考记录
  5. 三维旋转四元数系列(2.三维旋转之轴角与罗德里格斯公式推导)
  6. linux信号及其含义
  7. 计算机和绘画的论文,浅析毕沙罗的绘画风格
  8. java关键字const_Java 中的 volatile 关键字
  9. java代码调用python_java调用python代码-阿里云开发者社区
  10. java键盘输入到文件中_在Linux中使用java和javac命令编译运行java文件