Python 中错误 ConnectionError: Max retries exceeded with url
出现错误“ConnectionError: Max retries exceeded with url”有多种原因:
-
向
request.get()
方法传递了不正确或不完整的 URL。 - 我们正受到 API 的速率限制。
- requests 无法验证您向其发出请求的网站的 SSL 证书。
确保我们指定了正确且完整的 URL 和路径。
# ⛔️ 未指定协议 (https://)
example.com/posts
# ✅ 完整网址的示例
https://example.com/posts
仔细检查我们没有在 URL 和路径中输入任何错误。
使用 Retry 对象进行回退重试
解决该错误的一种方法是使用 Retry
对象并指定要重试多少次与连接相关的错误,并设置在两次尝试之间应用的退避因子。
import requests
from requests.adapters import HTTPAdapter, Retry
def make_request():
session = requests.Session()
retry = Retry(connect=3, backoff_factor=0.5)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
url = 'https://example.com/api/users'
response = session.get(url)
parsed = response.json()
print(parsed)
make_request()
Session 对象允许我们跨请求保留某些参数。
我们将以下关键字参数传递给 Retry 对象:
- connect - 要重试的与连接相关的错误数
- backoff_factor - 第二次尝试后在两次尝试之间应用的退避因子。
上面的示例在第二次尝试后以 0.5 秒的退避因子重试请求 3 次。
使用 try/except 语句在发生错误时不重试
如果不想在发生错误时重试,也可以使用 try/except
块。
import requests
def make_request():
try:
url = 'https://example.com/api/users'
response = requests.get(url, timeout=30)
parsed = response.json()
print(parsed)
except requests.exceptions.ConnectionError:
# 👇️ handle error here or use a `pass` statement
print('connection error occurred')
make_request()
如果 try
块中出现连接错误,except
块将运行。
禁用 SSL 证书验证
如果由于请求无法验证站点的 SSL 证书而收到错误,您可以将验证关键字参数设置为 False 以禁用请求的 SSL 证书验证。
请注意
,我们应该只在本地开发或测试期间禁用 SSL 证书验证,因为它可能会使我们的应用程序容易受到中间人攻击。
import requests
def make_request():
try:
url = 'https://example.com/api/users'
# 👇️ 将验证设置为 False
response = requests.get(url, verify=False, timeout=30)
parsed = response.json()
print(parsed)
except Exception as e:
print(e)
make_request()
使用 time.sleep() 方法实现请求之间的延迟
另一种解决方案是使用 time.sleep()
方法在请求之间设置一定的延迟。
API 可能会限制我们的请求,这可能不会延迟发生。
from time import sleep
import requests
def make_request():
try:
url = 'https://example/api/users'
response = requests.get(url, timeout=30)
parsed = response.json()
print(parsed['data'][0])
except requests.exceptions.ConnectionError:
# 👇️ 在此处处理错误或使用 `pass` 语句
print('connection error occurred')
for i in range(3):
make_request()
sleep(1.5)
time.sleep
方法暂停执行给定的秒数。
代码示例以 1.5 秒的延迟向 API 发出 3 个请求。
重复请求直到成功响应
我们还可以使用 while 循环重复请求,直到服务器响应。
from time import sleep
import requests
response = None
while response is None:
try:
url = 'https://example.com/api/users'
response = requests.get(url, timeout=30)
break
except:
print('Connection error occurred')
sleep(1.5)
continue
print(response)
parsed = response.json()
print(parsed)
我们使用 while
循环每 1.5 秒发出一次请求,直到服务器无连接错误地响应。
try
语句尝试向 API 发出 HTTP 请求,如果请求失败,except 块将在我们暂停执行 1.5 秒的地方运行。
continue
语句用于继续 while 循环的下一次迭代。
重复该过程,直到 HTTP 请求成功并使用 break 语句。
我们还可以在代码的错误处理部分更加具体。
from time import sleep
import requests
response = None
while response is None:
try:
url = 'https://example.com/api/users'
response = requests.get(url, timeout=30)
break
except requests.ConnectionError as e:
print('Connection error occurred', e)
sleep(1.5)
continue
except requests.Timeout as e:
print('Timeout error - request took too long', e)
sleep(1.5)
continue
except requests.RequestException as e:
print('General error', e)
sleep(1.5)
continue
except KeyboardInterrupt:
print('The program has been canceled')
print(response)
parsed = response.json()
print(parsed)
requests.ConnectionError
错误意味着我们的站点或服务器上存在连接问题。
检查我们的互联网连接并确保服务器可以访问互联网。
requests.Timeout
错误在请求花费的时间太长时引发(在示例中超过 30 秒)。
requests.RequestException
错误是一个通用的、包罗万象的错误。
当用户取消程序时会引发 KeyboardInterrupt
异常,例如 按 CTRL + C。
总结
要解决错误“ConnectionError: Max retries exceeded with url”,请确保:
-
在调用
request.get()
时指定正确且完整的 URL。 - 不受 API 的速率限制。
- requests 模块能够验证站点的 SSL 证书。
- 可以访问互联网。
相关文章
Python for 循环中的下一项
发布时间:2023/04/26 浏览次数:179 分类:Python
-
本文讨论了 Python 中的 for 循环以及如何通过使用 for 循环和示例来跳过列表的第一个元素。
Python While 循环用户输入
发布时间:2023/04/26 浏览次数:148 分类:Python
-
我们可以在 while 循环中使用 input() 函数来输入数据,直到在 Python 中满足某个条件。
在 Python 中将整数转换为罗马数字
发布时间:2023/04/26 浏览次数:87 分类:Python
-
本篇文章将介绍在 Python 中将整数转换为罗马数字。以下是一个 Python 程序的实现,它将给定的整数转换为其等效的罗马数字。
在 Python 中将罗马数字转换为整数
发布时间:2023/04/26 浏览次数:144 分类:Python
-
本文讨论如何在 Python 中将罗马数字转换为整数。 我们将使用 Python if 语句来执行此操作。 我们还将探讨在 Python 中将罗马数字更改为整数的更多方法。
在 Python 中读取 gzip 文件
发布时间:2023/04/26 浏览次数:70 分类:Python
-
本篇文章强调了压缩文件的重要性,并演示了如何在 Python 中使用 gzip 进行压缩和解压缩。
在 Python 中锁定文件
发布时间:2023/04/26 浏览次数:141 分类:Python
-
本文解释了为什么在 Python 中锁定文件很重要。 这讨论了当两个进程在没有锁的情况下与共享资源交互时会发生什么的示例,为什么在放置锁之前知道文件状态很重要,等等
在 Python 中将 PDF 转换为文本
发布时间:2023/04/26 浏览次数:196 分类:Python
-
在本教程中,我们将学习如何使用 Python 使用 PyPDF2、Aspose 和 PDFminer 将 PDF 文档转换为文本文件。
在 Python 中创建临时文件
发布时间:2023/04/26 浏览次数:53 分类:Python
-
本文讲解了tempfile库函数的四个子函数:TemporaryFile、NamedTemporaryFile、mkstemp、TemporaryDirectory。 每个部分都提供了适当的程序,以简化对概念的理解。