ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

音乐榜单数据分析实战:从Spotify与Billboard获取、清洗到可视化

2026/9/4 16:59:56 拓冰建站 浏览量
音乐榜单数据分析实战:从Spotify与Billboard获取、清洗到可视化 这次我们来看一个音乐数据分析项目它不涉及复杂的AI模型部署而是聚焦于如何获取、解析和可视化流行音乐单曲在Spotify和Billboard两大权威榜单上的历史表现数据。对于音乐行业从业者、数据分析爱好者或是某位歌手的粉丝来说能够系统地追踪一首热门单曲如Ariana Grande的《Into You》在全球流媒体平台和传统榜单上的起伏轨迹是极具价值的信息。本文将带你从零开始构建一套可复用的数据抓取与分析流程重点解决数据来源、清洗方法、可视化呈现以及趋势洞察等实际问题。项目的核心在于数据的获取与处理。我们不会使用任何需要高显存或GPU的深度学习模型整个过程完全可以在普通电脑的CPU环境下运行。关键在于找到可靠的数据源接口或公开数据集编写稳定的爬虫或调用官方API最后通过Python数据分析库如Pandas, Matplotlib, Plotly将榜单排名、流媒体播放量等数据转化为直观的图表。本文将重点关注方法的可行性、代码的可用性以及分析结论的启发性。1. 核心能力速览能力项说明项目类型音乐榜单数据抓取、清洗、分析与可视化数据来源Spotify Charts (官方榜单)、Billboard Hot 100 (需通过公开API或爬虫获取)核心工具Python (Requests, BeautifulSoup, Pandas, Matplotlib/Plotly), 可能涉及Spotify Web API硬件门槛无特殊要求普通CPU即可依赖网络稳定性环境需求Python 3.7 相关第三方库输出成果时间序列图表排名趋势、播放量趋势、数据表格、分析报告适合场景音乐市场研究、艺人发展追踪、粉丝数据整理、数据分析学习案例2. 适用场景与使用边界这个数据追踪与分析流程主要适合以下几类人群音乐行业分析师与市场研究人员需要定量评估单曲或艺人的商业表现比较不同平台数据差异。艺人团队或唱片公司监控宣传效果为后续策略提供数据支持。粉丝社群与乐迷希望用数据客观记录和展示喜爱歌手的作品成就。数据分析学习者需要一个结合网络爬虫、API调用、数据清洗和可视化的完整实战项目。它能解决什么问题趋势追踪清晰展示《Into You》等单曲在榜单上的爬升、巅峰和衰退周期。平台对比对比同一首歌在Spotify流媒体和Billboard综合销量、流媒体、电台榜单上表现的异同反映不同受众和市场的影响。事件关联分析将排名波动与特定事件如音乐视频发布、现场表演、社交媒体热点时间点关联进行归因分析。使用边界与注意事项数据合规性必须严格遵守目标网站如Billboard的robots.txt协议和使用条款。优先使用官方API如Spotify Web API并遵守其速率限制。本文演示的方法仅用于教育和个人研究严禁用于商业爬取或对目标网站造成负担。数据完整性历史榜单数据可能不完整特别是较早的日期。Billboard官网不直接提供完整的历史榜单API获取数据存在一定技术门槛和限制。分析局限性榜单排名是相对值受同期其他歌曲影响很大。流媒体数据如Spotify播放量是绝对值但通常只提供Top 200的每日数据。分析需结合背景信息。3. 环境准备与前置条件在开始编写代码之前你需要准备好基础的Python开发环境。操作系统Windows 10/11, macOS, 或 Linux 均可。Python环境推荐使用 Python 3.8 或以上版本。建议使用conda或venv创建独立的虚拟环境避免包冲突。关键Python库我们将主要用到以下库请通过pip安装。requests: 用于发送HTTP请求获取网页或API数据。beautifulsoup4或lxml: 用于解析HTML网页内容如果选择爬取方式。pandas: 数据处理与分析的核心库。matplotlib与seaborn: 用于生成静态图表。plotly: 用于生成交互式图表体验更佳。python-dotenv: 用于管理敏感信息如API密钥如果使用Spotify API。网络条件需要能够稳定访问 Spotify Charts 和 Billboard 官网。数据存储准备一个本地目录如./data用于存放爬取到的原始数据和处理后的结果。4. 数据获取策略与代码实现数据获取是整个项目的基础。我们将分平台讨论策略。4.1 Spotify 数据获取Spotify Charts 提供了相对友好的每日/每周榜单数据可以通过其官网直接查看也有结构化的数据可供下载。方法一直接下载CSV最推荐访问 Spotify Charts 网站选择地区Global、日期范围榜单类型Top 200。网站通常提供“下载为CSV”的选项。这是最合规、最稳定的方式。方法二模拟请求获取数据编程方式通过浏览器开发者工具F12的“网络(Network)”选项卡观察下载CSV时发出的请求我们可以用Python模拟这个请求。import requests import pandas as pd from datetime import datetime, timedelta def fetch_spotify_chart(date_str, regionglobal, chart_typedaily): 获取指定日期的Spotify榜单数据模拟思路实际URL需分析 date_str: 格式 2023-08-01 region: global, us, gb等 chart_type: daily 或 weekly # 注意此URL仅为示例格式实际需要从官网请求中捕获 # 不同日期和地区的URL模式可能不同 base_url https://charts.spotify.com/charts/view/regional-{region}-{chart_type}/{date} url base_url.format(regionregion, chart_typechart_type, datedate_str) # 通常数据会通过另一个API端点提供这里需要具体分析 # 假设我们找到了一个返回JSON的API api_url https://api.spotify.com/v1/charts/regional-{region}-{chart_type}/{date} # 虚构示例 headers { User-Agent: Mozilla/5.0 (你的浏览器信息) } try: # 如果是公开数据可能不需要认证 response requests.get(api_url, headersheaders) response.raise_for_status() # 检查请求是否成功 data response.json() # 将JSON数据转换为pandas DataFrame df pd.DataFrame(data[entries]) # 根据实际JSON结构调整 return df except requests.exceptions.RequestException as e: print(f获取 {date_str} 数据失败: {e}) return None # 示例获取多日数据 start_date datetime(2023, 7, 1) end_date datetime(2023, 7, 7) date_range pd.date_range(start_date, end_date) all_data [] for single_date in date_range: date_str single_date.strftime(%Y-%m-%d) df_day fetch_spotify_chart(date_str) if df_day is not None: df_day[date] date_str # 添加日期列 all_data.append(df_day) if all_data: spotify_df pd.concat(all_data, ignore_indexTrue) spotify_df.to_csv(./data/spotify_global_july_2023.csv, indexFalse) print(Spotify数据已保存。)重要提示Spotify的公开榜单数据接口可能发生变化上述代码中的URL需要你根据实际情况通过浏览器开发者工具进行捕获和替换。始终优先使用官方提供的下载方式。4.2 Billboard 数据获取Billboard Hot 100 榜单数据获取更具挑战性因为其官网没有提供简单的历史数据下载。通常有以下几种途径方法一使用第三方开源库推荐社区有一些维护良好的库如billboard.py它通过解析Billboard官网HTML来获取数据。# 安装第三方库 pip install billboard.pyimport billboard from datetime import date, timedelta import pandas as pd import time def fetch_billboard_hot100_for_week(chart_date): 使用 billboard.py 库获取指定周的单曲榜 chart_date: 字符串格式 YYYY-MM-DD代表榜单发布日期通常是周六 try: chart billboard.ChartData(hot-100, datechart_date) print(f成功获取 {chart_date} 的 Billboard Hot 100 榜单) week_data [] for i, song in enumerate(chart): entry { chart_date: chart_date, rank: i1, title: song.title, artist: song.artist, peak_pos: song.peakPos, weeks_on_chart: song.weeks, # 注意billboard.py 可能无法直接获取播放量等详细指标 } week_data.append(entry) return pd.DataFrame(week_data) except Exception as e: print(f获取 {chart_date} 榜单时出错: {e}) return None # 示例获取《Into You》发行后几周的榜单数据 # 《Into You》于2016年5月发行我们获取其后两个月的部分榜单 target_dates [2016-05-28, 2016-06-04, 2016-06-11, 2016-06-18] billboard_data_frames [] for d in target_dates: df_week fetch_billboard_hot100_for_week(d) if df_week is not None: billboard_data_frames.append(df_week) time.sleep(2) # 礼貌延迟避免请求过快 if billboard_data_frames: billboard_df pd.concat(billboard_data_frames, ignore_indexTrue) # 筛选出 Ariana Grande 的《Into You》 into_you_data billboard_df[ (billboard_df[title].str.contains(Into You, caseFalse, naFalse)) (billboard_df[artist].str.contains(Ariana Grande, caseFalse, naFalse)) ] print(into_you_data[[chart_date, rank, peak_pos, weeks_on_chart]]) billboard_df.to_csv(./data/billboard_hot100_sample.csv, indexFalse)方法二寻找公开数据集Kaggle、GitHub等平台有时会有爱好者整理的历史Billboard数据集这是一个很好的起点但需要注意数据的时效性和准确性。5. 数据清洗与整合获取到原始数据后需要进行清洗和整合以便于分析。import pandas as pd # 假设我们已经有了两个DataFrame # spotify_df: 包含‘date’ ‘track_name’ ‘artist’ ‘streams’ ‘rank’等列 # billboard_df: 包含‘chart_date’ ‘rank’ ‘title’ ‘artist’ ‘peak_pos’ ‘weeks_on_chart’等列 # 1. 数据清洗示例统一歌曲和艺人名称格式 spotify_df[track_name_clean] spotify_df[track_name].str.lower().str.strip() spotify_df[artist_clean] spotify_df[artist].str.lower().str.strip() billboard_df[title_clean] billboard_df[title].str.lower().str.strip() billboard_df[artist_clean] billboard_df[artist].str.lower().str.strip() # 2. 筛选目标歌曲《Into You》的数据 target_track_name into you target_artist_name ariana grande spotify_into_you spotify_df[ (spotify_df[track_name_clean].str.contains(target_track_name)) (spotify_df[artist_clean].str.contains(target_artist_name)) ].copy() billboard_into_you billboard_df[ (billboard_df[title_clean].str.contains(target_track_name)) (billboard_df[artist_clean].str.contains(target_artist_name)) ].copy() # 3. 处理日期格式便于合并和排序 spotify_into_you[date] pd.to_datetime(spotify_into_you[date]) billboard_into_you[chart_date] pd.to_datetime(billboard_into_you[chart_date]) # 4. 按日期排序 spotify_into_you.sort_values(date, inplaceTrue) billboard_into_you.sort_values(chart_date, inplaceTrue) print(fSpotify 数据点数量: {len(spotify_into_you)}) print(fBillboard 数据点数量: {len(billboard_into_you)})6. 数据可视化与趋势分析清洗后的数据可以通过图表直观展示。我们使用matplotlib和plotly来创建图表。6.1 使用 Matplotlib/Seaborn 绘制静态趋势图import matplotlib.pyplot as plt import seaborn as sns from matplotlib.dates import DateFormatter plt.figure(figsize(14, 8)) # 子图1Spotify全球日榜排名趋势 ax1 plt.subplot(2, 1, 1) ax1.plot(spotify_into_you[date], spotify_into_you[rank], markero, linestyle-, color#1DB954, linewidth2, labelSpotify Daily Rank) ax1.invert_yaxis() # 排名数字越小越好所以倒置Y轴 ax1.set_ylabel(Rank (Lower is Better), fontsize12) ax1.set_title(Ariana Grande - Into You Performance on Spotify Global Daily Chart, fontsize14, fontweightbold) ax1.legend() ax1.grid(True, alpha0.3) # 格式化X轴日期 date_format DateFormatter(%m-%d) ax1.xaxis.set_major_formatter(date_format) plt.setp(ax1.get_xticklabels(), rotation45) # 子图2Billboard Hot 100排名趋势 ax2 plt.subplot(2, 1, 2) ax2.plot(billboard_into_you[chart_date], billboard_into_you[rank], markers, linestyle--, color#FF6B6B, linewidth2, labelBillboard Hot 100 Rank) ax2.invert_yaxis() ax2.set_xlabel(Date, fontsize12) ax2.set_ylabel(Rank (Lower is Better), fontsize12) ax2.set_title(Into You Performance on Billboard Hot 100, fontsize14, fontweightbold) ax2.legend() ax2.grid(True, alpha0.3) ax2.xaxis.set_major_formatter(date_format) plt.setp(ax2.get_xticklabels(), rotation45) plt.tight_layout() plt.savefig(./data/into_you_chart_performance.png, dpi300, bbox_inchestight) plt.show()6.2 使用 Plotly 绘制交互式图表更推荐交互式图表可以放大查看细节体验更好。import plotly.graph_objects as go from plotly.subplots import make_subplots # 创建带子图的画布 fig make_subplots( rows2, cols1, subplot_titles(Spotify Global Daily Chart Rank, Billboard Hot 100 Rank), shared_xaxesFalse, vertical_spacing0.15 ) # 添加Spotify趋势线 fig.add_trace( go.Scatter( xspotify_into_you[date], yspotify_into_you[rank], modelinesmarkers, nameSpotify Rank, linedict(color#1DB954, width3), markerdict(size8), hovertemplateDate: %{x|%Y-%m-%d}brRank: %{y}extra/extra ), row1, col1 ) # 倒置Y轴排名 fig.update_yaxes(autorangereversed, row1, col1) # 添加Billboard趋势线 fig.add_trace( go.Scatter( xbillboard_into_you[chart_date], ybillboard_into_you[rank], modelinesmarkers, nameBillboard Rank, linedict(color#FF6B6B, width3, dashdash), markerdict(size8, symbolsquare), hovertemplateDate: %{x|%Y-%m-%d}brRank: %{y}brPeak Pos: %{customdata[0]}brWeeks on Chart: %{customdata[1]}extra/extra, customdatabillboard_into_you[[peak_pos, weeks_on_chart]] ), row2, col1 ) fig.update_yaxes(autorangereversed, row2, col1) # 更新布局 fig.update_layout( height800, title_textAriana Grande - Into You Chart Performance Analysis, title_font_size20, showlegendTrue, hovermodex unified ) fig.update_xaxes(title_textDate, row2, col1) fig.update_yaxes(title_textRank, row1, col1) fig.update_yaxes(title_textRank, row2, col1) # 保存为HTML文件可在浏览器中交互查看 fig.write_html(./data/into_you_interactive_chart.html) fig.show()7. 深度分析与洞察通过图表我们可以进行一些基础分析爬升速度观察歌曲从首次入榜到达到峰值排名所用的时间可以反映市场接受速度和宣传效果。峰值与持久力最高排名Peak Position和停留在榜单上的周数Weeks on Chart是衡量单曲成功与否的关键指标。平台差异比较同一时期在Spotify和Billboard上的排名趋势。流媒体平台可能更反映核心乐迷的即时收听行为而Billboard Hot 100综合了销量、流媒体和电台数据可能更“大众化”趋势变化可能略有滞后或不同。事件关联在图表上标注关键事件的时间点如MV首播、大型音乐节表演、专辑发行等可以直观判断这些事件对榜单表现的影响。8. 常见问题与排查方法问题现象可能原因排查方式解决方案billboard.py库获取数据失败或返回空Billboard官网HTML结构已更新导致库的解析器失效。检查库的版本查看GitHub Issues页面是否有类似问题。1. 升级billboard.py到最新版。2. 暂时使用其他数据源如公开数据集。3. 根据新的网页结构自行编写解析逻辑高级。请求Spotify数据时被拒绝或返回403错误请求头User-Agent被识别为爬虫或请求频率过高。检查请求头是否模拟了真实浏览器。使用time.sleep()控制请求间隔。1. 在请求头中添加合理的User-Agent。2. 在连续请求间增加随机延迟如time.sleep(1 random.random())。3.优先使用官方下载渠道。获取的数据中找不到《Into You》歌曲名称或艺人名称的匹配规则太严格如大小写、标点、特征词。打印数据的前几行查看实际的名称格式。1. 清洗时统一转为小写并去除空格。2. 使用模糊匹配或包含str.contains而非完全相等。3. 考虑歌曲可能有混音版Remix需调整筛选条件。Plotly图表无法显示或保存未正确安装Plotly的渲染依赖如kaleido引擎用于静态图保存。查看错误信息。1. 安装 Kaleido:pip install kaleido2. 在线查看时确保在Jupyter Notebook或支持的环境下运行。数据点稀少趋势线不连续数据获取的日期范围不连续或某些日期数据缺失。检查原始数据文件的日期列是否完整。1. 确保爬虫或下载覆盖了所有目标日期。2. 对于缺失日期可以考虑使用插值法估算但需注明。9. 最佳实践与使用建议合规第一始终将数据获取的合规性放在首位。先检查robots.txt尊重网站的rate limit优先使用官方API或提供的下载方式。数据备份将爬取到的原始数据Raw Data立即保存为CSV或JSON文件。所有数据处理和分析步骤都应基于这些原始文件的副本进行确保原始数据可追溯。模块化代码将数据获取、清洗、分析和可视化分别写成函数或类提高代码可读性和复用性。例如可以创建一个ChartFetcher类来处理不同平台的数据获取。添加日志在爬虫脚本中添加日志记录功能记录成功、失败、跳过等状态便于后期排查问题。错误处理与重试网络请求必须包含异常处理try...except对于暂时性错误如网络超时可以实现简单的重试机制。尊重版权与隐私本项目分析的数据是公开的榜单信息但得出的分析报告若用于公开传播或商业用途需注意数据解读的客观性避免对艺人或作品进行不当评价。所有图表建议注明数据来源和时间范围。这个项目展示了如何将公开的榜单数据转化为有价值的洞察。虽然不涉及复杂的AI模型但完整的数据工程流程——从获取、清洗、分析到可视化——是任何数据分析工作的基石。你可以将这套方法轻松复用到其他歌手、其他歌曲或其他榜单如Apple Music、YouTube音乐榜的分析上。核心在于找到可靠、合规的数据入口然后让代码和图表替你讲述数据背后的故事。