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将资源数据写入本地电脑完成保存。同时设置异常捕获机制,若出现网络异常、链接失效等下载失败问题,程序会自动弹出对应的错误提示信息。
结果演示:
17cf76c436d0d6fe860d74a5cc4fba68
890451c22297c2930ae5f8e4cc8fb3d0
4213b9b4eca709ec8c6317989e6fe47e

功能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()弹出可视化展示窗口,呈现最终统计结果。用户关闭图表窗口后,可按下回车键返回程序主菜单,生成的可视化图表结果也可保存至本地电脑文件中。
结果演示:
7bf63978dccf29ac4beb2335cc533000
68956bd0a9a9a281a55665951f0310ee
2bf6a95f6aa8f4f728ab4f197994d3a7

功能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文件,并将数据填入后,可自动保存至文件夹中。
结果如下:
29878a2237cb93632a8ddcd193525025
29878a2237cb93632a8ddcd193525025
64302770e4cecf0cb8bb3de558f9b325
acb2da2e2877a0ca102263cad9796e9b

功能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 分并记录提示,不包含则给出建议。
最终根据输出密码的强度总分判断密码等级。
结果如下
47a16b2a388491d8862a5925d7e97171
当输入弱密码时
96f797f5cf1c866ce549380d9366657b
418332a8f3111e81091a421247bddb51
当输入强密码时
88857cc6a7dd7af33b34a3eba1027a36
4ab4caa6472dab3f7475f8073e25ecbf

功能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确保窗口关闭可正常返回菜单。
结果如下
5b6ad563b64847753842b54f35496727
35031337def3b5ccc86a00a67a88460d

四、遇到的问题
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.课程建议
王老师的课程幽默风趣,举例子令人印象深刻,在知识点的讲解也是会反复强调关键地方。但是在代码编写之中,我有时会跟不上进度,一方面是部分代码不理解的原因,另一方面则是我敲代码的速度慢,在跟着老师节奏敲完这一部分代码后突然不知道该敲什么了。我的建议是老师可以将上课敲的示例代码发到群里,以便后续同学们可以进行参考。希望老师可以考虑我的建议。

gitee仓库
74eff84ceb5ab3b446e7e6dfe9b810c5
程序运行视频:Python视频

参考资料
Java程序设计与数据结构教程(第二版)
Java程序设计与数据结构教程(第二版)学习指导

posted @ 2026-05-27 12:18  -+7  阅读(37)  评论(0)    收藏  举报