我们在使用requests连接网址后,获取网络响应的时候,有时候可能会遇到这样的问题:
问题:
Maxretries exceeded with url: /tags-%E9%A1%B9%E7%9B%AE-5.html(Caused
by SSLError(SSLEOFError(8,‘EOFoccurred in violation of
protocol(ssl.c:1129)’)))
这是指,在使用 requests 库或其他 HTTP 客户端库时,尝试对一个 URL 进行请求时超出了最大重试次数,并且在重试过程中遇到了 SSL 协议错误。
错误的原理:
-
requests 库允许用户,为发送的请求设置重试逻辑。如果请求连续失败达到设定的次数,就会抛出这个错误。
-
SSLEOFError(8,‘EOF occurred in violation of protocol’) 是指, SSL/TLS 加密的 HTTPS 请求过程中发生了一个 EOF(文件结束)错误。在 SSL 握手过程中,连接意外地结束了,这违反了 SSL 协议。
解决办法:
这时候可以使用 requests 的 Session
对象,并设置 mount 方法来配置 HTTPAdapter,包括重试策略,例如:
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry
session = requests.Session()
# 设置重试策略
retries = Retry(total=5, backoff_factor=1, status_forcelist=[502, 503, 504])
session.mount('http://', HTTPAdapter(max_retries=retries))
# 设置默认headers
session.headers.update({'User-Agent': 'my-app/0.0.1'})
# 发送请求
response = session.get('https://example.com')
# 打印状态码和响应内容
print(response.status_code)#状态码
print(response.text) #响应内容
# 会话结束
session.close()
Session 对象是一种会话对象,它允许你跨请求保持某些参数和Cookie。
Session 对象发送请求时返回的是 requests 的 Response 对象,这个对象封装了服务器响应的所有信息,如状态码、响应头、内容等。
Session 对象可以保持会话状态,这对于模拟登录状态非常有用,因为你可以保持身份验证Cookie。
同时,在session里,我们还能在遇到特定状态码或异常时,自动请求重试,例如
“retries = Retry(total=5, backoff_factor=1, status_forcelist=[502, 503, 504]) ”
这一列就是在遇到错误状态码时重新连接。
具体代表的意思是:
total: 表示最大重试次数,包括初次请求。在这个例子中,total=5 意味着如果初次请求失败,将总共尝试5次。
backoff_factor: 表示重试之间的延迟因子。这个因子将用于计算重试前的等待时间。
backoff_factor=1 意味着重试前的等待时间将是从1秒开始指数增长(如果使用默认的退避策略)。
status_forcelist: 这是一个状态码列表,也就是接收到这些状态码时,会触发重试的请求。
在这个例子中,status_forcelist=[502, 503, 504] 表示当响应的状态码是502(Bad Gateway)、503(Service Unavailable)或504(Gateway Timeout)时,将触发重试。
当然还有一些429,404,402等可能会出现的错误状态码也可以加进去~
一些其他的解决方法:
1.增加超时时间:如果网络不稳定,尝试增加请求的超时时间。
2.检查服务器:确认服务器端是否正常工作,没有遇到错误或配置问题。
3.更新客户端 SSL/TLS 配置:确保客户端使用正确的证书和协议版本。
-
检查本地网络连接:确保本地网络连接稳定,没有被防火墙或代理阻止。
-
一些不靠谱的建议:第二天重启电脑再连网的时候就没事了(又多了摸鱼的理由!哈哈哈哈)