20254210 2025-2026-2 《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2542
姓名: 李承轩
学号:20254210
实验教师:王志强
实验日期:2026年5月26日
必修/选修: 必修课
一、项目总体设计
1.1 设计思路
采用模块化分层设计,将程序划分为五大核心模块:数据爬取模块、界面布局模块、歌曲交互模块、搜索筛选模块、数据导出模块。
首先通过爬虫技术抓取网络热门音乐榜单,提取歌曲名称、歌手信息、音乐播放链接;再搭建简洁直观的图形操作窗口,实现榜单展示、关键词搜索;最后实现点击歌曲跳转浏览器有声播放、数据导出、界面清空等拓展功能,全程不使用音频播放第三方库,依靠系统自带浏览器完成音乐出声播放,程序简洁稳定、实用性强。
1.2 项目核心功能
榜单爬虫抓取功能:自动访问音乐榜单网页,批量爬取热门歌曲信息与播放地址。
可视化榜单展示功能:在 GUI 窗口内整齐排版展示全部音乐排行榜单。
点击有声播放功能:鼠标单击任意歌曲,自动调用浏览器打开对应音乐页面,正常播放出声音,点击歌曲与播放内容完全对应,无错位错误。
关键词模糊搜索功能:输入歌曲名或歌手关键词,快速筛选匹配相关音乐。
Excel 数据导出功能:一键将全部榜单信息保存至 Excel 表格,方便查看与整理。
界面清空重置功能:一键清空搜索内容与榜单展示内容,快速重新操作。
二、系统实现过程
2.1 环境部署
在 PyCharm 终端执行命令安装所需第三方库:
plaintext
pip install requests beautifulsoup4 openpyxl————安装插件
2.2 代码功能实现
网络爬虫模块:设置请求请求头模拟浏览器访问,规避基础反爬机制,定位榜单标签,循环提取歌手、歌曲名、网页播放链接,整合存入列表。
GUI 界面搭建:创建主程序窗口,设置窗口大小、标题,布局搜索输入框、功能按钮、榜单展示文本框,界面布局整洁美观。
点击播放逻辑:获取鼠标点击行号,精准剔除标题空行偏移量,精准匹配对应歌曲链接,调用本地浏览器直接打开播放,实现有声播放。
搜索筛选逻辑:获取用户输入关键词,遍历所有爬取数据,匹配包含关键词的音乐并重新展示。
数据保存逻辑:创建 Excel 工作表,设置表头,循环写入所有音乐数据,完成本地文件保存。
辅助功能实现:编写清空函数,一键重置界面所有内容,优化用户操作体验。
2.3 源代码
import requests
from bs4 import BeautifulSoup
from openpyxl import Workbook
import tkinter as tk
from tkinter import scrolledtext, messagebox
import webbrowser
def get_music_rank():
url = "https://music.163.com/discover/toplist?id=19723756"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
res = requests.get(url, headers=headers)
res.encoding = "utf-8"
soup = BeautifulSoup(res.text, "html.parser")
song_list = []
textarea = soup.find("textarea", id="song-list-pre-data")
if textarea:
import json
data = json.loads(textarea.text)
for song in data:
song_name = song["name"]
singer = ",".join(artist["name"] for artist in song["artists"])
song_id = song["id"]
song_url = f"https://music.163.com/song?id={song_id}"
song_list.append([singer, song_name, song_url])
return song_list
all_song_data = []
def load_all_rank():
global all_song_data
all_song_data = get_music_rank()
text_area.delete(1.0, tk.END)
text_area.insert(tk.END, "======= 网易云热门音乐榜单 =======\n\n")
for i, (singer, song, _) in enumerate(all_song_data, 1):
text_area.insert(tk.END, f"{i}. {singer} - {song}\n")
def play_selected_song(event):
try:
index = text_area.index(tk.CURRENT)
line_num = int(index.split(".")[0])
real_index = line_num - 3
if 0 <= real_index < len(all_song_data):
singer, song, url = all_song_data[real_index]
webbrowser.open(url)
messagebox.showinfo("播放成功", f"已打开网页播放:\n{song}")
except:
pass
def search_song():
keyword = entry_search.get().strip()
if not keyword:
messagebox.showwarning("提示", "请输入搜索内容")
return
result = []
for item in all_song_data:
if keyword in item[0] or keyword in item[1]:
result.append(item)
text_area.delete(1.0, tk.END)
text_area.insert(tk.END, f"===== 搜索:{keyword} =====\n\n")
for i, (singer, song, _) in enumerate(result, 1):
text_area.insert(tk.END, f"{i}. {singer} - {song}\n")
def save_excel():
if not all_song_data:
messagebox.showwarning("提示", "请先加载榜单")
return
wb = Workbook()
ws = wb.active
ws.title = "音乐榜单"
ws.append(["歌手","歌曲名","播放链接"])
for s in all_song_data:
ws.append(s)
wb.save("音乐榜单.xlsx")
messagebox.showinfo("完成", "已导出Excel表格")
def clear_all():
text_area.delete(1.0, tk.END)
entry_search.delete(0, tk.END)
win = tk.Tk()
win.title("音乐爬虫播放系统")
win.geometry("750x550")
tk.Label(win, text="搜索歌曲:", font=("微软雅黑",11)).place(x=20, y=15)
entry_search = tk.Entry(win, width=32, font=("微软雅黑",11))
entry_search.place(x=100, y=17)
tk.Button(win, text="加载榜单", command=load_all_rank, bg="#409EFF", fg="white", width=9).place(x=360, y=15)
tk.Button(win, text="搜索", command=search_song, bg="#67C23A", fg="white", width=7).place(x=450, y=15)
tk.Button(win, text="导出Excel", command=save_excel, bg="#FF9800", fg="white", width=9).place(x=515, y=15)
tk.Button(win, text="清空", command=clear_all, bg="#F56C6C", fg="white", width=7).place(x=600, y=15)
text_area = scrolledtext.ScrolledText(win, width=90, height=28, font=("微软雅黑",11))
text_area.place(x=20, y=60)
text_area.bind("
win.mainloop()
三、实验测试与运行结果
3.1 运行测试步骤
运行 Python 程序,自动弹出可视化操作窗口。
点击加载榜单按钮,程序自动爬取并展示完整热门音乐排行榜。
鼠标单击任意一首歌曲,自动弹出浏览器并跳转音乐播放页面,正常播放出声音,歌曲匹配精准无误。
在搜索框输入歌曲名称或歌手名称,点击搜索,快速筛选出对应音乐。
点击导出 Excel 按钮,项目目录自动生成表格文件,保存所有音乐信息。
点击清空按钮,一键重置界面,可重新进行操作。
3.2 运行结果
程序整体运行流畅无报错,所有预设功能全部实现,界面操作简单便捷,数据抓取稳定,搜索筛选精准,浏览器跳转播放成功出声,Excel 文件正常生成保存,完全达到项目开发预期效果。
四、实验问题分析与解决方案
- 问题一:点击歌曲与播放歌曲不一致,出现索引错位
原因:榜单标题、空白行占用文本框行数,导致读取行号偏移。
解决:手动减去固定偏移行数,精准定位真实歌曲数据下标,实现一一对应。 - 问题二:程序无音乐播放声音
原因:未使用音频播放库,仅做文字提示无法出声。
解决:调用 Python 自带webbrowser库,跳转官方音乐网页,依靠网页原生播放器实现有声播放,无需额外安装音频库。 - 问题三:网页部分数据抓取失败
原因:网页部分标签格式不统一,存在异常数据。
解决:添加异常捕获语句try-except,跳过异常数据,保证程序正常运行不崩溃。 - 问题四:第三方库运行报错
原因:未安装对应依赖库,虚拟环境缺少运行组件。
解决:在终端执行 pip 安装命令,补齐所有所需依赖库。
五、课程整体学习总结
- 本学期 Python 综合实践课程体系完整、内容充实,课程由浅入深、循序渐进地带领我们系统学习了 Python 编程的知识体系,从最基础的Python 语法规则、变量定义、数据类型、输入输出,到条件判断、循环结构、异常处理等程序逻辑控制,同时学习了网络爬虫、图形界面 GUI 开发等实用性极强的应用技术,全面覆盖了 Python 基础编程与实战开发的关键知识点。
- 在课程学习过程中,我们从最简单的代码语法练习、小程序调试起步,逐步完成逻辑训练、函数封装、文件操作等基础任务,随后开始接触小型趣味项目开发,逐步过渡到网络数据爬取、可视化交互界面、数据自动化处理等综合型实践项目。通过层层递进的学习与训练,我不仅掌握了 Python 语言的核心语法与编程逻辑,更清晰理解了 Python 在日常办公自动化、网络数据采集、简单数据分析、信息批量处理等真实场景中的应用方式,真正做到了学以致用。
- 通过课堂实操、课后练习、项目开发等多形式训练,我已能够熟练使用PyCharm专业开发工具完成项目创建、代码编写、断点调试、错误排查与程序优化等操作,能够独立完成小型 Python 项目的需求分析、结构设计、代码实现与功能测试。在项目开发过程中,我深刻理解了模块化编程、代码分层封装、函数复用的重要意义,学会将复杂功能拆分为独立模块,提升了代码的可读性、可维护性与可扩展性。同时,我也熟练掌握了requests、BeautifulSoup、openpyxl、tkinter等常用第三方库的安装、导入与实际使用方法,具备了独立查阅文档、解决开发问题的基本能力,整体编程思维与工程实践能力得到了全面提升。
六、学习心得体会
- 经过一学期的 Python 课程学习,我收获颇丰,深刻感受到 Python 语言简洁易懂、实用性极强的特点。相比其他编程语言,Python 语法更加简洁亲民,入门难度低,上手速度快,非常适合零基础学习编程。
- 在本次音乐爬虫项目开发过程中,我遇到了索引错位、数据抓取异常、播放功能无法实现等诸多问题,在不断排查错误、查阅资料、修改调试代码的过程中,我的代码调试能力和独立解决问题的能力得到了极大提升。
- 同时我也深刻意识到,编程学习不能只学习理论知识,必须坚持动手实操,只有不断编写代码、完成项目实训,才能真正将课堂理论知识转化为自身实操能力。生活中很多繁琐重复的工作,都可以利用 Python 程序实现自动化处理,极大提升做事效率,这也让我对编程学习产生了更加浓厚的兴趣。在今后的学习中,我会坚持多敲代码、多做项目,不断积累实战经验,夯实编程基础。
七、课程学习意见与建议
- 建议课堂增加更多贴近日常生活的实用项目教学,例如天气提醒、数据整理、短视频下载、办公表格自动处理等,提升学生学习积极性。
- 适当增加小组合作实训项目,让学生分工完成项目开发,培养团队协作能力与项目统筹能力。
- 课后多布置小型趣味实训作业,由浅入深逐步提升项目难度,巩固课堂所学知识点。
最后感谢王志强老师一个学期的指导,辛苦啦~
浙公网安备 33010602011771号