前言
我们在写爬虫的过程中,经常遇到爬取失败的情况,这个时候我们一般会通过try块去进行重试,但是每次都写那么一堆try块,真的是太麻烦,所以今天就来说一个比较pythonic的模块,retrying.
安装
retrying模块的安装很简单直接用匹配安装即可。
pip install retrying
retring模块通过装饰器的形式来进行重试操作的,首先我们看一个简单的例子
from retrying import retry @retry(stop_max_attempt_number=5,wait_random_min=1000,wait_random_max=5000) def run(): print("开始重试") raise NameError if __name__ == '__main__': run()
上面的代码干了哪些事呢,首先导入retring的retry模块
然后装饰一个run函数,然后调用run,函数内容很简单就是通过raise抛出一个异常,执行该代码我们发现。程序打印了五次开始重试,最后一次抛出异常,NameError。
到这里我们可以感受到重试了,就是这么简单的代码,就完成了五次重试,同时这五次重试的间隔时间也是不同的。
如果想尝试10次就把上面的stop_max_attempt_number=5,改成10即可,到这里就可以解释retry装饰器的参数了
stop_max_attempt_number:最大重试次数,超过这个次数会停止重试,并报异常。
wait_random_min:随机等待最小时间。
wait_random_max:随机等待最大时间。
好了retry的使用就是这么简单,在需要重试的函数上面加个装饰器就好了。
关键是装饰器里的参数的使用,下面列举了retrying的参数。
如果不写参数将会一直重试.
stop_max_attempt_number:在停止之前尝试的最大次数,最后一次如果还是有异常则会抛出异常,停止运行,默认为5次
@retry(stop_max_attempt_number=5) def run(): print("开始重试") raise NameError if __name__ == '__main__': run()
强调总次数。
stop_max_delay:最大延迟时间,大概意思就是:如果调用的函数出现异常,那么就会重复调用这个函数,最大调用时间,默认为100毫秒
from retrying import retry @retry(stop_max_delay=5000) def run(): print("开始重试") raise NameError if __name__ == '__main__': run()
会重试5秒钟,强调总时间。
wait_fixed:两次调用方法期间停留时长, 如果出现异常则会一直重复调用,默认 1000毫秒
from retrying import retry @retry(wait_fixed=2000) def run(): print("开始重试") raise NameError if __name__ == '__main__': run()
强调间隔时间。
wait_random_min:在两次调用方法停留时长,停留最短时间,默认为0
wait_random_max:在两次调用方法停留时长,停留最长时间,默认为1000毫秒
wait_incrementing_increment:每调用一次则会增加的时长,默认 100毫秒
wait_exponential_multiplier和wait_exponential_max:以指数的形式产生两次retrying之间的停留时间,产生的值为2^previous_attempt_number * wait_exponential_multiplier,previous_attempt_number是前面已经retry的次数,如果产生的这个值超过了wait_exponential_max的大小,那么之后两个retrying之间的停留值都为wait_exponential_max
retry_on_exception: 指定一个函数,如果此函数返回指定异常,则会重试,如果不是指定的异常则会退出
from retrying import retry def run2(exception): return isinstance(exception, ZeroDivisionError) @retry(retry_on_exception=run2) def run(): print("开始重试") a = 1 / 0 if __name__ == '__main__': run()
retry_on_result:指定一个函数,如果指定的函数返回True,则重试,否则抛出异常退出
from retrying import retry def run2(r): return isinstance(r, int) @retry(retry_on_result=run2) def run(): print("开始重试") a = 1 return a if __name__ == '__main__': run()
wrap_exception:参数设置为True/False,如果指定的异常类型,包裹在RetryError中,会看到RetryError和程序抛的Exception error
stop_func: 每次抛出异常时都会执行的函数,如果和stop_max_delay、stop_max_attempt_number配合使用,则后两者会失效
指定的stop_func会有两个参数:attempts, delay
wait_func:和stop_func用法差不多,不多描述
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
更新日志
- 小骆驼-《草原狼2(蓝光CD)》[原抓WAV+CUE]
- 群星《欢迎来到我身边 电影原声专辑》[320K/MP3][105.02MB]
- 群星《欢迎来到我身边 电影原声专辑》[FLAC/分轨][480.9MB]
- 雷婷《梦里蓝天HQⅡ》 2023头版限量编号低速原抓[WAV+CUE][463M]
- 群星《2024好听新歌42》AI调整音效【WAV分轨】
- 王思雨-《思念陪着鸿雁飞》WAV
- 王思雨《喜马拉雅HQ》头版限量编号[WAV+CUE]
- 李健《无时无刻》[WAV+CUE][590M]
- 陈奕迅《酝酿》[WAV分轨][502M]
- 卓依婷《化蝶》2CD[WAV+CUE][1.1G]
- 群星《吉他王(黑胶CD)》[WAV+CUE]
- 齐秦《穿乐(穿越)》[WAV+CUE]
- 发烧珍品《数位CD音响测试-动向效果(九)》【WAV+CUE】
- 邝美云《邝美云精装歌集》[DSF][1.6G]
- 吕方《爱一回伤一回》[WAV+CUE][454M]