1. 项目概述
作为一名长期使用Spotify的音乐爱好者,我发现自己经常好奇:我到底听了多少首歌?最常听的歌手是谁?播放列表有什么规律?于是决定用Python来分析自己的Spotify听歌数据。这个项目不仅能满足个人好奇心,还能帮助更好地理解自己的音乐品味。
Spotify提供了完善的Web API接口,通过Python可以轻松获取各种听歌数据。我们将使用Spotipy这个轻量级Python库,它封装了Spotify Web API的所有功能。整个过程不需要复杂的编程基础,只要会基本的Python语法就能上手。
2. 环境准备与API配置
2.1 安装必要的Python库
首先需要安装spotipy库,它是连接Spotify API的关键:
bash复制pip install spotipy
此外,我们还会用到pandas进行数据处理,matplotlib和seaborn进行可视化:
bash复制pip install pandas matplotlib seaborn
2.2 获取Spotify开发者凭证
- 登录Spotify开发者网站
- 创建一个新应用
- 记下Client ID和Client Secret
- 设置回调URL为
http://localhost:8888/callback
2.3 配置认证信息
创建一个config.py文件存储凭证:
python复制SPOTIPY_CLIENT_ID = '你的Client ID'
SPOTIPY_CLIENT_SECRET = '你的Client Secret'
SPOTIPY_REDIRECT_URI = 'http://localhost:8888/callback'
3. 连接Spotify API
3.1 初始化Spotipy客户端
python复制import spotipy
from spotipy.oauth2 import SpotifyOAuth
from config import SPOTIPY_CLIENT_ID, SPOTIPY_CLIENT_SECRET, SPOTIPY_REDIRECT_URI
# 设置权限范围
scope = "user-library-read user-top-read user-read-recently-played"
# 创建认证对象
sp = spotipy.Spotify(auth_manager=SpotifyOAuth(
client_id=SPOTIPY_CLIENT_ID,
client_secret=SPOTIPY_CLIENT_SECRET,
redirect_uri=SPOTIPY_REDIRECT_URI,
scope=scope))
3.2 测试API连接
python复制# 获取当前用户信息
user = sp.current_user()
print(f"成功连接Spotify API,欢迎 {user['display_name']}")
4. 获取听歌数据
4.1 获取最近播放的歌曲
python复制def get_recently_played(limit=50):
results = sp.current_user_recently_played(limit=limit)
tracks = []
for item in results['items']:
track = item['track']
tracks.append({
'name': track['name'],
'artist': track['artists'][0]['name'],
'album': track['album']['name'],
'played_at': item['played_at'],
'duration_ms': track['duration_ms'],
'popularity': track['popularity']
})
return tracks
4.2 获取最常听的歌曲和艺人
python复制def get_top_tracks(limit=20, time_range='medium_term'):
results = sp.current_user_top_tracks(limit=limit, time_range=time_range)
return [{
'name': track['name'],
'artist': track['artists'][0]['name'],
'album': track['album']['name'],
'duration_ms': track['duration_ms'],
'popularity': track['popularity']
} for track in results['items']]
def get_top_artists(limit=20, time_range='medium_term'):
results = sp.current_user_top_artists(limit=limit, time_range=time_range)
return [{
'name': artist['name'],
'genres': artist['genres'],
'popularity': artist['popularity']
} for artist in results['items']]
4.3 获取保存的歌曲
python复制def get_saved_tracks(limit=50):
results = sp.current_user_saved_tracks(limit=limit)
return [{
'name': track['track']['name'],
'artist': track['track']['artists'][0]['name'],
'album': track['track']['album']['name'],
'added_at': track['added_at']
} for track in results['items']]
5. 数据分析与可视化
5.1 数据处理
python复制import pandas as pd
# 获取数据
recent_tracks = get_recently_played(100)
top_tracks = get_top_tracks(50)
top_artists = get_top_artists(50)
saved_tracks = get_saved_tracks(100)
# 转换为DataFrame
df_recent = pd.DataFrame(recent_tracks)
df_top = pd.DataFrame(top_tracks)
df_artists = pd.DataFrame(top_artists)
df_saved = pd.DataFrame(saved_tracks)
# 转换时间格式
df_recent['played_at'] = pd.to_datetime(df_recent['played_at'])
df_saved['added_at'] = pd.to_datetime(df_saved['added_at'])
5.2 听歌时间分析
python复制import matplotlib.pyplot as plt
import seaborn as sns
# 按小时分析听歌习惯
df_recent['hour'] = df_recent['played_at'].dt.hour
plt.figure(figsize=(12,6))
sns.countplot(x='hour', data=df_recent)
plt.title('听歌时间分布')
plt.xlabel('小时')
plt.ylabel('播放次数')
plt.show()
5.3 艺人流行度分析
python复制plt.figure(figsize=(12,6))
sns.barplot(x='popularity', y='name', data=df_artists.sort_values('popularity', ascending=False).head(10))
plt.title('最受欢迎艺人TOP10')
plt.xlabel('流行度')
plt.ylabel('艺人')
plt.show()
5.4 歌曲特征分析
python复制# 获取音频特征
def get_audio_features(track_ids):
features = []
for i in range(0, len(track_ids), 50):
batch = track_ids[i:i+50]
features.extend(sp.audio_features(batch))
return features
track_ids = [sp.track(track['name'])['id'] for track in top_tracks]
audio_features = get_audio_features(track_ids)
df_features = pd.DataFrame(audio_features)
# 可视化
plt.figure(figsize=(12,6))
sns.boxplot(data=df_features[['danceability', 'energy', 'speechiness', 'acousticness', 'instrumentalness', 'liveness', 'valence']])
plt.title('歌曲特征分布')
plt.show()
6. 高级分析与应用
6.1 创建个性化推荐
python复制def get_recommendations(seed_tracks, limit=10):
recommendations = sp.recommendations(seed_tracks=seed_tracks[:5], limit=limit)
return [{
'name': track['name'],
'artist': track['artists'][0]['name'],
'album': track['album']['name']
} for track in recommendations['tracks']]
# 使用最常听的歌曲作为种子
seed_tracks = [track['id'] for track in top_tracks[:5]]
recommendations = get_recommendations(seed_tracks)
print("为你推荐的歌曲:")
for i, track in enumerate(recommendations, 1):
print(f"{i}. {track['name']} - {track['artist']}")
6.2 发现音乐品味变化
python复制# 比较不同时间段的听歌习惯
short_term = pd.DataFrame(get_top_tracks(20, 'short_term'))
medium_term = pd.DataFrame(get_top_tracks(20, 'medium_term'))
long_term = pd.DataFrame(get_top_tracks(20, 'long_term'))
# 分析艺人重叠情况
sets = [
set(short_term['artist']),
set(medium_term['artist']),
set(long_term['artist'])
]
from matplotlib_venn import venn3
venn3(sets, ('最近', '中期', '长期'))
plt.title('不同时间段艺人重叠情况')
plt.show()
6.3 创建自动播放列表
python复制def create_playlist(name, description, track_uris):
user_id = sp.current_user()['id']
playlist = sp.user_playlist_create(user_id, name, public=False, description=description)
sp.playlist_add_items(playlist['id'], track_uris)
return playlist
# 创建"我的最爱"播放列表
top_track_uris = [f"spotify:track:{track['id']}" for track in top_tracks[:20]]
playlist = create_playlist("我的最爱", "根据我的听歌历史自动生成的播放列表", top_track_uris)
print(f"成功创建播放列表: {playlist['name']}")
7. 常见问题与解决方案
7.1 认证失败
注意:确保你的回调URL与开发者仪表板中设置的一致。如果遇到"Invalid redirect URI"错误,检查SPOTIPY_REDIRECT_URI是否完全匹配。
7.2 速率限制
Spotify API有速率限制(大约每秒10-20次请求)。如果遇到429错误,可以:
python复制import time
def safe_request(func, *args, **kwargs):
try:
return func(*args, **kwargs)
except spotipy.exceptions.SpotifyException as e:
if e.http_status == 429:
retry_after = int(e.headers.get('Retry-After', 1))
print(f"达到速率限制,等待{retry_after}秒后重试...")
time.sleep(retry_after)
return safe_request(func, *args, **kwargs)
raise
7.3 数据不完整
某些API端点(如最近播放的歌曲)可能不会返回完整历史记录。对于长期分析,建议定期保存数据到本地数据库。
8. 项目扩展思路
- 长期追踪:设置定时任务,每天自动收集听歌数据并存入数据库,分析长期趋势
- 情绪分析:结合歌曲的valence值(快乐程度)分析不同时间的情绪变化
- 社交分享:生成美观的听歌报告图片,自动分享到社交媒体
- 发现新音乐:基于听歌历史,每周自动生成并推荐新歌单
- 多平台集成:将Spotify数据与其他平台(如Last.fm)的数据结合分析
这个项目展示了如何用Python和Spotify API进行个人音乐数据分析。通过简单的代码,我们能够深入了解自己的听歌习惯,发现隐藏的音乐偏好,甚至创建个性化的音乐推荐。最重要的是,整个过程不需要复杂的机器学习知识,基础的Python技能就足够了。
