调用Spotify API持续触发Error 429超限错误,求排查(附Python代码)
Spotify API 429 速率限制问题排查与修复
问题核心
你的代码缺少429错误的重试逻辑,也没利用API返回的Retry-After头信息,而且之前的超限可能触发了平台临时的严格限制,单纯调低批次和间隔没法解决问题。
现有代码的问题
- 无错误处理机制:遇到429错误直接返回JSON,没有重试或等待逻辑
- 硬编码等待时间:固定1秒/5秒等待,不遵循API给出的官方等待时长
- 未记录失败批次:出错后无法定位哪些track_id没拉取成功
修复后的代码
import requests import json import time from requests.exceptions import RequestException # 拆分track_id并生成批次 df['track_id'] = df['track_uri'].str.replace('spotify:track:', '', regex=False) track_ids = df['track_id'].tolist() # 先以25条一批保守测试 batches = [track_ids[i:i + 25] for i in range(0, len(track_ids), 25)] def get_track_info(header, track_ids): ids = ','.join(track_ids) url = f'https://api.spotify.com/v1/audio-features/?ids={ids}' max_retries = 5 retry_count = 0 while retry_count < max_retries: try: r = requests.get(url, headers=header) # 成功请求直接返回结果 if r.status_code == 200: return r.json() # 处理429速率限制 elif r.status_code == 429: # 优先用API返回的等待时间,默认60秒 retry_after = int(r.headers.get('Retry-After', 60)) print(f"触发429限制,等待{retry_after}秒后重试...") time.sleep(retry_after) retry_count += 1 # 处理其他错误(如令牌过期、无效ID) else: print(f"请求失败,状态码: {r.status_code},批次片段: {track_ids[:3]}...") return None except RequestException as e: print(f"网络异常: {str(e)}") time.sleep(10) retry_count += 1 # 多次重试失败后跳过该批次 print(f"批次{track_ids[:3]}... 重试{max_retries}次失败,已跳过") return None # 遍历批次拉取并保存数据 for i, batch in enumerate(batches, start=1): track_info = get_track_info(header, batch) if track_info: filename = f'audio_features_{i}.json' with open(filename, 'w') as f: json.dump(track_info, f, indent=4) # 非429场景下的基础等待,降低触发限制的概率 time.sleep(1)
额外建议
- 检查令牌有效性:确认API令牌是否过期,过期令牌会返回401,容易被误判为速率问题
- 记录拉取进度:可以把已完成的批次索引写入文件,中断后能从断点继续,避免重复请求浪费额度
- 对照官方限制:Spotify免费API的速率限制为每分钟180次请求,每日15万次请求,等待一天后仍触发429,大概率是平台临时的严格限制,遵循
Retry-After头信息是最可靠的解决方式
内容的提问来源于stack exchange,提问作者juanpablo6
相关产品推荐
相关产品推荐

