使用Python分析Spotify听歌数据:从API调用到个性化推荐
1. 项目概述Spotify作为全球最大的音乐流媒体平台之一每天产生海量的用户听歌数据。这些数据不仅记录了我们的音乐偏好还隐藏着许多有趣的个人听歌习惯和模式。通过Python分析这些数据我们可以深入了解自己的音乐品味发现听歌规律甚至创建个性化的音乐推荐系统。2. 环境准备与API配置2.1 注册Spotify开发者账号要访问Spotify的数据首先需要在 Spotify开发者网站 注册账号并创建应用。创建应用后你会获得两个关键凭证Client ID应用的唯一标识符Client Secret用于认证的密钥重要提示Client Secret是敏感信息切勿直接写在代码中或上传到公开仓库。建议使用环境变量或配置文件来存储。2.2 安装必要的Python库我们需要安装spotipy库这是Spotify官方推荐的Python客户端库pip install spotipy pandas matplotlibspotipy库封装了Spotify Web API的所有功能让我们可以方便地获取和管理Spotify数据。2.3 配置认证流程Spotify API使用OAuth 2.0认证。以下是设置认证的代码示例import spotipy from spotipy.oauth2 import SpotifyOAuth # 设置权限范围 scope user-library-read user-top-read user-read-recently-played # 创建Spotify客户端 sp spotipy.Spotify(auth_managerSpotifyOAuth( client_id你的Client ID, client_secret你的Client Secret, redirect_urihttp://localhost:8888/callback, scopescope))3. 获取听歌数据3.1 获取最近播放的歌曲# 获取最近50首播放的歌曲 recently_played sp.current_user_recently_played(limit50) # 提取关键信息并存入DataFrame tracks [] for item in recently_played[items]: track item[track] tracks.append({ name: track[name], artist: track[artists][0][name], played_at: item[played_at], duration_ms: track[duration_ms], popularity: track[popularity] }) import pandas as pd df_recent pd.DataFrame(tracks)3.2 获取最常听的歌曲和艺人Spotify提供了短期(约4周)、中期(约6个月)和长期(约数年)的听歌统计# 获取长期最常听的20首歌曲 top_tracks sp.current_user_top_tracks(limit20, time_rangelong_term) # 获取长期最常听的20位艺人 top_artists sp.current_user_top_artists(limit20, time_rangelong_term)3.3 获取收藏的歌曲# 获取用户收藏的歌曲 saved_tracks [] results sp.current_user_saved_tracks(limit50) saved_tracks.extend(results[items]) while results[next]: results sp.next(results) saved_tracks.extend(results[items])4. 数据分析与可视化4.1 听歌时间分布分析# 将播放时间转换为datetime对象 df_recent[played_at] pd.to_datetime(df_recent[played_at]) df_recent[hour] df_recent[played_at].dt.hour # 按小时统计播放量 play_count_by_hour df_recent.groupby(hour).size() # 可视化 import matplotlib.pyplot as plt plt.figure(figsize(10,6)) play_count_by_hour.plot(kindbar) plt.title(听歌时间分布) plt.xlabel(小时) plt.ylabel(播放次数) plt.show()4.2 艺人流行度分析# 获取艺人信息 artists [] for item in top_artists[items]: artists.append({ name: item[name], popularity: item[popularity], genres: , .join(item[genres][:3]) if item[genres] else 未知 }) df_artists pd.DataFrame(artists) # 绘制艺人流行度分布 plt.figure(figsize(12,6)) plt.barh(df_artists[name], df_artists[popularity]) plt.title(最常听艺人流行度) plt.xlabel(流行度指数(0-100)) plt.tight_layout() plt.show()4.3 歌曲特征分析Spotify为每首歌曲提供了详细的音频特征我们可以获取这些数据进行更深入的分析# 获取歌曲音频特征 track_ids [track[track][id] for track in saved_tracks[:100]] # 限制100首避免API限制 audio_features sp.audio_features(track_ids) # 转换为DataFrame df_features pd.DataFrame(audio_features) # 分析关键特征 features_to_analyze [danceability, energy, valence, acousticness, instrumentalness] df_features[features_to_analyze].describe()5. 高级分析与应用5.1 创建个性化播放列表基于分析结果我们可以创建符合个人喜好的播放列表# 找出高能量且快乐的歌曲 high_energy_happy df_features[(df_features[energy] 0.8) (df_features[valence] 0.7)] track_uris high_energy_happy[uri].tolist() # 创建播放列表 user_id sp.me()[id] playlist sp.user_playlist_create( useruser_id, name我的高能量快乐歌单, publicFalse, description基于我的听歌数据分析创建的高能量快乐歌曲合集 ) # 添加歌曲到播放列表 sp.playlist_add_items(playlist_idplaylist[id], itemstrack_uris)5.2 音乐品味随时间变化分析通过比较不同时间范围的top tracks可以分析音乐品味的变化# 获取不同时间范围的top tracks top_tracks_short sp.current_user_top_tracks(limit50, time_rangeshort_term) top_tracks_medium sp.current_user_top_tracks(limit50, time_rangemedium_term) top_tracks_long sp.current_user_top_tracks(limit50, time_rangelong_term) # 分析特征变化 def get_avg_features(tracks): ids [track[id] for track in tracks[items]] features sp.audio_features(ids) return pd.DataFrame(features).mean() short_term_avg get_avg_features(top_tracks_short) medium_term_avg get_avg_features(top_tracks_medium) long_term_avg get_avg_features(top_tracks_long) # 创建比较DataFrame df_comparison pd.DataFrame({ 短期(4周): short_term_avg, 中期(6个月): medium_term_avg, 长期(数年): long_term_avg }).transpose()6. 常见问题与解决方案6.1 API调用限制问题Spotify API有调用频率限制(约每秒10次请求)。如果遇到429错误可以实现请求间隔在连续请求间添加time.sleep(0.1)延迟使用缓存对不常变的数据(如歌曲特征)进行本地缓存分批处理将大数据集分成小块处理6.2 数据不完整问题有时API返回的数据可能不完整特别是对于较老的播放记录。解决方案检查响应中的next字段确保获取了所有分页数据对于重要的分析可以考虑定期备份数据到本地数据库6.3 认证令牌过期OAuth令牌通常1小时后过期。处理方案使用refresh_token自动获取新令牌实现令牌自动刷新逻辑from spotipy.cache_handler import CacheFileHandler cache_handler CacheFileHandler(usernameyour_username) auth_manager SpotifyOAuth( client_idyour_client_id, client_secretyour_client_secret, redirect_uriyour_redirect_uri, scopeyour_scope, cache_handlercache_handler) sp spotipy.Spotify(auth_managerauth_manager)7. 扩展思路与应用7.1 结合机器学习进行音乐推荐使用收集的数据可以训练简单的推荐模型基于内容的推荐根据歌曲特征寻找相似歌曲协同过滤如果你有多个用户的听歌数据可以实现用户间的协同过滤7.2 创建听歌年报模仿Spotify的Wrapped功能可以创建个人年度听歌报告最常听艺人/歌曲听歌时间分布音乐特征雷达图与往年数据的对比7.3 实时听歌分析仪表盘使用Dash或Streamlit创建实时听歌分析仪表盘import streamlit as st # 简单的Streamlit仪表盘示例 st.title(我的Spotify听歌分析) st.write(f最近播放了{len(df_recent)}首歌曲) col1, col2 st.columns(2) with col1: st.subheader(听歌时间分布) st.bar_chart(play_count_by_hour) with col2: st.subheader(艺人流行度) st.bar_chart(df_artists.set_index(name)[popularity])