《Python实验四程序设计》实验报告
《Python实验四程序设计》实验报告
姓名 孙益
学号 20251110
班级 2511
实验教师 王志强
实验日期 2026年5月25日
必修/选修 公选课
一、实验内容
本次实验要求综合运用Python完成一个功能丰富的应用程序,至少包含5项功能。我选择开发一款“CS2职业选手数据分析与可视化系统”,该系统集成了以下六大核心功能:
1.网络爬虫:从HLTV.org抓取CS2职业选手的Rating、KPR、DPR、Impact、KAST等数据。
2.数据处理与存储:使用Pandas进行数据处理,并持久化为CSV文件。
3.数据可视化:利用Matplotlib绘制选手Rating横向条形图、KPR/DPR散点图(气泡大小表示Impact)。
4.神经网络预测:基于大模型提供的Scikit-learn的MLP回归模型,通过历史特征预测选手未来Rating。
5.微信自动推送:集成PushPlus API(需要注册并获取一个token,微信里关注PushPlus),每日自动推送Top5选手快报到微信。
6.交互小游戏:使用tkinter开发“Niko追逐Major冠军”贪吃蛇风格游戏,支持方向键操控。
注:在数据获取环节,最初设计从HLTV直接爬取实时数据,但实验中发现HLTV网站有严格的反爬机制(Cloudflare防护),常规请求会被封禁IP,导致爬虫失效。面对这一实际问题,采取“在线爬取+本地备用数据”双轨策略:首先尝试使用requests+BeautifulSoup抓取HLTV页面,当遭遇403或超时失败时,自动切换至内置的2024-2025赛季职业选手真实统计数据集,保证了系统的稳定性和演示的完整性。
二、实验环境与工具
主要依赖库:
requests, beautifulsoup4:爬虫模块
pandas:数据处理
matplotlib:数据可视化
scikit-learn:神经网络预测
tkinter(内置):小游戏界面
所有依赖通过pip install requests beautifulsoup4 pandas matplotlib scikit-learn安装。
三、系统设计与实现
3.1 系统架构
系统采用模块化设计,通过主菜单循环调用各功能函数,结构清晰。
text
主程序 main()
├── 功能1:数据爬取 crawl_cs2_players()
│ ├── 在线爬取(requests + BeautifulSoup)
│ └── 备用内置数据集 get_builtin_data()
├── 功能2:数据处理 process_data()
├── 功能3:数据可视化 visualize()
├── 功能4:神经网络预测 ml_predict_rating()
├── 功能5:微信推送 send_wechat_report()
└── 功能6:小游戏 niko_chase_major()

3.2 爬虫模块设计与反爬应对
爬虫目标:HLTV.org的选手统计页面( https://www.hltv.org/stats/players ) 提取选手名称、Rating 2.0、KPR、DPR、Impact、KAST。
实现过程:
python
def crawl_cs2_players():
url = "https://www.hltv.org/stats/players"
headers = {"User-Agent": "Mozilla/5.0 ..."}
try:
resp = requests.get(url, headers=headers, timeout=15)
soup = BeautifulSoup(resp.text, 'html.parser')
table = soup.find('table', class_='stats-table')
# 解析表格行,提取数据
...
return df
return get_builtin_data()
遇到的问题:多次运行后,HLTV返回403状态码或Cloudflare验证页面,表明IP已被拉黑。

分析原因:HLTV使用了Cloudflare的Bot防护,简单的requests请求缺少必要的浏览器指纹和JavaScript执行能力,被识别为爬虫而封锁。
解决方案:采用“爬虫尝试+备用数据”的容错机制。在线抓取失败时自动调用get_builtin_data(),该函数返回一个包含25名真实选手统计数据的DataFrame,数据基于2024-2025赛季HLTV官方统计近似值,保证了功能演示的连续性。同时在报告中如实描述遇到的困难及应对策略,体现了解决实际问题的能力。
3.3 数据处理模块
使用Pandas对爬取或备用数据进行清洗:
删除重复选手记录
删除含有空值的行
将清洗后的数据保存为cs2_players.csv,便于后续可视化、预测等模块复用。
关键代码:
python
def process_data(df):
df = df.drop_duplicates(subset=['player']).dropna()
df.to_csv("cs2_players.csv", index=False, encoding='utf-8-sig')
return df
3.4 数据可视化模块
利用Matplotlib绘制两个子图:
横向条形图:展示Rating前15名选手,直观对比选手实力。
散点图:以KPR为x轴,DPR为y轴,气泡大小表示Impact,颜色表示Rating,直观反映选手的击杀效率、生存能力和综合影响力。

3.5 神经网络预测模块
使用Scikit-learn的MLPRegressor构建多层感知机回归模型,以KPR、DPR、Impact、KAST为特征,预测选手的Rating。数据集按7:3划分训练集和测试集,并进行标准化处理。模型结构为两个隐藏层(16和8个神经元)。

3.6 微信推送模块
集成PushPlus平台的API,将Rating前5名选手的信息组装成文本,通过HTTP POST请求发送到用户微信。需要在代码中配置PUSHPLUS_TOKEN。

3.7 小游戏模块
使用tkinter开发“Niko追逐Major冠军”游戏,玩家控制绿色方块(Niko)移动,吃到金色冠军奖杯(🏆)得分。游戏窗口启动时通过focus_force()和focus_set()强制获取键盘焦点,确保方向键直接响应。
游戏采用帧循环(after方法)实现移动刷新,碰撞检测包括墙壁和自身碰撞。游戏结束时显示获得冠军数量。

四、实验结果与分析
4.1 功能测试
依次运行系统菜单功能,所有模块均正常工作:
功能1:首次尝试在线爬取HLTV失败后,自动启用备用数据,生成cs2_players.csv文件。
功能2:成功弹出Matplotlib窗口,显示Top15 Rating条形图和KPR/DPR散点图,图表标注清晰,无乱码。
功能3:神经网络训练收敛,输出训练集和测试集R²,对最后5名选手的预测误差在合理范围内。
功能4:填入PushPlus Token后,电脑能发送“CS2快报”消息。
功能5:游戏窗口弹出后可直接用方向键操控,吃到冠军得分,ESC退出,运行流畅。
4.2 爬虫失败原因分析
HLTV的Cloudflare防护采用了JavaScript挑战和浏览器指纹检测,简单的requests无法模拟完整浏览器环境。尝试过的cloudscraper库也因版本更新导致失效也试过Liquipedia MediaWiki API始终达不到预期效果。通过备用数据方案,系统在无法在线获取时依然能完成所有分析任务。
4.3 可视化结果解读
从条形图可见,donk、m0NESY、ZywOo的Rating显著高于其他选手,符合当前赛季公认的Top3选手表现。散点图显示高Rating选手通常位于高KPR、低DPR区域(左上角),且气泡较大,说明击杀效率、生存能力和影响力是评价顶尖选手的关键指标。
4.4 神经网络模型评估
模型测试集R²达到0.97,说明KPR、DPR、Impact、KAST四个特征能很好解释Rating的变化。但模型泛化能力仍有局限,因为数据量较小(25条),实际应用中需更大数据集。
五、总结与体会
通过本次Python综合实验,我完整实践了网络爬虫、数据处理、可视化、机器学习和GUI编程等多个技术领域。在爬虫环节遇到了真实的反爬问题,并通过大模型接触到了如何设计容错机制保证系统可靠性。数据可视化帮助我直观理解了职业选手的数据特征,神经网络预测则让我初步接触了机器学习建模流程。
本系统的不足在于爬虫模块未彻底解决HLTV的反爬问题,未来可以尝试使用Selenium模拟浏览器或寻找替代数据API。
参考代码:
https://gitee.com/syqwq-123456/PythonProjects/commit/c4e11d46622e375b7427fca3f7ef90aa3a1a56ef
参考视频:
https://www.bilibili.com/video/BV1UFGZ6rE6N/?spm_id_from=333.1387.homepage.video_card.click
六、全课总结和感想
从python的最基本概念,算法(语法)一步一步深入到多种模块的知识,让我比较深刻的盖浇饭和蛋炒饭的比喻,git和博客园的使用,大模型的使用,socket库和网络爬虫。
在课上我学到了许多也收获了许多,比如元组,数组,集合等基础概念,如何托管和上传代码,markdown的概念,也通过4次实验亲自的体会,编写python的代码,实现一个个功能,让我有一种满足感,不再把周一的晚课当作无所谓的晚课,而是能学到真东西的时间。
并且王老师的讲课风趣,上课氛围轻松并且非常热心的解决同学们的各种问题(帮指出lambda函数的问题)
七、建议
希望python可以作为一门主课而不是一门公选课(虽然王老师压力会很大),学的模块很多很新颖,但课时短学的有些仓促,有些并没有真正的掌握。但python课给到夯爆了。
浙公网安备 33010602011771号