20243429 2025-2026-2《Python程序设计》实验四报告
课程:《Python程序设计》
班级: 2434
姓名: 付家祺
学号:20243429
实验教师:王志强老师
实验日期:2026年5月25日
必修/选修: 公选课
一.实验内容
Python综合应用:爬虫、数据处理、可视化、机器学习、神经网络、游戏、网络安全等。
例如:编写从社交网络爬取数据,实现可视化舆情监控或者情感分析。
例如:利用公开数据集,开展图像分类、恶意软件检测等
例如:利用Python库,基于OCR技术实现自动化提取图片中数据,并填入excel中。
例如:爬取天气数据,实现自动化微信提醒
例如:利用爬虫,实现自动化下载网站视频、文件等。
例如:编写小游戏:坦克大战、贪吃蛇、扫雷等等
注:在Windows/Linux系统上使用VIM、PDB、IDLE、Pycharm等工具编程实现。
二、实验过程及结果
(1)实验代码如下:
点击查看代码
import matplotlib.pyplot as plt
import turtle
import os
import requests
import pandas as pd
#功能1:网络爬虫
def file_download_crawler():
print("\n功能1:网络爬虫,自动下载网络视频、图片、文件")
if not os.path.exists("download_files"):
os.mkdir("download_files")
download_items = [
{"name": "高清图片", "url": " https://img0.baidu.com/it/u=88982420 ,2481923604&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500", "path": "download_files/image.jpg"},
{"name": "短视频", "url": "https://www.w3school.com.cn/i/movie.mp4", "path": "download_files/video.mp4"},
{"name": "测试文件", "url": "https://www.baidu.com/robots.txt", "path": "download_files/test.txt"}
]
try:
for item in download_items:
print(f"\n正在下载:{item['name']}")
res = requests.get(item["url"], stream=True, timeout=30)
res.raise_for_status()
with open(item["path"], "wb") as f:
f.write(res.content)
print(f"下载完成 → {item['path']}")
print("\n全部下载完成!")
except Exception as e:
print(f"\n下载失败,原因:{str(e)}")
input("\n按回车返回菜单...")
#功能2:数据可视化
def data_visualization():
print("\n功能2:数据可视化")
data = {"正面":128, "负面":45, "中性":89, "未表态":32}
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.bar(data.keys(), data.values(), color=["green","red","blue","gray"])
plt.title("舆情监控图")
plt.ylabel("数量")
plt.show()
input("\n按回车返回菜单...")
#功能3:OCR识别写入excel表格
def ocr_to_excel():
print("\n 功能3:OCR识别数据并写入excel表格")
data = [
{"姓名": "张三", "年龄": 20, "性别": "男", "电话": "13800138000"},
{"姓名": "李四", "年龄": 22, "性别": "女", "电话": "13900139000"},
{"姓名": "王五", "年龄": 21, "性别": "男", "电话": "13700137000"}
]
df = pd.DataFrame(data)
df.to_excel("OCR识别结果.xlsx", index=False)
print(" OCR识别完成!")
print(" 数据已自动填入 Excel 表格!")
print("📄 文件:OCR识别结果.xlsx")
input("\n按回车返回菜单...")
#功能4:密码强度检测
def password_check():
print("\n功能4:网络安全(密码强度检测)")
password = input("请输入需要检测的密码:")
strength = 0
tips = []
if len(password) >= 8:
strength += 20
tips.append("密码长度达标(≥8位)")
else:
tips.append("密码长度不足(建议≥8位)")
if any(c.isupper() for c in password):
strength += 20
tips.append("包含大写字母")
else:
tips.append("未包含大写字母")
if any(c.islower() for c in password):
strength += 20
tips.append("包含小写字母")
else:
tips.append("未包含小写字母")
if any(c.isdigit() for c in password):
strength += 20
tips.append("包含数字")
else:
tips.append("未包含数字")
if any(c in "-_=+[]{}?/.>" for c in password):
strength += 20
tips.append("包含特殊符号")
else:
tips.append("未包含特殊符号")
print("\n密码强度评分:", strength, "分")
if strength >= 80:
print("密码强度:强")
elif strength >= 60:
print("密码强度:中等")
else:
print("密码强度:弱(建议优化)")
print("\n优化建议:")
for tip in tips:
print(tip)
input("\n按回车返回主菜单...")
#功能5:五子棋小游戏
def gobang_game():
print("\n===== 功能5:五子棋小游戏 =====")
screen = turtle.Screen()
screen.title("简易五子棋")
screen.setup(500,500)
screen.tracer(0)
pen = turtle.Turtle()
pen.hideturtle()
pen.penup()
def draw_board():
for i in range(16):
pen.goto(-240, -240+i*32)
pen.pendown()
pen.goto(240, -240+i*32)
pen.penup()
pen.goto(-240+i*32, -240)
pen.pendown()
pen.goto(-240+i*32, 240)
pen.penup()
board = [[0]*15 for _ in range(15)]
turn = 1
game_over = False
def draw_chess(x,y,color):
pen.goto(x,y-15)
pen.color(color)
pen.begin_fill()
pen.circle(15)
pen.end_fill()
def check_win(row, col, p):
dirs = [(0,1),(1,0),(1,1),(1,-1)]
for dr,dc in dirs:
c = 1
r,cc = row+dr, col+dc
while 0<=r<15 and 0<=cc<15 and board[r][cc]==p:
c+=1; r+=dr; cc+=dc
r,cc = row-dr, col-dc
while 0<=r<15 and 0<=cc<15 and board[r][cc]==p:
c+=1; r-=dr; cc-=dc
if c>=5:return True
return False
def click(x,y):
nonlocal turn,game_over
if game_over:return
col = round((x+240)/32)
row = round((y+240)/32)
if 0<=row<15 and 0<=col<15 and board[row][col]==0:
board[row][col]=turn
cx=col*32-240
cy=row*32-240
if turn==1:
draw_chess(cx,cy,"black")
if check_win(row,col,1):
turtle.title("黑棋获胜!")
game_over=True
turn=2
else:
draw_chess(cx,cy,"white")
if check_win(row,col,2):
turtle.title("白棋获胜!")
game_over=True
turn=1
screen.update()
draw_board()
screen.onclick(click)
screen.update()
try:
screen.mainloop()
except:
pass
def main():
while True:
print("\n"+"="*55)
print("Python 综合实践程序")
print("="*55)
print(" 1 - 网络爬虫:下载视频/图片/文件")
print(" 2 - 数据可视化:舆情图表")
print(" 3 - OCR识别数据写入Excel")
print(" 4 - 网络安全:密码强度检测")
print(" 5 - 小游戏:简易五子棋")
print(" 0 - 退出程序")
print("="*55)
choose = input("请输入编号:")
if choose=="1": file_download_crawler()
elif choose=="2": data_visualization()
elif choose=="3": ocr_to_excel()
elif choose=="4": password_check()
elif choose=="5": gobang_game()
elif choose=="0":
print("已退出")
break
else: print("输入错误!")
if __name__ == "__main__":
main()
(2)程序分析:
a.应用总体介绍:
1.网络爬虫:该代码可从网络爬取图片、短视频、文本文件,一键下载并保存到本地文件夹;
2.数据可视化:向代码中输入数据,可生成柱状图,可展示其中的数据分布;
3.OCR识别写入Excel:模拟图片文字识别功能,自动提取数据并保存至 Excel 表格;
4.网络安全:代码实现的是密码强度检测这一功能,可以通过多个角度判断输入的密码是否安全;
5.游戏:五子棋游戏。
另:拥有菜单功能,可在上述功能进行退出切换。
b.代码所需环境:
需在终端输入
pip install requests matplotlib pandas openpyxl
其中:
requests:进行网络爬虫工作;
matplotlib:需要用来画数据柱状图;
pandas:用来自动生成Excel表格;
openpyxl:让pandas能保存.xlsx文件
c.程序过程解析及结果
功能1代码
代码如下:
点击查看代码
#功能1:网络爬虫
def file_download_crawler():
print("\n功能1:网络爬虫,自动下载网络视频、图片、文件")
if not os.path.exists("download_files"):
os.mkdir("download_files")
download_items = [
{"name": "高清图片", "url": " https://img0.baidu.com/it/u=88982420 ,2481923604&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500", "path": "download_files/image.jpg"},
{"name": "短视频", "url": "https://www.w3school.com.cn/i/movie.mp4", "path": "download_files/video.mp4"},
{"name": "测试文件", "url": "https://www.baidu.com/robots.txt", "path": "download_files/test.txt"}
]
try:
for item in download_items:
print(f"\n正在下载:{item['name']}")
res = requests.get(item["url"], stream=True, timeout=30)
res.raise_for_status()
with open(item["path"], "wb") as f:
f.write(res.content)
print(f"下载完成 → {item['path']}")
print("\n全部下载完成!")
except Exception as e:
print(f"\n下载失败,原因:{str(e)}")
input("\n按回车返回菜单...")
首先程序自动创建资源存储目录,通过os.path.exists函数检测本地文件夹状态,判断是否存在download_files保存目录。若目录不存在,则调用os.mkdir方法自动创建该文件夹,用于统一存放下载资源。随后定义网络资源下载列表,集合图片、视频、文本等公开网络资源链接。程序利用requests爬虫工具访问对应网址,获取线上文件资源内容,并以二进制读取方式,通过f.write将资源数据写入本地电脑完成保存。同时设置异常捕获机制,若出现网络异常、链接失效等下载失败问题,程序会自动弹出对应的错误提示信息。
结果演示:



功能2代码
代码如下:
点击查看代码
#功能2:数据可视化
def data_visualization():
print("\n功能2:数据可视化")
data = {"正面":128, "负面":45, "中性":89, "未表态":32}
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.bar(data.keys(), data.values(), color=["green","red","blue","gray"])
plt.title("舆情监控图")
plt.ylabel("数量")
plt.show()
input("\n按回车返回菜单...")
首先定义函数data_visualization(),启动数据可视化功能。在函数内导入并录入提前准备好的舆情统计数据,为解决中文乱码问题进行环境配置,设置本地中文字体。调用plt.bar()方法绘制柱状图,并为不同舆情类别配置区分颜色,使数据差异直观清晰。随后设置图表标题与坐标轴信息,完成可视化图表绘制。调用 plt.show()弹出可视化展示窗口,呈现最终统计结果。用户关闭图表窗口后,可按下回车键返回程序主菜单,生成的可视化图表结果也可保存至本地电脑文件中。
结果演示:



功能3代码
代码如下:
点击查看代码
#功能3:OCR识别写入excel表格
def ocr_to_excel():
print("\n 功能3:OCR识别数据并写入excel表格")
data = [
{"姓名": "张三", "年龄": 20, "性别": "男", "电话": "13800138000"},
{"姓名": "李四", "年龄": 22, "性别": "女", "电话": "13900139000"},
{"姓名": "王五", "年龄": 21, "性别": "男", "电话": "13700137000"}
]
df = pd.DataFrame(data)
df.to_excel("OCR识别结果.xlsx", index=False)
print(" OCR识别完成!")
print(" 数据已自动填入 Excel 表格!")
print("📄 文件:OCR识别结果.xlsx")
input("\n按回车返回菜单...")
首先定义函数ocr_to_excel(),执行OCR数据导出功能,然后向代码输入准备好的人员数据信息,利用pd.DataFrame将数据转化为表格结构后,调用to_excel生成Excel文件,并将数据填入后,可自动保存至文件夹中。
结果如下:




功能4代码
代码如下:
点击查看代码
#功能4:密码强度检测
def password_check():
print("\n功能4:网络安全(密码强度检测)")
password = input("请输入需要检测的密码:")
strength = 0
tips = []
if len(password) >= 8:
strength += 20
tips.append("密码长度达标(≥8位)")
else:
tips.append("密码长度不足(建议≥8位)")
if any(c.isupper() for c in password):
strength += 20
tips.append("包含大写字母")
else:
tips.append("未包含大写字母")
if any(c.islower() for c in password):
strength += 20
tips.append("包含小写字母")
else:
tips.append("未包含小写字母")
if any(c.isdigit() for c in password):
strength += 20
tips.append("包含数字")
else:
tips.append("未包含数字")
if any(c in "-_=+[]{}?/.>" for c in password):
strength += 20
tips.append("包含特殊符号")
else:
tips.append("未包含特殊符号")
print("\n密码强度评分:", strength, "分")
if strength >= 80:
print("密码强度:强")
elif strength >= 60:
print("密码强度:中等")
else:
print("密码强度:弱(建议优化)")
print("\n优化建议:")
for tip in tips:
print(tip)
input("\n按回车返回主菜单...")
首先定义函数password_check(),将输入的密码保存至变量之中,然后创建空列表,用于存储优化信息,后根据输入密码信息的要求判断是否符合安全:
判断密码长度是否大于等于 8 位,达标则加 20 分并记录提示,不达标则记录优化建议。
判断密码中是否包含大写字母,包含则加 20 分并记录提示,不包含则给出建议。
判断密码中是否包含小写字母,包含则加 20 分并记录提示,不包含则给出建议。
判断密码中是否包含数字,包含则加 20 分并记录提示,不包含则给出建议。
判断密码中是否包含指定特殊符号(-_=+[]{}?/.>),包含则加 20 分并记录提示,不包含则给出建议。
最终根据输出密码的强度总分判断密码等级。
结果如下

当输入弱密码时


当输入强密码时


功能5代码
点击查看代码
#功能5:五子棋小游戏
代码如下:
def gobang_game():
print("\n===== 功能5:五子棋小游戏 =====")
screen = turtle.Screen()
screen.title("简易五子棋")
screen.setup(500,500)
screen.tracer(0)
pen = turtle.Turtle()
pen.hideturtle()
pen.penup()
def draw_board():
for i in range(16):
pen.goto(-240, -240+i*32)
pen.pendown()
pen.goto(240, -240+i*32)
pen.penup()
pen.goto(-240+i*32, -240)
pen.pendown()
pen.goto(-240+i*32, 240)
pen.penup()
board = [[0]*15 for _ in range(15)]
turn = 1
game_over = False
def draw_chess(x,y,color):
pen.goto(x,y-15)
pen.color(color)
pen.begin_fill()
pen.circle(15)
pen.end_fill()
def check_win(row, col, p):
dirs = [(0,1),(1,0),(1,1),(1,-1)]
for dr,dc in dirs:
c = 1
r,cc = row+dr, col+dc
while 0<=r<15 and 0<=cc<15 and board[r][cc]==p:
c+=1; r+=dr; cc+=dc
r,cc = row-dr, col-dc
while 0<=r<15 and 0<=cc<15 and board[r][cc]==p:
c+=1; r-=dr; cc-=dc
if c>=5:return True
return False
def click(x,y):
nonlocal turn,game_over
if game_over:return
col = round((x+240)/32)
row = round((y+240)/32)
if 0<=row<15 and 0<=col<15 and board[row][col]==0:
board[row][col]=turn
cx=col*32-240
cy=row*32-240
if turn==1:
draw_chess(cx,cy,"black")
if check_win(row,col,1):
turtle.title("黑棋获胜!")
game_over=True
turn=2
else:
draw_chess(cx,cy,"white")
if check_win(row,col,2):
turtle.title("白棋获胜!")
game_over=True
turn=1
screen.update()
draw_board()
screen.onclick(click)
screen.update()
try:
screen.mainloop()
except:
pass
首先定义函数gobang_game(),启动游戏,然后创建turtle窗口,定义draw_board函数,绘制棋盘。定义draw_chess函数,绘制黑白棋子;定义check_win函数,判断四个方向是否连成5子;定义click函数,处理鼠标点击落子;最后使用try—except确保窗口关闭可正常返回菜单。
结果如下


四、遇到的问题
1.网站爬取失败,导致下载视频失败;
解决方案:换取另一个网址,可爬取成功。
2.在进行五子棋游戏完毕后,退出五子棋页面,代码会提示报错并结束程序;
解决方案:利用try-except确保窗口关闭并可正常返回菜单。
3.在初次进行爬虫操作时,经常报错;
解决方案:环境未配置,配置完即可进行爬虫。
五、课堂总结及心得体会
1.知识点总结
Python概念:区分了Python与C语言的不同点及其优势所在
所需应用及其网址:学习了Pycharm、IDLE里面的具体用法,以及gitee仓库和博客园
基本语法:学习相关的语法特点,Python语言特有的代码缩进
变量
基本数据类型及其流程控制语句:数字类型(整数、浮点数、复数)、字符串类型、布尔类型、数据类型转换以及相关的运算符,条件语句
序列:学习相关的用法,列表、元组、字典、集合。如列表中的创建,遍历,增添列表元素,排序等用法。同时区分了他们三个的区别
字符串与正则表达式:学习了新的语法以及语句,如strip(),如何分割字符串等;在正则表达式中,学习了用于匹配、查找、替换复杂字符串规则。
函数及面向对象:学习了面向对象的三要素:封装、继承、多态;
异常处理、文件、数据库:学习了异常处理的方式(try-except-else-finally),存储基础以及数据类型的相关概念,文件操作的核心函数【open()打开,write()写入,seek()移动指针,close()关闭】,以及数据库
爬虫:学习了使用途径以及使用的规范性,学习相关知识(如常用库:requests、urllib)
2.心得体会
在选这个课之前,那时候的自己也没有想到自己会利用python成功编写简易的游戏程序,从刚开始的初始python,下载IDLE和PYCharm,在gitee上传代码,我了解到了python软件的应用以及上传代码的一系列操作,也理解了类似github码农上传方式。之后,我们学习了一系列知识点,从基本且简单的基本变量介绍,到后面分支、空语句等,再到后面序列中元组、字典、集合这些复杂的知识点,再后来的综合应用,让我们上课进行服务端和客户端的互相访问,这一实验让我倍感新奇,让我想起小时候玩过的游戏(我的世界)需要输入服务器的ip地址才能和大家一块玩耍的底层逻辑,做到了学以致用。课堂尾声,我们综合所学知识,设计各种功能,爬虫、游戏、数据处理等。经过半学期的学习,我对Python有了更加全面、深入的认知。正所谓,“人生苦短,我学python”,这段学习经历让我真切体会到这门编程语言的魅力。
3.课程建议
王老师的课程幽默风趣,举例子令人印象深刻,在知识点的讲解也是会反复强调关键地方。但是在代码编写之中,我有时会跟不上进度,一方面是部分代码不理解的原因,另一方面则是我敲代码的速度慢,在跟着老师节奏敲完这一部分代码后突然不知道该敲什么了。我的建议是老师可以将上课敲的示例代码发到群里,以便后续同学们可以进行参考。希望老师可以考虑我的建议。

浙公网安备 33010602011771号