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>

 

posted on 2026-05-26 21:38  zyz66666666  阅读(42)  评论(0)    收藏  举报