FEATURED · 精选文章

Python数据分析:用Spotify API挖掘你的音乐DNA

发布时间 / 2026/8/18 20:09:40
来源 / 创域科博编辑部
栏目 / 资讯中心
Python数据分析:用Spotify API挖掘你的音乐DNA 1. 项目概述用Python解锁你的音乐DNA每次打开Spotify年度回顾时你是否好奇那些听歌数据背后隐藏着什么秘密作为一名常年与数据打交道的Python开发者我发现用代码分析自己的听歌历史远比平台提供的可视化报告更有趣。通过Spotify开放的Web API我们可以获取完整的播放记录、收藏歌单、音频特征等数据用Python进行深度挖掘后能发现许多连自己都没意识到的听歌模式。这个项目特别适合想结合兴趣学Python的数据分析新手音乐爱好者好奇自己的听歌习惯需要真实数据集练手的数据从业者希望制作个性化音乐报告的技术极客2. 核心工具与技术栈2.1 Spotify开发者账号申请首先需要注册Spotify开发者账号免费访问 Spotify开发者门户点击Dashboard → Create App填写应用信息名称/描述可随意记录下生成的Client ID和Client Secret注意Redirect URI可先填写http://localhost:8888/callback这是本地测试用的标准配置2.2 Python环境配置推荐使用Python 3.8版本主要依赖库pip install spotipy pandas matplotlib seabornspotipy官方推荐的Python SDKpandas数据处理核心工具matplotlib/seaborn可视化双雄2.3 认证流程实现Spotify使用OAuth 2.0认证spotipy库已经封装了复杂流程import spotipy from spotipy.oauth2 import SpotifyOAuth scope user-library-read user-top-read user-read-recently-played sp spotipy.Spotify(auth_managerSpotifyOAuth( client_id你的CLIENT_ID, client_secret你的CLIENT_SECRET, redirect_urihttp://localhost:8888/callback, scopescope))3. 数据获取与清洗3.1 获取近期播放记录recently_played sp.current_user_recently_played(limit50)返回的数据结构包含track歌曲基本信息名称、艺人、时长played_at播放时间戳context播放场景歌单/专辑/随机3.2 获取Top歌曲/艺人top_tracks sp.current_user_top_tracks(time_rangemedium_term, limit50) top_artists sp.current_user_top_artists(time_rangemedium_term, limit50)time_range参数可选short_term最近4周medium_term最近6个月long_term所有历史数据3.3 音频特征提取最有趣的部分是获取每首歌的音频特征track_ids [item[id] for item in top_tracks[items]] audio_features sp.audio_features(track_ids)返回的音频特征包括danceability舞蹈性energy能量感valence情绪积极度acousticness原声程度instrumentalness乐器占比4. 数据分析实战4.1 基础统计与可视化先看收听时间的分布规律import pandas as pd from matplotlib import pyplot as plt df pd.DataFrame(recently_played[items]) df[played_at] pd.to_datetime(df[played_at]) df[hour] df[played_at].dt.hour plt.figure(figsize(10,6)) df[hour].value_counts().sort_index().plot(kindbar) plt.title(不同时段的听歌频率) plt.xlabel(小时) plt.ylabel(播放次数)4.2 音乐口味雷达图用极坐标图展示音频特征import numpy as np features [danceability, energy, valence, acousticness, instrumentalness] avg_features pd.DataFrame(audio_features)[features].mean() angles np.linspace(0, 2*np.pi, len(features), endpointFalse) angles np.concatenate((angles,[angles[0]])) avg_features np.concatenate((avg_features,[avg_features[0]])) fig plt.figure(figsize(8,8)) ax fig.add_subplot(111, polarTrue) ax.plot(angles, avg_features, o-, linewidth2) ax.fill(angles, avg_features, alpha0.25) ax.set_thetagrids(angles * 180/np.pi, features) plt.title(你的音乐DNA, y1.1)4.3 艺人网络关系图分析你常听艺人之间的关联from collections import defaultdict artist_graph defaultdict(int) for item in recently_played[items]: artists [artist[name] for artist in item[track][artists]] for i in range(len(artists)): for j in range(i1, len(artists)): pair tuple(sorted([artists[i], artists[j]])) artist_graph[pair] 1 # 筛选出现次数大于2的组合 strong_pairs {k:v for k,v in artist_graph.items() if v2}5. 高级分析技巧5.1 听歌情绪时间线结合valence值0-1表示消极到积极和播放时间df_features pd.DataFrame(audio_features) df_features[time] df[played_at] df_features[valence_rolling] df_features[valence].rolling(5).mean() plt.figure(figsize(12,4)) plt.plot(df_features[time], df_features[valence_rolling]) plt.axhline(y0.5, colorr, linestyle--) plt.title(听歌情绪变化曲线) plt.ylabel(情绪值)5.2 歌曲聚类分析用K-Means对歌曲进行分类from sklearn.cluster import KMeans from sklearn.preprocessing import StandardScaler X pd.DataFrame(audio_features)[features] scaler StandardScaler() X_scaled scaler.fit_transform(X) kmeans KMeans(n_clusters3, random_state42) clusters kmeans.fit_predict(X_scaled) df_cluster pd.DataFrame({track: [item[name] for item in top_tracks[items]], cluster: clusters})5.3 生成个性化歌单根据分析结果创建推荐歌单# 找出高能量低情绪值的歌曲适合运动时听 workout_tracks [track[uri] for track, cluster in zip(top_tracks[items], clusters) if (audio_features[i][energy] 0.8) and (audio_features[i][valence] 0.4)] playlist sp.user_playlist_create(user_id, 健身专用歌单, publicFalse) sp.playlist_add_items(playlist[id], workout_tracks)6. 避坑指南与优化建议6.1 常见API错误处理429错误请求频率超限 → 添加time.sleep(1)401错误token过期 → 实现自动刷新逻辑try: recently_played sp.current_user_recently_played() except spotipy.exceptions.SpotifyException as e: if e.http_status 401: token sp.auth_manager.get_access_token(as_dictFalse) sp spotipy.Spotify(authtoken)6.2 数据存储策略建议将API返回的原始数据保存import json with open(spotify_data.json, w) as f: json.dump({recently_played: recently_played, top_tracks: top_tracks, audio_features: audio_features}, f)6.3 性能优化技巧批量获取音频特征每次最多100首使用缓存避免重复请求异步获取不同类型的数据7. 创意扩展方向7.1 制作动态可视化使用Plotly创建交互式图表import plotly.express as px fig px.scatter(df_features, xdanceability, yenergy, colorcluster, hover_nametrack) fig.show()7.2 搭建个人音乐仪表盘用Flask/Dash构建Web应用import dash from dash import dcc, html app dash.Dash(__name__) app.layout html.Div([ dcc.Graph(figurefig_radar), dcc.Graph(figurefig_timeline) ])7.3 与Last.fm数据结合如果你同时使用Last.fm可以整合两者的数据import pylast lastfm pylast.LastFMNetwork(api_key, api_secret) lastfm_tracks lastfm.get_user(username).get_recent_tracks()经过三个月的持续分析我发现自己在工作时段倾向于听低歌词干扰的电子乐instrumentalness 0.7而周末则更多播放独立民谣。最意外的是情绪值(valence)与天气数据的相关系数达到0.62——原来我的音乐口味如此受天气影响
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻