2025-2026-2 《Python程序设计》实验4报告
课程:《Python程序设计》
班级: 2432
姓名: 赵怡喆
学号:20243213
实验教师:王志强
实验日期:2026年5月25日
必修/选修: 公选课
(批前必读)
之所以选择该题目,是因为自己在团学工作中遇到过很多繁琐的信息收集工作,于是我便利用此次实验,看看能否用自己一个学期所学的python知识来减轻自己的工作负担,经过了很多次探索发现自己做到了!!!(扩展的最终功能在最最下面,敬请期待!)
1. 实验内容
本实验旨在综合运用Python网络请求、网页解析、API调用、文件操作、交互菜单设计等技能,完成一个集本地图片识别、网页爬虫、OCR文字识别、Excel导出一体的实用工具。最终可以实现以下功能:
1. 熟悉Python第三方库使用,包括requests、bs4、csv、base64等。
2. 掌握交互式菜单程序编写,实现功能选择、输入判断、流程控制。
3. 实现本地图片批量读取与OCR识别功能,读取指定文件夹图片并识别文字。
4. 实现网页图片爬虫功能,输入网址自动爬取图片并保存。
5. 调用百度智能云OCR接口完成文字识别,实现高精度中文识别。(经过多次实验发现性能优于Tesseract,无论在准确度还是速度上)
6. 将识别结果美观导出到Excel表格,实现结构化展示与保存。
7. 增加辅助功能:一键清空图片缓存文件夹,方便重复使用。
8. 调试程序,处理异常、路径错误、网络失败、空文件等问题。
2. 实验过程及结果
2.1 熟悉开发环境与第三方库
本次实验使用Python 3.14 + PyCharm作为开发环境。
核心工具与库:
Python解释器:执行程序、运行脚本。
PyCharm IDE:代码高亮、断点调试、变量查看、运行控制台。
pip包管理:安装requests、beautifulsoup4库。
百度智能云OCR API:提供文字识别服务。
csv库:生成Excel可打开的表格文件。
通过pip install命令安装依赖库,配置API密钥,完成环境搭建。
2.2 程序运行与调试技能练习
运行过程
1. 将完整代码保存为ocr_tool.py。
2. 在PyCharm中点击运行按钮,控制台出现功能菜单。
3. 根据提示输入1/2/3选择对应功能。
4. 程序自动执行:读取图片 → 识别文字 → 导出Excel。
调试过程
1. 设置断点:在图片读取、API调用、Excel写入等关键行设置断点。
2. 启动调试:使用Debug模式运行程序。
3. 单步执行:使用F7/F8逐行执行,观察变量变化。
4. 查看变量:监控图片路径、token、识别结果等内容。
5. 异常捕获:处理网络超时、文件不存在、API调用失败等错误。
通过调试,解决了路径错误、中文乱码、图片下载失败、空列表识别等问题。
2.3 程序功能模块实现(菜单+三功能)
本次实验编写了三功能交互式工具:
1. 功能1:读取D:\python文件夹本地图片 → OCR识别 → 导出Excel
2. 功能2:输入网址 → 爬虫下载图片 → OCR识别 → 导出Excel
3. 功能3:一键清空D:\python内所有图片,清理缓存
核心结构:
主菜单函数main():接收用户输入1/2/3。
本地扫描函数scan_local_images():筛选图片格式。
爬虫crawl_web_images():解析网页、下载图片。
OCR函数ocr_image():调用百度API识别文字。
Excel导出函数export_beautiful_excel():生成规整表格。
运行后控制台界面:
智能 OCR 识别工具
1 → 读取 D:\python 本地图片
2 → 网页爬虫下载图片 + OCR
3 → 清空 D:\python 所有图片
2.4 功能运行结果
功能1:本地图片识别
自动读取D:\python中.jpg/.png等格式图片。
调用百度OCR返回文字结果。
导出序号、来源、文件名、路径、识别内容五列表格。
功能2:网页爬虫+识别
输入任意网页URL,自动解析<img>标签。
自动下载有效图片到D:\python。
自动识别并生成Excel,来源标记为“网页爬取”。
功能3:清空图片文件夹
一键删除所有图片文件。
提示删除数量,安全不删其他文件。
Excel输出效果(美观规整)
表头:
序号 | 数据来源 | 图片名称 | 图片路径 | 识别文字内容
输出文件:OCR识别汇总表.csv,可直接用Excel打开。
2.5 代码结构说明
1. API密钥配置:填入百度云API_KEY和SECRET_KEY。
2. 路径固定:图片目录D:\python,无需手动修改。
3. 异常处理:网络失败、图片损坏、文件夹不存在均有提示。
4. 格式优化:识别文字自动去空行、去多余换行,表格整洁。
3实验过程中的图片展示:
第一步我们先测试以下学校官网去找一下照片,发现可行

正在辛辛苦苦挖矿中

看一下爬虫的结果

这是导出的excel的表格(因为照片内容保密,所以提取的内容也需要符合咱们学校的保密特色) DKY

自动删除,解放双手


这里是最基本的照片识别


4.问题的出现与解决方案
问题1:Excel打开中文乱码
原因:CSV文件未使用UTF-8 BOM编码。
解决:文件打开时指定`encoding='utf-8-sig'`。
问题2:网页爬虫部分图片无法下载
原因:网站防盗链、图片为Base64格式。
解决:添加`User-Agent`,过滤`data:`开头的无效图片。
问题3:用tess识别图片差错大
原因:是Tesseract为开源轻量级OCR引擎,对中文、模糊、倾斜或带噪点的图片适应性差,未经过AI模型优化,仅靠规则匹配,识别效果受图片质量和场景影响较大。
解决:更换为百度智能云OCR API,利用其深度学习模型提升识别精度,同时对图片进行预处理,增强文字特征,显著改善识别效果。
5.程序源代码
import os
import base64
import requests
import csv
from urllib.parse import urljoin
from bs4 import BeautifulSoup
API_KEY = "eAvumxnflDsqxNNf1oMELvIX"
SECRET_KEY = "B15Taipl6FdYbGqsFz8qprt5HPpjDIr8"
LOCAL_FOLDER = r"D:\python"
EXCEL_OUTPUT = "OCR识别汇总表.csv"
def get_token():
url = "https://aip.baidubce.com/oauth/2.0/token"
data = {
"grant_type": "client_credentials",
"client_id": API_KEY,
"client_secret": SECRET_KEY
}
res = requests.post(url, data=data)
return res.json()["access_token"]
def ocr_image(img_path, token):
try:
with open(img_path, "rb") as f:
b64 = base64.b64encode(f.read()).decode()
res = requests.post(
"https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic",
data={"image": b64},
params={"access_token": token}
)
words = res.json().get("words_result", [])
text = "\n".join([w["words"] for w in words])
text = text.strip().replace("\n\n", "\n")
return text
except:
return "识别失败"
def export_beautiful_excel(file_list, source_type):
if not file_list:
print("没有图片可以识别!")
return
token = get_token()
headers = ["序号", "数据来源", "图片名称", "图片路径", "识别文字内容"]
with open(EXCEL_OUTPUT, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.writer(f)
writer.writerow(headers)
for idx, path in enumerate(file_list, 1):
img_name = os.path.basename(path)
abs_path = os.path.abspath(path)
print(f"正在识别第 {idx} 张:{img_name}")
ocr_text = ocr_image(path, token)
writer.writerow([idx, source_type, img_name, abs_path, ocr_text])
print(f"\n✅ 导出完成!表格位置:{os.path.abspath(EXCEL_OUTPUT)}")
def scan_local_images():
exts = (".jpg", ".jpeg", ".png", ".bmp", ".webp")
files = []
if not os.path.exists(LOCAL_FOLDER):
print("文件夹不存在!")
return files
for f in os.listdir(LOCAL_FOLDER):
if f.lower().endswith(exts):
files.append(os.path.join(LOCAL_FOLDER, f))
return files
def crawl_web_images():
print("\n请输入网页地址:")
url = input("> ")
headers = {"User-Agent": "Mozilla/5.0 Chrome/120.0.0.0 Safari/537.36"}
try:
resp = requests.get(url, headers=headers, timeout=15)
soup = BeautifulSoup(resp.text, "html.parser")
except:
print("访问失败!")
return []
os.makedirs(LOCAL_FOLDER, exist_ok=True)
img_paths = []
count = 1
for img in soup.find_all("img"):
src = img.get("src") or img.get("data-src")
if not src or src.startswith("data:"):
continue
img_url = urljoin(url, src)
try:
ir = requests.get(img_url, headers=headers, timeout=10)
fname = f"爬虫图片_{count}.jpg"
save_path = os.path.join(LOCAL_FOLDER, fname)
with open(save_path, "wb") as f:
f.write(ir.content)
img_paths.append(save_path)
print(f"下载成功:{fname}")
count += 1
except:
continue
return img_paths
def clear_image_folder():
if not os.path.exists(LOCAL_FOLDER):
print("文件夹不存在!")
return
exts = (".jpg", ".jpeg", ".png", ".bmp", ".webp")
deleted = 0
for f in os.listdir(LOCAL_FOLDER):
path = os.path.join(LOCAL_FOLDER, f)
if f.lower().endswith(exts):
try:
os.remove(path)
deleted += 1
except:
pass
print(f"\n✅ 清空完成!共删除 {deleted} 张图片")
def main():
print("=" * 50)
print(" 智能 OCR 识别工具")
print("=" * 50)
print(" 1 → 读取 D:\\python 本地图片")
print(" 2 → 网页爬虫下载图片 + OCR")
print(" 3 → 清空 D:\\python 所有图片") # 这里是新加的功能3
print("=" * 50)
choose = input("请输入 1 / 2 / 3:").strip()
if choose == "1":
print("\n▶ 本地图片识别")
files = scan_local_images()
export_beautiful_excel(files, "本地图片")
elif choose == "2":
print("\n▶ 网页爬虫模式")
files = crawl_web_images()
export_beautiful_excel(files, "网页爬取")
elif choose == "3":
print("\n▶ 清空图片文件夹")
clear_image_folder()
else:
print("输入错误!")
if __name__ == "__main__":
main()1
6.码云托管,成果共享

7.全课总结,以及课程感想体会、意见和建议等(不要啊[跳跳][玫瑰]大哭。。。。。。。)
怎么说呢,真到了最后一次实验反而有点舍不得----------
初选python这门课,主要是出于我对python这个编程语言的兴趣。而且有个有意思的小事,我在第一次抢课时并没有抢到Python课,当时感觉非常失望——但是转折来了,第二次抢课时已经报满了99人,仅有一个名额面向全院师生!但是,我随手一抢,不抱希望,竟然真的成为了那个幸运儿!果然上Python课,认识志强老师谁命中注定。
在课上,跟着强哥一步一步地敲代码,做实验,调试,每一步是每一步的踏实,每一课有每一课的收获。从课上的hello world!到我后面自己进行爬虫大实验,实现自动汇总。转眼间,原来我已经走了这么远,并且收获颇多。
强哥的课程十分讲究效率,一周上一节课(3节45min的时间),强哥总是在课前来一个有趣的签到(但是有规律,为什么一定时从中间开始呢,滑稽),然后进行上节课的回顾,花最短的时间把课程讲完,最后留下时间让我们自己钻研,去调代码,去问问题。实际上我个人觉得这种方式有好有坏,好是在于进度快,效率高,坏是在于,学到的知识其实有点偏浅层,容易忘,过了一星期其实记下的寥寥无几。在这里我想提一个小小的建议,就是希望强哥也可以给我们布置一点小作业题,或者说是找一个python版的电科院OJ,这样更加有利于我萌巩固知识。
总之,非常感谢老师这一学期以来的教导,我收获颇丰,幽默风趣的教学让我难以忘记,还有强哥对于实验四这种创新的设计,跳出了学生跟着走的思维模式,我一开始其实十分痛苦,就是不知道要做什么,但是随着时间的推移,我慢慢开始自己去思考,我对什么感兴趣,这是非常重要的。
最后,我爱python,我爱强神!Yyds!电科院独一档的存在。
8.请看VCR
https://www.bilibili.com/video/BV1ofVN65EWL/?spm_id_from=333.1387.homepage.video_card.click
<iframe src="//player.bilibili.com/player.html?isOutside=true&aid=116641010555770&bvid=BV1ofVN65EWL&cid=38631116185&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>
9.最终的扩展以及留给老师的小彩蛋
https://www.bilibili.com/video/BV1wmVN69EQN/?spm_id_from=333.1387.homepage.video_card.click&vd_source=e332be4ccef5137f81d19d820b7bebb2
<iframe src="//player.bilibili.com/player.html?isOutside=true&aid=116641061083994&bvid=BV1wmVN69EQN&cid=38631441237&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"></iframe>
浙公网安备 33010602011771号