ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

用Python分析Spotify音乐数据:发现你的听觉习惯

2026/8/3 6:08:20 拓冰建站 浏览量
用Python分析Spotify音乐数据:发现你的听觉习惯 1. 项目概述用Python解锁你的音乐DNA去年冬天清理硬盘时我偶然发现了大学时期保存的Last.fm听歌记录。那些被遗忘的音乐记忆突然鲜活起来——原来2015年的我如此痴迷后摇而2018年分手季的播放列表里全是Billie Eilish。这种通过数据回溯个人音乐历程的体验促使我研究了Spotify的API接口。本文将分享如何用Python把你的播放记录变成可视化的音乐日记你会发现自己的听歌习惯里藏着许多意想不到的规律。Spotify作为全球最大的音乐流媒体平台每天产生超过2亿小时的播放数据。除了基础的播放量统计其开发者平台还开放了丰富的元数据接口从歌曲的音频特征如节奏感、情绪值到用户的历史行为如跳过率、重复播放次数。通过Python生态中的requests、spotipy等工具我们可以把这些数据转化为洞察力——比如你肯定没注意过工作日通勤和周末深夜听的音乐在愉悦度指标上存在显著差异。这个项目特别适合想用真实数据练手的Python初学者仅需基础语法知识音乐爱好者探索自己的听觉偏好需要音乐数据分析案例的产品/运营从业者任何对量化自我Quantified Self感兴趣的人提示本文所有代码均兼容免费版的Spotify账号不需要Premium订阅。但部分历史数据需要账号注册满30天以上才能获取。2. 环境配置与API申请2.1 开发环境搭建我强烈推荐使用Anaconda创建独立环境避免包冲突。以下是经过多个项目验证的稳定版本组合conda create -n spotify python3.9 conda activate spotify pip install spotipy2.19 pandas1.4 matplotlib3.5 seaborn0.11如果遇到证书错误常见于Windows需要额外执行import certifi os.environ[REQUESTS_CA_BUNDLE] certifi.where()2.2 Spotify开发者账号申请登录 Spotify开发者仪表板点击Create App - 名称建议包含你的账号名如MyData-YourName记录下Client ID和Client Secret后者需要点击显示在设置中添加回调地址http://localhost:8888/callback安全提示Client Secret相当于密码绝不能上传到GitHub。建议使用python-dotenv管理# .env文件 SPOTIPY_CLIENT_ID你的id SPOTIPY_CLIENT_SECRET你的secret SPOTIPY_REDIRECT_URIhttp://localhost:8888/callback2.3 认证流程实战使用spotipy库的简化认证方案import spotipy from spotipy.oauth2 import SpotifyOAuth scope user-top-read user-library-read user-read-recently-played sp spotipy.Spotify(auth_managerSpotifyOAuth(scopescope))首次运行会弹出浏览器窗口登录后控制台会显示本地服务器接收到的令牌。实测中常见两个坑防火墙拦截回调请求 → 临时关闭防火墙或添加例外浏览器缓存导致认证失败 → 使用隐身窗口操作3. 数据获取与清洗3.1 获取个人听歌记录Spotify提供三种时间粒度的数据接口近期播放最近50条短期趋势最近4周长期趋势最近6个月到数年获取长期趋势的典型代码top_tracks sp.current_user_top_tracks( limit50, offset0, time_rangelong_term # 可换medium_term/short_term )重要参数说明limit每批请求的最大条数上限50offset分页偏移量获取全部数据需要循环请求time_range长期(long_term)约2年数据中期(medium_term)约6个月短期(short_term)约4周3.2 数据结构解析单条曲目数据示例实际有40个字段{ name: Blinding Lights, artist: The Weeknd, album: After Hours, duration_ms: 200040, popularity: 90, audio_features: { danceability: 0.514, energy: 0.73, key: 1, loudness: -5.934, valence: 0.334, # 情绪积极度 tempo: 171.005, time_signature: 4 } }3.3 数据清洗技巧处理缺失值约5%的曲目没有audio_featuresdf df.dropna(subset[audio_features.danceability])时间格式转换df[played_at] pd.to_datetime(df[played_at]).dt.tz_localize(None)特征工程示例 - 创建时段标签df[time_of_day] pd.cut(df[played_at].dt.hour, bins[0,6,12,18,24], labels[深夜,上午,下午,晚上])4. 分析思路与可视化4.1 基础统计指标# 最常听的艺人TOP10 artist_counts df[artist].value_counts().head(10) # 音频特征随时间变化 daily_features df.groupby(df[played_at].dt.date)[ [audio_features.danceability, audio_features.energy] ].mean()4.2 高级分析案例案例1发现你的音乐人格# 使用KMeans聚类识别听歌模式 from sklearn.cluster import KMeans features df[[audio_features.danceability, audio_features.energy, audio_features.valence]] kmeans KMeans(n_clusters3).fit(features) df[cluster] kmeans.labels_案例2播放时段分析hourly_pattern df.groupby( df[played_at].dt.hour )[audio_features.tempo].mean() plt.figure(figsize(10,6)) sns.lineplot(datahourly_pattern) plt.title(一天中不同时间的平均节奏变化)4.3 交互式可视化使用Plotly创建可探索的图表import plotly.express as px fig px.scatter(df, xaudio_features.energy, yaudio_features.valence, colortime_of_day, hover_data[name,artist]) fig.show()5. 实战经验与避坑指南5.1 性能优化技巧请求缓存避免重复调用APIfrom requests_cache import install_cache install_cache(spotify_cache, backendsqlite, expire_after3600)批量获取音频特征提升10倍速度track_ids df[id].tolist() features [] for i in range(0, len(track_ids), 50): batch sp.audio_features(track_ids[i:i50]) features.extend(batch)5.2 常见错误排查403 Forbidden错误检查scope是否包含所需权限确认账号地区与API终端点一致国内账号需特别处理数据不完整长期趋势数据需要足够长的使用历史免费账号最多只能获取最近50条播放记录日期范围异常Spotify的时区处理可能有偏差建议统一转换为UTC再处理5.3 创意扩展方向生成个人年度音乐报告创建自动化的播放列表推荐系统对比与好友的音乐品味相似度预测下一首可能喜欢的歌曲个人实践发现最有趣的规律大多数人在周五下午的音乐能量值比周一早上高出37%而我的数据显示这个差异达到惊人的62%——看来我是真的讨厌周一。