Python老师福音:用xlwings+requests自动抓取iCode学生刷题数据,解放双手
Python教学自动化:用xlwings+requests打造智能刷题监控系统
每周五下午三点,李老师都会准时打开电脑,开始他耗时两小时的"数据搬运"工作——手动登录三十多名学生的编程训练平台账号,逐个记录他们在四个训练场的刷题进度。这种重复劳动直到他发现了Python自动化工具组合才彻底改变。现在,让我们看看如何用xlwings和requests构建一个会"自己工作"的教学助手系统。
1. 教学自动化需求分析与方案设计
编程教师最头疼的莫过于追踪学生的课后练习情况。传统手工记录存在三个致命缺陷:时间成本高(每位学生需要3-5分钟操作)、人为误差多(容易记错行列位置)、数据滞后严重(通常每周才能汇总一次)。而自动化方案可以做到:
- 实时性:随时执行脚本获取最新进度
- 准确性:系统自动填充数据,零误差
- 可视化:自动生成带格式的进度报表
- 可追溯:按日期存档历史记录
技术选型上,我们采用黄金组合:
# 核心工具库 import xlwings as xw # Excel交互 import requests # 网络请求 import execjs # JS加密处理典型工作流分为四个阶段:
- 数据准备:从Excel读取学生账号信息
- 模拟登录:处理平台加密逻辑获取访问权限
- 数据抓取:获取各训练场星级进度
- 报表生成:自动写入格式化Excel报表
提示:建议在非教学时段运行脚本,避免对平台服务器造成压力
2. 核心组件实现详解
2.1 Excel智能交互模块
xlwings不同于openpyxl等库的最大优势在于其与Excel应用程序的深度集成,可以实现所见即所得的操作效果。初始化时应配置:
app = xw.App(visible=True, add_book=False) # 显示Excel界面 app.display_alerts = False # 关闭提示弹窗 app.screen_updating = True # 实时更新显示智能检测工作表是否存在的实用技巧:
def check_sheet_exists(workbook, sheet_name): try: sheet = workbook.sheets[sheet_name] return True except: return False表格自动化美化的关键参数:
| 边框类型 | 常量值 | 效果描述 |
|---|---|---|
| 左边框 | 7 | 单元格左侧竖线 |
| 上边框 | 8 | 单元格顶部横线 |
| 下边框 | 9 | 单元格底部横线 |
| 右边框 | 10 | 单元格右侧竖线 |
2.2 网络请求与加密处理
训练平台通常采用前端加密保护登录安全。处理步骤:
- 使用浏览器开发者工具定位加密JS文件
- 提取关键加密函数(本例为MD5加密)
- 通过execjs执行JS代码
典型加密处理流程:
# 加载JS加密文件 with open('./encrypt.js', 'r', encoding='utf-8') as f: js_code = f.read() # 执行加密函数 def encrypt_password(password): ctx = execjs.compile(js_code) return ctx.call('md5Encrypt', password)注意:遇到编码错误时可尝试去除JS文件中的注释和换行符
2.3 进度数据采集逻辑
训练场数据通常通过AJAX接口返回JSON格式。请求示例:
def get_training_progress(session, level): url = "https://api.training-platform.com/game-progress" data = {"level": level} # 0/10/20/30对应四个训练场 headers = { "User-Agent": "Mozilla/5.0", "Referer": "https://training-platform.com/dashboard" } response = session.post(url, data=data, headers=headers) return response.json()["data"]数据处理时要注意类型转换:
# 原始数据示例:{"star": 15, "totalStar": 20} progress = f"{data['star']}/{data['totalStar']}" # 转换为"15/20"格式3. 完整系统实现与优化
3.1 主程序架构设计
核心执行流程如下图所示(伪代码表示):
初始化Excel应用 → 读取学生名单 → 创建进度报表 ↓ for 每个学生: 加密密码 → 模拟登录 → 获取四个训练场数据 ↓ 写入Excel并美化格式 ↓ 保存文件 → 退出应用关键实现代码段:
def main(): # 初始化 app, workbook = init_excel() students = read_student_list(workbook) report_sheet = prepare_report(workbook) # 数据处理 session = requests.Session() for idx, student in enumerate(students): login(session, student) for level in [0, 10, 20, 30]: progress = get_progress(session, level) write_progress(report_sheet, idx, level, progress) # 收尾 finalize_report(workbook) app.quit()3.2 异常处理与日志记录
健壮的生产级脚本必须包含完善的错误处理:
try: response = session.post(url, data=data, timeout=10) response.raise_for_status() except requests.exceptions.RequestException as e: log_error(f"请求失败: {str(e)}") continue推荐日志格式:
[2023-08-20 14:30:45] INFO: 开始处理学生张三(账号:zhangsan) [2023-08-20 14:31:02] SUCCESS: 1级训练场进度 12/15 [2023-08-20 14:31:15] WARNING: 3级训练场数据缺失3.3 性能优化技巧
- 并行处理:使用
concurrent.futures加速多学生处理
from concurrent.futures import ThreadPoolExecutor with ThreadPoolExecutor(max_workers=4) as executor: executor.map(process_student, students)- 缓存机制:避免重复登录
if not session.cookies.get('auth_token'): login(session, credentials)- 速率限制:添加适当延迟
import time time.sleep(1) # 每个请求间隔1秒4. 教学场景深度应用
4.1 数据可视化扩展
原始数据可以通过xlwings直接生成图表:
chart = report_sheet.charts.add() chart.set_source_data(report_sheet.range('B2:E10')) chart.chart_type = 'column_clustered'更高级的分析建议:
- 计算每日进步幅度
(今日星数 - 昨日星数) - 生成学生排名变化曲线
- 识别长期停滞不前的学生
4.2 教学管理集成方案
将系统嵌入日常工作的三种方式:
- 定时任务:使用Windows任务计划或cron定时执行
- 即时触发:创建Excel按钮宏关联Python脚本
- 邮件通知:添加SMTP模块自动发送进度报告
# 邮件发送示例 import smtplib from email.mime.text import MIMEText def send_report(email, content): msg = MIMEText(content) msg['Subject'] = '编程训练进度周报' smtp = smtplib.SMTP('smtp.example.com') smtp.sendmail('auto-report@school.com', email, msg.as_string())4.3 系统扩展方向
- 多平台支持:适配其他编程训练网站
- 移动端查看:生成HTML报告或小程序展示
- 智能预警:对进度异常学生自动提醒
- API服务化:搭建Flask提供Web查询界面
# Flask API示例 from flask import Flask, jsonify app = Flask(__name__) @app.route('/progress/<student_id>') def get_progress(student_id): data = query_progress(student_id) return jsonify(data)教学自动化不是要取代教师的判断,而是将老师从重复劳动中解放出来,把宝贵的时间留给更有价值的教学设计与学生互动。当技术工具与教育智慧相结合,就能创造出1+1>2的教学效果。
