使用Python分析Spotify听歌数据:从API调用到个性化推荐
2026/9/12 19:24:29 网站建设 项目流程

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 matplotlib

spotipy库封装了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错误,可以:

  1. 实现请求间隔:在连续请求间添加time.sleep(0.1)延迟
  2. 使用缓存:对不常变的数据(如歌曲特征)进行本地缓存
  3. 分批处理:将大数据集分成小块处理

6.2 数据不完整问题

有时API返回的数据可能不完整,特别是对于较老的播放记录。解决方案:

  • 检查响应中的'next'字段,确保获取了所有分页数据
  • 对于重要的分析,可以考虑定期备份数据到本地数据库

6.3 认证令牌过期

OAuth令牌通常1小时后过期。处理方案:

  1. 使用refresh_token自动获取新令牌
  2. 实现令牌自动刷新逻辑:
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 结合机器学习进行音乐推荐

使用收集的数据可以训练简单的推荐模型:

  1. 基于内容的推荐:根据歌曲特征寻找相似歌曲
  2. 协同过滤:如果你有多个用户的听歌数据,可以实现用户间的协同过滤

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'])

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询