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

Python调用Spotify API的get_playlist_items无法获取完整播放列表

问题分析与修复方案

核心错误点

  • 请求头与查询参数混放:Authorization、Content-type是HTTP请求头,你错误地将它们放到了查询参数params字典中,这会导致请求格式不符合API要求,直接影响分页逻辑的正常运行。
  • 分页偏移量未更新:循环中始终使用初始的offset=50,每次请求都只会拿到同一批50条数据,无法向后翻页获取剩余歌曲。
  • 循环逻辑顺序混乱:先发送请求再修改请求地址,且未根据已获取的歌曲数调整偏移量,导致重复请求无效数据。

修正后的完整代码

def find_songs(self):
    # 分离请求头和查询参数
    headers = {
        "Content-type": "application/json",
        "Authorization": "Bearer {}".format(self.spotify_token)
    }
    # 初始化分页参数,Spotify API最大limit为50
    params = {
        "offset": 0,
        "limit": 50
    }
    playlist_uri = "<playlist_URI>"  # 替换为你的播放列表URI
    query = f"https://api.spotify.com/v1/playlists/{playlist_uri}/tracks"
    
    all_tracks = []
    # 首次请求获取初始数据和总歌曲数
    response = requests.get(query, headers=headers, params=params)
    response_data = response.json()
    all_tracks.extend(response_data['items'])
    total_tracks = response_data['total']
    
    # 循环获取剩余歌曲
    while len(all_tracks) < total_tracks:
        # 更新偏移量为已获取的歌曲数量
        params['offset'] = len(all_tracks)
        response = requests.get(query, headers=headers, params=params)
        new_data = response.json()
        all_tracks.extend(new_data['items'])

修正说明

  1. 拆分headers与params:将请求头信息单独放入headers字典,分页参数(offset、limit)放入params,完全符合Spotify API的请求格式要求。
  2. 动态更新offset:每次循环将offset设置为当前已获取的歌曲总数,确保每次请求都精准获取下一批未拿到的数据。
  3. 提前获取总数量:首次请求后拿到总歌曲数total_tracks,避免后续重复解析该值,提升代码运行效率。
  4. 简化请求地址:移除循环中不必要的请求地址重定义,保持请求路径一致,避免额外的错误风险。

内容的提问来源于stack exchange,提问作者Gishub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 19:47:30