爬虫老崩溃咋整 ?retrying模块了解一下!

简介: retrying模块的学习我们在写爬虫的过程中,经常遇到爬取失败的情况,这个时候我们一般会通过try块去进行重试,但是每次都写那么一堆try块,真的是太麻烦,所以今天就来说一个比较pythonic的模块,retrying.安装retring模块的安装很简单直接用匹配安装即可。

retrying模块的学习

我们在写爬虫的过程中,经常遇到爬取失败的情况,这个时候我们一般会通过try块去进行重试,但是每次都写那么一堆try块,真的是太麻烦,所以今天就来说一个比较pythonic的模块,retrying.

安装

retring模块的安装很简单直接用匹配安装即可。

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_multiplierwait_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_delaystop_max_attempt_number配合使用,则后两者会失效

指定的stop_func会有两个参数:attempts, delay

wait_func:和stop_func用法差不多,不多描述

看不懂的小伙伴儿可以留言。

目录
相关文章
|
数据采集 Web App开发 JSON
Python爬虫:关于scrapy模块的请求头
Python爬虫:关于scrapy模块的请求头
562 0
Python爬虫:关于scrapy模块的请求头
|
5月前
|
数据采集 JSON 数据格式
三:《智慧的网络爬虫》— 网络请求模块(下)
本篇文章讲解了网络请求模块中Requests模块的get请求和post请求,并用十几张图示详细介绍了爬虫工具库与开发者工具的操作与使用;同时本篇文章也列举了多个代码示例如:对搜狗网页的爬取;爬取360翻译(中英文互译程序)并以此介绍了重放请求(通过重放请求来确定反爬参数)以及Cookie与Session实战案例 -- 爬取12306查票
66 9
三:《智慧的网络爬虫》—  网络请求模块(下)
|
5月前
|
数据采集 数据安全/隐私保护 Python
二:《智慧的网络爬虫》— 网络请求模块(上)
网络请求模块就是帮助浏览器(客户端)向服务器发送请求的​。在Python3之前的版本(Python2版本)中所使用的网络请求模块是urllib模块​;在Python3现在的版本中通过urllib模块进行升级 有了现在所使用的requests模块,也就是requests模块是基于urllib模块进行开发的。本篇文章讲解的是urllib模块。
57 2
二:《智慧的网络爬虫》—  网络请求模块(上)
|
数据采集 IDE 关系型数据库
Python编程:PyThink数据库交互模块提高爬虫编写速度
Python编程:PyThink数据库交互模块提高爬虫编写速度
121 0
Python编程:PyThink数据库交互模块提高爬虫编写速度
|
数据采集 JSON 数据格式
python爬虫urllib3模块详解
python爬虫urllib3模块详解
522 1
python爬虫urllib3模块详解
|
数据采集 网络安全 Python
python爬虫——request模块讲解
python爬虫——request模块讲解
370 0
python爬虫——request模块讲解
|
数据采集 XML 数据格式
python爬虫——Beautiful Soup库(数据解析)模块讲解
python爬虫——Beautiful Soup库(数据解析)模块讲解
222 0
python爬虫——Beautiful Soup库(数据解析)模块讲解
|
数据采集 IDE 关系型数据库
Python编程:PyThink数据库交互模块提高爬虫编写速度
Python编程:PyThink数据库交互模块提高爬虫编写速度
158 0
|
数据采集 Python
Python爬虫:selenium模块基本使用
Python爬虫:selenium模块基本使用
144 0
|
数据采集 Python
Python爬虫:pyquery模块解析网页
Python爬虫:pyquery模块解析网页
137 0