📅  最后修改于: 2023-12-03 15:37:12.316000             🧑  作者: Mango
当我们向一个 API 发送过多请求时,API 的服务器就可能发挥保护机制,返回一个状态码为 429 的响应。在这个响应中,服务器会告诉我们我们已经达到了每个时间段内所允许的请求次数上限。这种情况通常被称为“节流”或“速率限制”。
一种常见的应对策略是让我们的程序不断尝试发送请求,但是在每个请求之间添加一个等待时间。这个等待时间可以被视为一个“惩罚”,让我们的代码与 API 之间保持良好的合作关系,避免因为短时间内发送过多请求而被 API 拒绝服务。
可以使用循环结构来实现等待时间的添加,例如使用 Python 编写如下的代码:
import requests
import time
for i in range(10):
response = requests.get('https://api.example.com')
if response.status_code != 200:
print('请求失败:', response.status_code)
time.sleep(5) # 等待 5 秒钟
这个代码会循环发送 10 个请求,对于每个请求,我们都会等待 5 秒钟后再发送下一个请求。当响应的状态码不为 200 时,我们会输出一个提示信息。这种方式能够最小化我们超过每个时间段所允许的请求次数上限的风险。
另一个应对策略是在每个时间段的开头、中间和结尾,以固定的时间间隔发送请求。这种方式需要计算出单个请求的产生时间和说需等待的时间,能够更加有效地减少请求超限的风险。
例如,以下代码能够在每个小时的第 10 分钟、30 分钟和 50 分钟发起一次请求:
import requests
import time
while True:
now = time.localtime()
if now.tm_min in [10, 30, 50]:
response = requests.get('https://api.example.com')
if response.status_code == 429:
print('请求次数超限')
else:
print('请求成功')
else:
print('当前时间:', time.strftime('%Y-%m-%d %H:%M:%S', now))
time.sleep(60) # 每隔一分钟进行一次判断
这个代码使用了一个无限循环,每隔一分钟检查一次当前时间。当分钟数是 10、30 或 50 时,我们会发送一次请求,并输出相应的提示信息。如果响应的状态码为 429,则表明我们的请求次数已经超限。
在编写发送大量请求的程序时,我们需了解 API 的限制策略,对于每个响应状态码进行适当的处理。在遇到 429 状态码时,我们可以通过延迟请求或定时发送请求等方式来减少请求超限的风险,从而保障程序的正常运行。