You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 18:22:43