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'])
修正说明
- 拆分headers与params:将请求头信息单独放入
headers字典,分页参数(offset、limit)放入params,完全符合Spotify API的请求格式要求。 - 动态更新offset:每次循环将offset设置为当前已获取的歌曲总数,确保每次请求都精准获取下一批未拿到的数据。
- 提前获取总数量:首次请求后拿到总歌曲数
total_tracks,避免后续重复解析该值,提升代码运行效率。 - 简化请求地址:移除循环中不必要的请求地址重定义,保持请求路径一致,避免额外的错误风险。
内容的提问来源于stack exchange,提问作者Gishub
相关产品推荐
相关产品推荐

