调用Google Books API返回429 Too Many Requests错误如何解决?
错误原因
429 Too Many Requests 本质是触发了Google Books API的速率限制,即使你未达到公开标注的单日2万次、单用户每分钟100次的配额阈值,也可能触发该报错:
- 你的现有代码没有设置请求间隔,连续高频发送请求,很容易在短时间内触碰到每分钟100次的限流阈值
- Google除了公开配额外,还存在动态限流规则,短时间请求过于集中会触发临时拦截
- 如果作者姓名包含特殊字符未做URL转码,会产生大量无效请求,累计后也可能触发限流
解决方案
你可以从以下几个维度调整代码:
- 添加固定请求间隔:两次请求之间增加0.6-0.7秒的延迟,确保每分钟请求数控制在90次以内,留有冗余空间,可通过
time.sleep(0.7)实现 - 增加429错误退避重试逻辑:不要碰到异常就直接退出,针对429错误做指数退避重试,首次重试等待1秒,第二次2秒,第三次4秒,最多重试3次,避免临时限流导致任务中断
- 参数URL编码:构造请求前对
author参数做URL编码,避免特殊字符产生无效请求,可通过urllib.parse.quote(author)处理 - 主动限流控制:代码中统计每分钟的请求次数,达到80次就主动暂停到下一分钟再继续发送请求,避免触发官方拦截
修改后的参考代码如下:
import time import sys import requests from urllib.parse import quote key = "**********************************" # 每分钟请求计数 request_count = 0 start_time = time.time() for author in author_list: # 此处替换为你的作者名单迭代逻辑 # 主动限流控制 request_count += 1 if time.time() - start_time >= 60: request_count = 1 start_time = time.time() if request_count > 80: wait_time = 60 - (time.time() - start_time) time.sleep(wait_time) request_count = 1 start_time = time.time() # 构造请求 encoded_author = quote(author) api = f'https://www.googleapis.com/books/v1/volumes?q={encoded_author}&key={key}' # 退避重试 retries = 0 max_retries = 3 while retries < max_retries: try: response = requests.get(api) response.raise_for_status() print(response.json()) break except requests.exceptions.HTTPError as e: if response.status_code == 429 and retries < max_retries -1: wait = 2 ** retries time.sleep(wait) retries +=1 continue raise sys.exit(e) except requests.RequestException as e: raise sys.exit(e) # 固定请求间隔 time.sleep(0.7)
内容的提问来源于stack exchange,提问作者geekPinkFlower
相关产品推荐
相关产品推荐

