Spotipy调用recommendations()返回多艺人字典 如何提取单条推荐曲目
Spotipy recommendations接口返回数据提取方法
首先明确:你设置limit=1后接口确实只返回了1首推荐曲目,看到的多个艺人条目是这首曲目的合作参演艺人——很多歌曲是多位歌手合作完成的,所以曲目、专辑信息里都会嵌套所有参与艺人的列表,不属于返回异常。
返回结构层级拆解
接口返回的字典结构非常规整,逐层梳理如下:
- 最外层字典包含2个核心键:
tracks:推荐曲目列表,列表长度等于你传入的limit参数,你当前场景下长度为1seeds:本次推荐使用的种子参数信息,也就是你传入的pop流派种子的相关统计
tracks列表的第0个元素(recommendations['tracks'][0])就是你要的单条推荐曲目对象- 曲目对象下的
artists键对应的值是该曲目所有参与艺人的列表,每个艺人条目包含id、名称、主页链接等信息;嵌套在album键下的artists是该曲目所属专辑的艺人列表,和曲目层级的艺人信息通常一致。
注意:
tracks是列表类型,即使你设置limit=1,也需要通过[0]索引取出第一首曲目对象,不能直接在tracks键上访问曲目属性,这是初学者最容易踩的坑。
常用字段提取代码
直接按层级索引取值即可,参考代码:
import spotipy from spotipy.oauth2 import SpotifyClientCredentials # 你的原有初始化和请求代码 sp = spotipy.Spotify(client_credentials_manager=SpotifyClientCredentials()) recommendations = sp.recommendations(seed_genres=['pop'], limit=1) # 提取目标单首曲目 track = recommendations['tracks'][0] # 曲目基础信息 track_name = track['name'] track_id = track['id'] duration_second = track['duration_ms'] / 1000 # 接口返回毫秒单位,可自行转成秒 is_explicit = track['explicit'] popularity = track['popularity'] preview_audio = track.get('preview_url', '无可用试听片段') # 提取艺人信息 # 先拿所有艺人名称列表,再按需拼接成字符串 artist_name_list = [artist['name'] for artist in track['artists']] all_artist_name = ' / '.join(artist_name_list) main_artist_name = artist_name_list[0] # 通常列表第一位是主唱/主艺人 # 提取专辑信息 album = track['album'] album_name = album['name'] release_date = album['release_date'] # 专辑封面列表按尺寸从大到小排序,索引0是640*640最大图 large_cover = album['images'][0]['url'] small_cover = album['images'][-1]['url']
嵌套字典提取通用技巧
- 第一次处理陌生接口返回值时,逐层打印键名确认结构,不要直接写深层索引避免报错:先执行
print(recommendations.keys())确认最外层字段,再逐层往里核对 - 遇到列表先打印长度确认元素数量,比如
print(len(recommendations['tracks']))可以验证返回曲目数是不是和limit参数一致 - 不确定某个字段是否存在时,用字典的
.get(键名, 默认值)方法取值,不会因为字段缺失直接抛出KeyError - 调试阶段可以用标准库
pprint格式化打印嵌套字典,会自动按层级缩进排版,比原生print输出的挤成一团的内容好读很多,用法:
from pprint import pprint pprint(recommendations)
内容的提问来源于stack exchange,提问作者user19476575
相关产品推荐
相关产品推荐

