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_manager=SpotifyOAuth( client_id="你的Client ID", client_secret="你的Client Secret", redirect_uri="http://localhost:8888/callback", scope=scope))3. 获取听歌数据
3.1 获取最近播放的歌曲
# 获取最近50首播放的歌曲 recently_played = sp.current_user_recently_played(limit=50) # 提取关键信息并存入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(limit=20, time_range='long_term') # 获取长期最常听的20位艺人 top_artists = sp.current_user_top_artists(limit=20, time_range='long_term')3.3 获取收藏的歌曲
# 获取用户收藏的歌曲 saved_tracks = [] results = sp.current_user_saved_tracks(limit=50) 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(kind='bar') 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( user=user_id, name="我的高能量快乐歌单", public=False, description="基于我的听歌数据分析创建的高能量快乐歌曲合集" ) # 添加歌曲到播放列表 sp.playlist_add_items(playlist_id=playlist['id'], items=track_uris)5.2 音乐品味随时间变化分析
通过比较不同时间范围的top tracks,可以分析音乐品味的变化:
# 获取不同时间范围的top tracks top_tracks_short = sp.current_user_top_tracks(limit=50, time_range='short_term') top_tracks_medium = sp.current_user_top_tracks(limit=50, time_range='medium_term') top_tracks_long = sp.current_user_top_tracks(limit=50, time_range='long_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(username="your_username") auth_manager = SpotifyOAuth( client_id="your_client_id", client_secret="your_client_secret", redirect_uri="your_redirect_uri", scope="your_scope", cache_handler=cache_handler) sp = spotipy.Spotify(auth_manager=auth_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'])