尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

个人音乐数据仪表盘:跨平台听歌记录分析与可视化

个人音乐数据仪表盘:跨平台听歌记录分析与可视化 1. 项目概述打造个人音乐数据仪表盘去年整理硬盘时偶然发现自己的音乐播放记录分散在五六个平台突然萌生了个想法要是能把这些数据统一分析说不定能发现些有趣的听歌模式。这个项目就是通过抓取各平台的听歌记录建立个人音乐数据库实现三个核心功能自动统计每周/月/年的听歌总时长可视化展示不同时段的听歌偏好变化基于音频特征分析音乐风格分布我最终实现的系统每周自动生成这样的报告上周共聆听14小时37分钟工作日平均每天2小时周末达3.5小时。电子音乐占比提升12%特别是周五晚间出现Trance音乐高峰期。2. 数据采集方案设计2.1 主流平台API对接各大音乐平台都提供了开发者接口但权限和数据结构差异较大平台接口类型关键字段获取难度SpotifyWeb APItrack, duration, played_at★★☆☆☆网易云音乐私有APIsong, playTime, source★★★★☆Apple MusicApple MusicKitplayDate, songDuration★★★☆☆Last.fmScrobbler APIartist, track, timestamp★★☆☆☆实操建议优先从Last.fm入手它记录了跨平台的播放历史。网易云需要抓包分析手机端接口建议使用Charles等工具。2.2 本地音乐文件处理对于本地存储的MP3/FLAC文件我用Python的mutagen库提取ID3标签from mutagen.id3 import ID3 audio ID3(song.mp3) print({ title: audio.get(TIT2).text[0], artist: audio.get(TPE1).text[0], duration: audio.info.length })3. 核心分析模块实现3.1 时长统计逻辑关键是要处理不同来源的时间格式统一问题。比如Spotify返回的是ISO 8601格式2023-07-15T14:30:22Z而网易云是Unix时间戳毫秒级def normalize_time(time_str): if isinstance(time_str, int): # 处理时间戳 return datetime.fromtimestamp(time_str/1000) elif T in time_str: # 处理ISO格式 return datetime.strptime(time_str, %Y-%m-%dT%H:%M:%SZ) else: return datetime.strptime(time_str, %Y-%m-%d %H:%M:%S)3.2 音乐风格分析方案我测试了两种技术路线基于标签的分类利用Last.fm的track.getTopTags方法基于音频特征的聚类使用librosa提取MFCC特征后做K-means聚类实测发现第一种方案准确度更高特别是对于中文歌曲。以下是特征提取代码片段import librosa y, sr librosa.load(song.mp3) mfcc librosa.feature.mfcc(yy, srsr, n_mfcc13)4. 可视化与报告生成4.1 听歌时段热力图用Plotly生成交互式热力图清晰展示不同时段的听歌强度import plotly.express as px fig px.density_heatmap( df, xhour, yweekday, zduration, histfuncsum ) fig.update_layout(titleWeekly Listening Pattern)4.2 风格偏好雷达图将音乐风格占比数据转化为六维雷达图突出偏好变化时间周期流行摇滚电子古典嘻哈爵士2023年第1周35%20%15%10%15%5%2023年第2周30%25%18%8%12%7%5. 踩坑实录与优化建议时区问题某次发现周末数据异常原来是网易云返回的是北京时间戳而Spotify是UTC时间。解决方案# 统一转换为本地时区 from pytz import timezone beijing timezone(Asia/Shanghai) utc_time.replace(tzinfotimezone(UTC)).astimezone(beijing)歌曲去重不同平台对同一首歌的命名差异很大比如包含/不包含feat信息我最终采用fuzzywuzzy进行模糊匹配from fuzzywuzzy import fuzz if fuzz.ratio(title1, title2) 85: # 判定为同一歌曲性能优化当记录超过10万条时Pandas处理明显变慢。这两个技巧很有效将datetime列转为period类型对artist列使用category数据类型这个项目最让我意外的发现是每当项目截止日前三天我的电子音乐收听量会暴涨200%。看来大脑在高压状态下确实需要特定类型的音乐刺激。现在我会根据这些数据主动调整播放列表比如周一下午安排些轻音乐对抗周一综合征。
返回列表