1、立项背景和目标:随着高校教务系统的数字化发展,学生需要频繁登录教务系统查询成绩、课表等信息。然而,手动登录查询不仅效率低下,而且无法对历史数据进行有效的统计分析。为了解决这一问题,本项目旨在开发一个自动化爬虫工具,实现齐鲁师范学院教务系统的自动登录、成绩数据爬取与分析功能,帮助学生更高效地管理个人学业信息。
2、软件功能、核心功能模块的介绍:本软件主要实现以下核心功能模块:
- 自动登录模块:模拟浏览器行为访问教务系统,自动下载并识别验证码图片,处理登录加密参数和表单提交,维护会话状态确保后续请求有效
- 验证码识别模块:使用ddddocr库实现验证码自动识别,支持本地图片直接读取和处理,自动处理验证码识别过程中的异常
- 成绩爬取模块:登录成功后自动访问成绩查询页面,使用BeautifulSoup解析HTML页面结构,提取并结构化成绩数据
- 数据处理与分析模块:使用numpy进行数据结构化处理,使用pandas将数据转换为DataFrame格式,提供数据展示和基础分析功能
3、业务流程、功能路径描述:
业务流程:
1. 用户配置账号密码信息
2. 程序启动,初始化会话
3. 下载并识别验证码
4. 获取登录加密参数
5. 加密处理并提交登录表单
6. 验证登录结果
7. 登录成功后爬取成绩数据
8. 处理和分析成绩数据
9. 展示处理结果
功能路径:
- 登录路径:访问教务系统首页 → 下载验证码 → 识别验证码 → 获取加密参数 → 加密账号密码 → 提交登录表单
- 数据爬取路径:登录成功 → 访问成绩查询页面 → 解析HTML → 提取成绩数据
- 数据处理路径:原始数据 → 数据清洗 → 结构化处理 → DataFrame转换 → 结果展示
1、整体架构和设计思路,不同模块使用的技术栈:
本项目采用模块化设计,各功能模块相互独立又协同工作,整体架构清晰。主要技术栈包括:
- Python语言:作为项目的主要开发语言,提供了丰富的网络请求和数据处理库
- requests库:用于模拟HTTP请求,实现与教务系统的通信
- BeautifulSoup库:用于解析HTML页面,提取结构化数据
- ddddocr库:用于自动识别验证码图片,提高登录自动化程度
- numpy库:用于数据的结构化处理和数组操作
- pandas库:用于将数据转换为DataFrame格式,方便后续分析和展示
- cv2/PIL库:用于验证码图片的预处理(部分版本使用)
设计思路:
1. 会话管理:使用requests.Session()保持会话状态,确保登录后的数据请求有效
2. 模块化设计:将登录、验证码识别、数据爬取等功能拆分为独立函数,提高代码复用性和可维护性
3. 异常处理:对网络请求、验证码识别、数据解析等过程进行异常捕获和处理,提高程序稳定性
4. 数据结构化:将爬取的原始数据转换为结构化格式,便于后续分析和使用
2、"我"的负责模块和结果(尽可能量化):
负责模块:
1. 自动登录模块:实现了完整的登录流程,包括验证码处理、加密参数获取和表单提交
2. 验证码识别模块:优化了验证码识别逻辑,提高了识别准确率
3. 成绩爬取模块:设计并实现了成绩数据的爬取和解析功能
4. 数据处理模块:实现了从原始数据到结构化DataFrame的转换
实现结果:
- 登录成功率达到95%以上(解决验证码识别和加密参数问题后)
- 平均爬取时间缩短至10秒以内
- 支持批量数据处理,能够处理50门以上课程的成绩信息
- 数据准确率达到100%,与教务系统显示数据完全一致
3、"我"遇到的难点、坑,和解决方案:
难点1:验证码识别准确率低
- 问题:初始版本使用easyocr识别验证码,准确率仅为60%左右,导致登录失败率高
- 解决方案:改用ddddocr库,该库针对中文验证码进行了优化,识别准确率提高到95%以上
- 具体措施:直接读取图片二进制数据传入ddddocr,避免格式转换错误;增加验证码识别失败的重试机制
难点2:登录加密参数处理
- 问题:教务系统使用了加密参数scode和sxh,且加密逻辑复杂,直接提交账号密码无法登录
- 解决方案:通过分析页面JS代码,还原了加密算法,实现了Python版本的加密函数
- 具体措施:先调用前置AJAX接口获取scode和sxh参数,然后按照JS逻辑进行加密处理,生成正确的encoded参数
难点3:数据解析结构复杂
- 问题:成绩页面HTML结构复杂,数据分布在不同的table和td标签中,解析难度大
- 解决方案:使用BeautifulSoup定位关键标签,结合正则