Python老师福音:用xlwings+requests自动抓取iCode学生刷题数据,解放双手

张开发
2026/4/21 16:00:26 15 分钟阅读
Python老师福音:用xlwings+requests自动抓取iCode学生刷题数据,解放双手
Python教学自动化用xlwingsrequests打造智能刷题监控系统每周五下午三点李老师都会准时打开电脑开始他耗时两小时的数据搬运工作——手动登录三十多名学生的编程训练平台账号逐个记录他们在四个训练场的刷题进度。这种重复劳动直到他发现了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(visibleTrue, add_bookFalse) # 显示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, encodingutf-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, datadata, headersheaders) 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, datadata, timeout10) 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_workers4) 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-reportschool.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)教学自动化不是要取代教师的判断而是将老师从重复劳动中解放出来把宝贵的时间留给更有价值的教学设计与学生互动。当技术工具与教育智慧相结合就能创造出112的教学效果。

更多文章