使用Spotipy调用Spotify API遇404错误及获取每日Top1000歌曲的问题
问题解决与方案
一、代码404错误的原因及修复
错误原因
- 方法弃用引发兼容性问题:你使用的
sp.playlist_tracks()已被Spotipy标记为弃用,内部重定向到playlist_items()时可能出现隐性错误。 - 缺少区域参数:Spotify官方播放列表(如全球Top 50)需要指定
market参数,未指定时部分区域会返回404或无数据。 - API访问限制:Spotify所有API请求都需要携带认证令牌,不存在「无需认证仅通过URL获取数据」的方式,Client Credentials是最基础的无用户授权认证模式,必须保留。
修复后的代码
import spotipy from spotipy.oauth2 import SpotifyClientCredentials # 替换为你的API凭证 client_id = 'your_client_id' client_secret = 'your_client_secret' # 初始化认证客户端 client_credentials_manager = SpotifyClientCredentials(client_id=client_id, client_secret=client_secret) sp = spotipy.Spotify(client_credentials_manager=client_credentials_manager) # 官方全球每日Top 50播放链接 playlist_link = "https://open.spotify.com/playlist/37i9dQZEVXbNG2KDcFcKOF?si=1333723a6eff4b7f" playlist_URI = playlist_link.split("/")[-1].split("?")[0] # 使用官方推荐的playlist_items方法,添加market参数指定区域 track_items = sp.playlist_items(playlist_URI, market="US", additional_types=("track",)) track_uris = [item["track"]["uri"] for item in track_items["items"]] print(track_uris)
二、获取每日Top 1000歌曲的方案
Spotify官方没有单一个包含Top 1000歌曲的播放列表,可通过以下方式实现:
- 合并多区域官方Top列表:抓取不同地区的Top 200播放列表(如全球、美国、欧洲、日本等),合并曲目并去重。常用官方Top 200列表ID:
- 全球Top 200:
37i9dQZEVXbMDoHDwVN2tF - 美国Top 200:
37i9dQZEVXbLRQDuF5jeBp - 英国Top 200:
37i9dQZEVXbLnolsZ8PSNw
- 全球Top 200:
- 分页获取完整内容:每个播放列表单次请求最多返回100条数据,需通过
offset参数循环分页,获取全部200条内容。 - 自动去重:用集合存储歌曲URI,自动过滤不同列表中的重复曲目。
示例代码片段(合并多区域Top 200):
# 多个官方Top 200播放列表ID top_playlists = [ "37i9dQZEVXbMDoHDwVN2tF", # 全球Top 200 "37i9dQZEVXbLRQDuF5jeBp", # 美国Top 200 "37i9dQZEVXbLnolsZ8PSNw", # 英国Top 200 "37i9dQZEVXbKuaTI1Z1Afx" # 日本Top 200 ] all_track_uris = set() for playlist_id in top_playlists: offset = 0 while True: items = sp.playlist_items(playlist_id, market="US", limit=100, offset=offset, additional_types=("track",)) if not items["items"]: break # 集合自动去重 all_track_uris.update([item["track"]["uri"] for item in items["items"]]) offset += 100 # 转换为列表,最终数量接近1000(根据重复情况浮动) top_1000_uris = list(all_track_uris) print(f"获取到{len(top_1000_uris)}首不同的热门歌曲URI")
内容的提问来源于stack exchange,提问作者Prasad Dalvi
相关产品推荐
相关产品推荐

