我们知道,在抓取数据时,多多少少会因为个别的原因(网络不好等)出现请求的故障,这样会影响我们抓取数据的效率,那遇到这样的问题我们该怎么解决呢?直接用try模式?这样会影响到抓取的数据量,这个时候retry函数就用到了。
安装
pip install retry
官方函数定义:
def retry(exceptions=Exception, tries=-1, delay=0, max_delay=None, backoff=1, jitter=0, logger=logging_logger):
"""Return a retry decorator.
:param exceptions:捕获异常或异常元组。 默认:Exception。
:param tries:Exception最大尝试次数。 默认值:-1(无限)。
:param delay:尝试之间的初始延迟。 默认值:0。
:param max_delay:延迟的最大值。 默认值:无(无限制)。
:param backoff:乘法器应用于尝试之间的延迟。 默认值:1(无退避)。
:param jitter:额外的秒数添加到尝试之间的延迟。 默认值:0。
如果数字固定,则随机如果范围元组(最小值,最大值)
:param logger:logger.warning(fmt,error,delay)将在失败尝试中调用。
默认值:retry.logging_logger。 如果无,则记录被禁用。
"""
用例1:
@retry(ZeroDivisionError, tries=3, delay=2)
def make_trouble():
'''Retry on ZeroDivisionError, raise error after 3 attempts, sleep 2 seconds between attempts.'''
print 'aaa'
a = 1/0
if __name__ == '__main__':
make_trouble()
输出结果如下:
aaa
aaa
Traceback (most recent call last):
File "E:/WORKSPACE/document/document/test/1.py", line 20, in <module>
make_trouble()
File "<decorator-gen-2>", line 2, in make_trouble
File "D:\python27\WinPython-64bit-2.7.10.3\python-2.7.10.amd64\lib\site-packages\retry\api.py", line 74, in retry_decorator
logger)
File "D:\python27\WinPython-64bit-2.7.10.3\python-2.7.10.amd64\lib\site-packages\retry\api.py", line 33, in __retry_internal
return f()
File "E:/WORKSPACE/document/document/test/1.py", line 16, in make_trouble
a = 1/0
ZeroDivisionError: integer division or modulo by zero
aaa
如果不带参数会认为是默认的参数,那么遇到异常时会一直retry下去,直到成功