python requests爬虫的重试机制
0 背景
reuquests
是我们爬虫工作中非常常用的一个爬虫框架, 有时, 我们的爬虫引擎在抓取网站的过程, 可能会因为网络不稳定 & 服务器繁忙负载过高 & 任务中断 & 反爬等一些特殊的原因, 导致爬虫异常, 这种情况有时是一种偶然, 那么在这些偶然的情况下, 或许我们重新多去模拟请求几次, 才能抓到正确的响应的数据. 因此, 我们需要采取一些措施, 在抓取过程出现异常的时候进行多次重试抓取, 以增加我们抓取请求成功的机会.
Retry
是 requests
中的一个用于处理请求重试的类,通常与 Session
对象一起使用. 因为我们可以通过它自带的方法, 在爬虫发生特定类型的请求错误时自动进行重试.
因此, 一些基本的请求重试, 我们可以使用requeets
自带的方法, 去完成我们的爬虫请求重试.
1 使用
requests
库内置了一种简单的重试机制,可以使用 Retry
类来设置, 超时自动重试.
import requests
from requests.adapters import Retry, HTTPAdapter
s = requests.session()
retries = Retry(total=3, backoff_factor=0.5, )
s.mount('http://', HTTPAdapter(max_retries=retries))
s.mount('https://', HTTPAdapter(max_retries=retries))
res = s.get('http://127.0.0.1:5000/test_timeout', timeout=(1, 4))
print(res.text)
其中, Retry
对象可以如下设置:
retries = Retry(
total=3,
backoff_factor=0.5,
status_forcelist=[500, 502, 503, 504],
)
Retry
对象具有许多参数,可以用来配置重试的行为, 以下是 Retry
对象的主要参数及其含义:
-
total: 最大重试次数,默认为3。指定请求的最大重试次数。
-
connect: 一种可以重试的连接错误(如连接超时),默认为
None
。可以是一个异常类或者异常类的元组,当发生指定的连接错误时,请求将会重试。 -
read: 一种可以重试的读取错误,通常是服务器断开连接导致的。默认为
None
。可以是一个异常类或者异常类的元组,当发生指定的读取错误时,请求将会重试。 -
redirect: 是否重试对重定向的请求, 默认为
False
。如果设置为True
,那么对于某些特定的重定向(例如,由于网络问题导致的重定向),请求将会重试。 -
status: 一种可以重试的HTTP状态码,可以是一个整数、一个整数元组或者一个
True/False
值。默认为None
。如果设置为一个整数,表示当发生指定状态码时,请求将会重试。如果设置为一个元组,表示当状态码在元组中时,请求将会重试。如果设置为True
,表示任何非200系列的状态码都会被视为需要重试的状态码。 -
backoff_factor: 重试之间的退避因子,用于计算重试之间的等待时间。默认为1,即重试之间等待时间不变。如果设置为0.1,那么第一次重试将等待1秒,第二次等待1.1秒,第三次等待1.21秒,以此类推, 这个可以避免一些因较快频率导致的请求失败出现的情况。
-
status_forcelist: 一种强制重试的HTTP状态码列表,默认为
None
。与status
参数不同,这个参数表示任何在列表中的状态码都会被强制视为需要重试的状态码,不论status
参数如何设置。
另外, timeout=(1, 4)
中的1和4分别表示连接超时时间和读取超时时间:
-
建立连接的超时时间为1秒:如果在1秒内无法建立与目标服务器的连接,请求会抛出一个连接超时的异常。 -
读取数据的超时时间为4秒:一旦成功建立连接,服务器有3秒的时间来发送响应。如果在3秒内没有收到完整的响应数据,请求会抛出一个读取超时的异常。
2 关于
欢迎关注我的微信公众号
原文始发于微信公众号(其之):python requests爬虫的重试机制
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/204878.html