Python实战:构建歌手Billboard Hot 100成绩自动化分析工具
2026/9/16 20:30:21 网站建设 项目流程

这次我们来看一个关于赛琳娜·戈麦斯(Selena Gomez)在公告牌百强单曲榜(Billboard Hot 100)成绩的数据分析项目。对于音乐爱好者、数据分析师或赛琳娜的粉丝来说,手动整理和排序一位歌手的所有上榜单曲及其峰值排名、在榜周数等数据,是一项繁琐且容易出错的工作。一个自动化的工具或脚本,能够从可靠数据源抓取、清洗并排序,最终输出一份清晰的可视化榜单,会非常有价值。

本文的核心是探讨如何构建一个本地化的、可复用的“歌手Hot 100成绩分析工具”。我们将重点关注这个工具的实现思路、技术门槛、数据获取方式、核心处理逻辑以及最终的可视化呈现。整个过程不涉及复杂的AI模型,但对编程基础和数据抓取的合规性有一定要求。如果你对Python数据处理、简单的网络请求(在合法合规前提下)以及图表生成感兴趣,这篇文章将带你走通一个完整的实战项目。

1. 核心能力速览

能力项说明
项目类型数据抓取、清洗、分析与可视化脚本/工具
核心功能自动获取指定歌手在Billboard Hot 100的历史成绩,按峰值排名排序,并生成Top 10榜单及可视化图表
技术栈Python (requests, pandas, matplotlib/seaborn, BeautifulSoup<需注意合规性>或使用官方API)
数据来源需依赖公开、合法的数据接口或静态数据集(如Kaggle数据集、Billboard官方API<若有>)
输出形式控制台打印的榜单、CSV/Excel文件、柱状图/折线图图片
硬件门槛极低,普通电脑即可运行,无需GPU
适合场景个人音乐数据分析学习、粉丝向数据整理、结合其他歌手数据的对比研究

2. 适用场景与使用边界

这个工具主要适合以下几类人群:

  • 音乐数据爱好者:希望用程序化方式研究歌手或歌曲的流行趋势。
  • 赛琳娜·戈麦斯或欧美流行乐粉丝:想要一份权威、准确、可视化的成绩单。
  • Python初学者或数据分析学习者:需要一个结合了数据获取、处理和可视化的完整练手项目。
  • 内容创作者:需要快速生成数据图表用于视频或文章素材。

使用边界与重要提醒:

  1. 数据来源合法性:这是本项目最重要的前提。严禁未经授权爬取受版权保护或明确禁止抓取的网站数据。优先考虑以下合法途径:
    • 使用Kaggle、Data.world等平台上的公开音乐数据集(例如“Billboard Hot 100 1958-2021”这类历史数据集)。
    • 寻找并遵守Billboard或音乐数据公司(如Spotify、Last.fm)提供的官方API的使用条款(通常有调用频率限制,可能涉及注册和API Key)。
    • 如果必须从网页获取,仅针对明确允许爬虫(查看robots.txt)或提供公开数据查询的页面,并严格控制请求频率,避免对服务器造成压力。
  2. 数据时效性:如果使用静态历史数据集,则无法获取最新的榜单成绩。需要根据分析目的选择合适的数据集。
  3. 分析维度:本项目聚焦“峰值排名”这一核心指标生成Top 10。实际分析中,“在榜周数”、“夺冠周数”、“流媒体分数”、“电台分数”等都是重要维度,工具可以扩展。
  4. 非商业用途:生成的分析结果建议用于个人学习、研究和分享,避免用于商业盈利,特别是涉及数据版权时。

3. 环境准备与前置条件

运行此项目,你需要准备以下环境:

  1. 操作系统:Windows 10/11, macOS, 或 Linux 发行版均可。
  2. Python 环境:推荐使用 Python 3.8 或更高版本。确保pip包管理器可用。
  3. 开发工具:任意代码编辑器(如VS Code、PyCharm)或Jupyter Notebook。
  4. 网络连接:用于下载Python包和获取数据(如果数据源在线)。
  5. 磁盘空间:几乎可忽略不计,仅存储代码、数据集(可能几MB到几十MB)和生成的图片。

关键检查点:

  • 在终端输入python --versionpython3 --version确认Python版本。
  • 确保可以正常访问你选定的数据源(如Kaggle网站或特定API端点)。

4. 安装部署与依赖管理

本项目没有复杂的服务需要启动,核心是安装必要的Python库。我们创建一个干净的虚拟环境并安装依赖。

步骤1:创建并激活虚拟环境(推荐)

# 在项目目录下 # 对于 macOS/Linux python3 -m venv venv source venv/bin/activate # 对于 Windows python -m venv venv venv\Scripts\activate

激活后,命令行提示符前会出现(venv)字样。

步骤2:安装依赖包我们将依赖写入一个requirements.txt文件。

# requirements.txt pandas>=1.4.0 # 数据处理与分析 numpy>=1.22.0 # 数值计算(pandas依赖) matplotlib>=3.5.0 # 基础绘图 seaborn>=0.11.2 # 更美观的统计图表 requests>=2.28.0 # 用于HTTP请求(如果使用API或下载文件) # beautifulsoup4>=4.11.1 # 如果需要解析HTML,请谨慎评估合规性后取消注释 # lxml>=4.9.0 # BeautifulSoup的解析器,可选

然后使用pip安装:

pip install -r requirements.txt

如果不用requirements.txt,也可以直接安装:

pip install pandas matplotlib seaborn requests

注意beautifulsoup4lxml库常用于网页解析。鉴于数据抓取的合规风险,本文后续示例将优先采用模拟已有数据集的方式进行,暂不包含网页抓取代码。如果你已确保数据源合规并决定使用,请自行安装。

5. 核心逻辑与代码实现

我们假设你已经通过合法途径获得了一份包含赛琳娜·戈麦斯所有Hot 100上榜记录的数据集(例如一个CSV文件selena_hot100_history.csv)。数据字段至少应包含:song_title(歌曲名),peak_rank(峰值排名),weeks_on_chart(在榜周数),chart_date(上榜日期)等。

5.1 数据加载与预览

import pandas as pd import matplotlib.pyplot as plt import seaborn as sns # 设置中文显示(如果需要) plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans'] plt.rcParams['axes.unicode_minus'] = False # 假设数据文件在当前目录 file_path = 'selena_hot100_history.csv' try: df = pd.read_csv(file_path, encoding='utf-8') # 或 'latin1',根据文件编码调整 print("数据加载成功!") print(f"数据形状:{df.shape}") # 查看行数和列数 print("\n前5行数据预览:") print(df.head()) except FileNotFoundError: print(f"错误:未找到文件 {file_path}。请将数据集放置于正确路径。") # 此处可以模拟一些示例数据用于演示代码逻辑 print("\n--- 以下使用模拟数据演示流程 ---") data = { 'song_title': ['Lose You To Love Me', 'Good For You', 'Same Old Love', 'Hands To Myself', 'The Heart Wants What It Wants', 'Come & Get It', 'Slow Down', 'Love You Like A Love Song', 'Who Says', 'Naturally'], 'peak_rank': [1, 5, 5, 7, 6, 6, 27, 22, 21, 29], # 示例峰值排名,非完全真实数据 'weeks_on_chart': [20, 25, 20, 19, 18, 22, 15, 30, 20, 18], 'chart_date': ['2019-10-26', '2015-07-11', '2015-11-28', '2016-01-30', '2014-11-15', '2013-05-04', '2013-08-24', '2012-02-11', '2011-04-16', '2010-02-20'] } df = pd.DataFrame(data) print(df)

5.2 数据清洗与排序

我们需要确保peak_rank是数值型,并且处理可能存在的空值。然后按peak_rank升序排序(排名数字越小越好)。

# 1. 确保peak_rank是数值型,非数字或空值处理为NaN df['peak_rank'] = pd.to_numeric(df['peak_rank'], errors='coerce') # 2. 删除peak_rank为NaN的行(即没有有效排名的记录) df_clean = df.dropna(subset=['peak_rank']).copy() # 3. 按峰值排名升序排序 df_sorted = df_clean.sort_values(by='peak_rank', ascending=True) # 4. 选取排名最好的前10首(如果歌曲数不足10,则取全部) top_10 = df_sorted.head(10).reset_index(drop=True) print("\n=== Selena Gomez Billboard Hot 100 成绩最好的10首歌 ===") print(top_10[['song_title', 'peak_rank', 'weeks_on_chart', 'chart_date']])

5.3 生成可视化图表

用图表能让数据更直观。我们生成一个横向柱状图,展示Top 10歌曲及其峰值排名。

# 设置图表风格 sns.set_style("whitegrid") plt.figure(figsize=(12, 8)) # 创建横向柱状图,颜色根据排名深浅渐变 bar_plot = sns.barplot(data=top_10, y='song_title', x='peak_rank', palette='viridis_r', orient='h') # 美化图表 plt.title('Selena Gomez: Top 10 Songs on Billboard Hot 100 (by Peak Rank)', fontsize=16, fontweight='bold') plt.xlabel('Peak Rank (Lower is Better)', fontsize=12) plt.ylabel('Song Title', fontsize=12) # 在柱子上显示具体的排名数字 for i, (value, song) in enumerate(zip(top_10['peak_rank'], top_10['song_title'])): # 根据柱子长度决定文本位置,确保清晰可读 bar_plot.text(value + 0.3, i, f'#{int(value)}', va='center', fontsize=10, fontweight='bold') plt.tight_layout() # 保存图表 output_image_path = 'selena_top10_hot100.png' plt.savefig(output_image_path, dpi=300) print(f"\n可视化图表已保存至:{output_image_path}") # 显示图表 plt.show()

5.4 扩展分析:在榜时长与排名关系

除了峰值排名,在榜周数(weeks_on_chart)也是衡量歌曲持久力的关键指标。我们可以生成散点图观察两者的关系。

plt.figure(figsize=(10, 6)) scatter_plot = sns.scatterplot(data=top_10, x='peak_rank', y='weeks_on_chart', s=100, hue='song_title', palette='tab20', legend=False) plt.title('Peak Rank vs. Weeks on Chart for Top 10 Songs', fontsize=14) plt.xlabel('Peak Rank (Lower is Better)') plt.ylabel('Weeks on Chart') plt.gca().invert_xaxis() # 反转X轴,让排名第一的在右边,更直观 # 为每个点添加歌曲名标签 for line in range(0, top_10.shape[0]): scatter_plot.text(top_10['peak_rank'][line]+0.1, top_10['weeks_on_chart'][line]+0.1, top_10['song_title'][line], horizontalalignment='left', size='small', color='black') plt.tight_layout() plt.savefig('peak_vs_weeks.png', dpi=300) plt.show()

6. 使用官方API或数据集的思路

如果希望获取更实时或更规范的数据,以下是两种更推荐的思路:

思路A:使用Kaggle等平台的静态数据集

  1. 在Kaggle搜索“Billboard Hot 100 History”。
  2. 下载数据集(通常为CSV),例如包含所有年份所有上榜歌曲的记录。
  3. 使用pandas读取该大表,然后筛选出artist列包含“Selena Gomez”的行。
  4. 后续处理逻辑与上述5.2、5.3节完全相同。
# 伪代码示例 all_billboard_data = pd.read_csv('billboard_hot100_1958-2021.csv') selena_data = all_billboard_data[all_billboard_data['artist'].str.contains('Selena Gomez', case=False, na=False)] # 然后进行去重、排序等操作

思路B:使用音乐数据API(需注册和遵守条款)以Spotify API为例(它不直接提供Billboard排名,但可获取歌曲流行度等数据,Billboard数据需另寻API):

  1. 前往 Spotify Developer Dashboard 创建应用,获取CLIENT_IDCLIENT_SECRET
  2. 使用requests库进行OAuth认证,获取访问令牌。
  3. 搜索Selena Gomez的歌曲,并获取其popularity等指标进行分析。
import requests import base64 # 1. 获取访问令牌 (Client Credentials Flow) client_id = 'YOUR_CLIENT_ID' client_secret = 'YOUR_CLIENT_SECRET' auth_url = 'https://accounts.spotify.com/api/token' auth_header = base64.b64encode(f'{client_id}:{client_secret}'.encode()).decode() auth_data = {'grant_type': 'client_credentials'} auth_headers = {'Authorization': f'Basic {auth_header}'} response = requests.post(auth_url, headers=auth_headers, data=auth_data) token = response.json()['access_token'] # 2. 搜索歌手 search_headers = {'Authorization': f'Bearer {token}'} search_params = {'q': 'artist:Selena Gomez', 'type': 'track', 'limit': 50} search_response = requests.get('https://api.spotify.com/v1/search', headers=search_headers, params=search_params) # ... 解析response,获取歌曲列表和流行度

请注意:直接获取Billboard排名通常需要专门的音乐榜单API,这类服务可能是付费的。务必在合法合规的前提下进行。

7. 项目文件结构与运行方式

一个结构清晰的项目目录有助于管理。

selena_billboard_analysis/ ├── data/ # 存放数据文件 │ ├── raw/ # 原始数据(如果需要) │ └── processed/ # 处理后的数据 ├── src/ # 源代码 │ ├── data_fetcher.py # 数据获取模块(如使用API) │ ├── data_processor.py # 数据清洗与处理模块 │ └── visualizer.py # 可视化模块 ├── output/ # 输出目录 │ ├── charts/ # 生成的图表 │ └── reports/ # 生成的报告(如CSV) ├── config.py # 配置文件(如API密钥,记得.gitignore) ├── main.py # 主程序入口 ├── requirements.txt # 项目依赖 └── README.md # 项目说明

运行方式

  1. 将数据集(如selena_hot100_history.csv)放入data/raw/目录。
  2. main.py中调用各个模块的函数。
  3. 在项目根目录下执行:
python main.py
  1. 查看控制台输出的榜单,并在output/目录下找到生成的图表。

8. 常见问题与排查方法

问题现象可能原因排查方式解决方案
运行代码提示FileNotFoundError数据文件路径错误或文件名不正确检查pd.read_csv()中的文件路径字符串使用绝对路径,或确保相对路径正确。使用os.path.exists()检查文件是否存在。
图表中文显示为方框系统缺少中文字体或matplotlib未配置中文字体检查plt.rcParams设置安装中文字体(如SimHei),或在代码中指定一个已存在的字体(如‘DejaVu Sans’),或避免使用中文。
排序结果不正确peak_rank列可能不是数值类型(如包含“#1”这样的字符)打印df[‘peak_rank’].dtype查看类型使用pd.to_numeric(errors=‘coerce’)强制转换,并处理转换失败的行。
API请求返回401403错误API密钥无效、过期或请求未授权检查API密钥是否正确,请求头(如Authorization)格式是否正确重新生成API密钥,查阅官方文档确认认证方式。
从网页抓取数据失败网页结构发生变化、IP被限制或robots.txt禁止打印响应内容,检查HTTP状态码,查看网站robots.txt文件更新解析逻辑(如CSS选择器),添加请求头(如User-Agent),降低请求频率,或放弃抓取寻找替代数据源。
生成的图表图片空白或只有坐标轴可能在plt.show()之前调用了plt.savefig(),或者数据全为NaN调整代码顺序,确保plt.savefig()plt.show()之前;检查用于绘图的数据列是否有有效值plt.savefig(),再plt.show()。清洗数据,确保绘图列没有空值。

9. 最佳实践与使用建议

  1. 数据备份:始终保留一份原始的、未修改的数据文件。所有清洗和转换操作都应在副本上进行。
  2. 代码模块化:将数据获取、处理、可视化写成独立的函数或类,提高代码可读性和复用性。这样,分析其他歌手时只需修改少量参数。
  3. 参数化配置:将歌手名字、数据文件路径、输出目录、图表颜色主题等写入配置文件(如config.pyconfig.yaml),避免硬编码。
  4. 错误处理与日志:在关键步骤(如文件读取、API请求、数据转换)添加try-except块,并记录日志,便于调试。
  5. 尊重数据版权:这是最重要的原则。清晰记录你所使用的数据集的来源和授权方式。在分享你的分析结果时,注明数据出处。
  6. 扩展分析维度:除了峰值排名,可以尝试计算“平均排名”、“在榜总周数”、“进入前10/前40的次数”等指标,让分析更立体。
  7. 版本控制:使用Git管理你的代码和项目,特别是当你在尝试不同的数据源或分析方法时。

10. 总结与下一步

通过这个项目,我们实现了一个从数据准备、清洗、分析到可视化的完整流程,最终得到了赛琳娜·戈麦斯在Billboard Hot 100榜单上成绩最好的10首歌的清晰列表和图表。整个过程的核心在于数据的合法获取pandas、matplotlib/seaborn库的熟练运用,技术门槛更偏向数据处理而非AI模型部署。

最值得尝试的扩展方向:

  1. 多歌手对比:修改工具,使其能同时加载多位歌手(如Taylor Swift, Ariana Grande)的数据,生成对比图表,看看谁的前10名歌曲峰值排名更优。
  2. 时间趋势分析:将chart_date转换为日期时间格式,分析赛琳娜歌曲排名随时间的变化趋势,看她音乐生涯的“高峰”期。
  3. 集成更多数据源:在合规前提下,尝试结合Spotify的音频特征(如舞蹈性、能量值)数据,分析“排名高的歌曲是否在音乐特性上有共性”。
  4. 构建简单Web应用:使用FlaskStreamlit框架,将整个分析流程包装成一个有简单界面的Web应用,用户输入歌手名即可生成分析报告。

这个项目是一个很好的起点,它涉及的技能(数据获取、清洗、分析、可视化)是数据科学领域的通用基础。掌握了这套方法,你完全可以将其应用于分析任何你感兴趣的榜单数据。

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

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

立即咨询