作为一名编程教育工作者,我深知督促学生持续练习的重要性。特别是在iCode这类编程竞赛平台上,学生需要通过完成不同级别的训练题目来提升编程能力。但现实情况是,很多学生缺乏自律性,需要老师持续监督。
传统的手工记录方式存在几个明显痛点:首先,老师需要逐个登录学生账号,这个过程既耗时又容易出错;其次,手动记录成绩到Excel表格中,不仅效率低下,还容易出现记录错误;最后,当学生数量较多时,这个工作会变得异常繁琐,占用大量教学准备时间。
我最初的做法是每天手动登录每个学生的账号,查看他们在四个训练场的刷题进度,然后把获得的星数记录到Excel里。这个过程通常要花费半小时以上,而且稍不留神就可能记错数据。更麻烦的是,当需要对比学生一段时间内的进步情况时,还得手动整理历史数据。
使用Python爬虫自动化这个流程后,整个过程缩短到几分钟内完成。脚本会自动读取学生账号信息,模拟登录,抓取各个训练场的进度数据,并整齐地记录到指定格式的Excel表格中。这不仅节省了大量时间,还确保了数据的准确性。
要实现自动化追踪刷题进度,我们需要解决几个关键技术问题。首先是登录环节,iCode平台采用了常见的MD5加密方式处理密码。虽然这种加密方式相对简单,但对于教学管理场景来说已经足够安全。
经过评估,我选择了以下几个Python库来构建这个工具:
选择这些库主要考虑了几个因素:首先是稳定性,这些库都经过长期验证;其次是易用性,API设计都比较友好;最后是性能,能够满足我们批量处理的需求。
特别值得一提的是xlwings这个库,它相比openpyxl等其他Excel操作库有个明显优势:可以直接控制Excel应用程序,实现所见即所得的操作效果。这对于需要频繁查看和调整表格格式的教学场景特别有用。
iCode平台的登录接口采用了前端MD5加密的方案。刚开始我尝试直接分析加密代码,但由于JavaScript代码经过了一定程度的混淆,定位具体的加密函数比较困难。
我的解决方案是把整个加密相关的JS文件都保存下来,然后通过Python的execjs来执行。这里有个小技巧:直接从浏览器开发者工具中复制出来的JS代码可能包含一些环境依赖,直接执行可能会报错。我通过逐步删除无关代码的方式,最终得到了一个精简版的加密函数。
python复制# 处理MD5加密的代码示例
node = execjs.get()
ctx = node.compile(open("./icode.js", encoding="utf-8").read())
funcName = 'getPwd("{0}")'.format(password)
pwdEncrypted = ctx.eval(funcName)
在实际使用中发现一个常见问题:编码错误。这是因为JS文件和Python脚本的编码方式不一致导致的。解决方法是在打开JS文件时明确指定UTF-8编码,同时确保PyCharm等IDE的项目编码设置也统一为UTF-8。
使用xlwings操作Excel时,有几个实用技巧值得分享。首先是工作表的处理逻辑:我们需要先检查"作业检查"工作表是否存在,如果不存在就创建它。
python复制# 检查工作表是否存在的代码
if "作业检查" in str(sheets):
作业检查 = True
else:
sheets.add(name="作业检查", after="账号")
其次是数据写入的格式控制。为了让生成的表格更美观,我添加了边框设置和单元格合并等功能。这里需要注意xlwings的API设计有些特殊,需要通过.api属性调用底层的VBA功能。
python复制# 设置单元格边框的示例
sheet2nd.range((1, 1), (nrows2ndUsed+1, 1)).api.Borders(9).LineStyle = 1
sheet2nd.range((1, 1), (nrows2ndUsed+1, 1)).api.Borders(9).Weight = 3
数据布局方面,我设计了一种间隔排列的方式,每个学生的四个训练场数据占据连续的4列,这样既方便查看单个学生的进度,也便于横向比较不同学生的表现。
让我们来看下完整的实现代码,并讨论其中的关键点和可能的优化方向。整个脚本主要分为四个部分:Excel操作、登录认证、数据获取和结果记录。
在Excel操作部分,我们使用xlwings打开工作簿,读取学生账号信息。这里有个细节处理:因为Excel中读取的数字账号可能带有".0"后缀,需要使用math.floor进行处理。
python复制# 读取和处理账号数据的代码
accounts=sheet1st.range(f'c1:c{nrows}').value
pwds = sheet1st.range(f'd1:d{nrows}').value
signInData = {
"email": str(math.floor(accounts[i+1])),
"password": pwdEncrypted
}
数据获取部分通过循环请求四个不同级别的训练场接口。这里使用了同一个session对象,确保登录状态保持。为了减轻服务器压力,每次请求后添加了1秒的间隔。
python复制for j in range(4):
GameListData = {
"mode": "1",
"level": leval[j]
}
GameListJson = session.post(url=GameListUrl, headers=GameListUrlHeaders, data=GameListData).json()
sheet2nd.range(nrows2ndUsed+1, 2+intervalCols*i + j).value =
"{0}/{1}".format(GameListJson["data"]["star"],GameListJson["data"]["totalStar"])
对于可能的优化方向,我有几点建议:首先可以添加异常处理机制,比如网络请求失败后的重试逻辑;其次可以考虑使用多线程来并行处理多个学生的数据,提高整体效率;最后可以增加数据校验机制,确保记录的数据准确无误。
这套自动化系统在实际教学中发挥了巨大价值。最直接的改变是节省了大量时间,原本需要半小时的手工操作现在只需几分钟就能完成。更重要的是,数据的准确性和一致性得到了保证。
从教学管理角度看,这个工具带来了几个好处:首先,可以更及时地掌握学生的学习进度,发现问题学生;其次,积累的历史数据可以用来分析学生的进步情况;最后,自动生成的整齐表格让向家长汇报学习成果变得更方便。
我还发现一个意外的收获:当学生知道老师有这样一个自动化监控工具时,他们的学习积极性反而提高了。因为学生明白老师可以随时掌握他们的真实练习情况,这就形成了一种良性的监督机制。
在技术教学方面,这个项目本身也是一个很好的教学案例。我经常用它来向学生展示Python编程的实际应用价值,以及如何用技术解决现实问题。很多学生在看到这个工具后,对学习编程的兴趣都明显提升了。
在实际使用过程中,我遇到过几个典型问题,这里分享下解决经验。第一个问题是编码错误,特别是在处理JS加密时。解决方案是确保所有文件都使用UTF-8编码,并在代码中明确指定编码方式。
第二个问题是Excel文件被占用。当脚本意外中断时,Excel进程可能没有正确关闭,导致下次运行时无法打开文件。解决方法是在代码中添加异常处理,确保无论如何都会关闭Excel进程。
python复制try:
# 主要操作代码
finally:
app.quit() # 确保Excel进程被关闭
第三个问题是网络不稳定导致的请求失败。对于这种情况,我建议添加重试机制,并设置合理的超时时间。同时,可以考虑将已经获取到的数据先保存起来,避免全部重新获取。
python复制from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
session = requests.Session()
retries = Retry(total=3, backoff_factor=1)
session.mount('https://', HTTPAdapter(max_retries=retries))
最后一个常见问题是iCode平台接口变更。这种情况虽然不常发生,但需要做好准备。建议定期检查脚本是否正常工作,或者添加接口响应验证逻辑,在发现异常时及时通知维护者。
基础功能实现后,可以考虑添加一些进阶功能来提升工具的实用性。第一个方向是数据可视化,可以使用matplotlib等库将学生的进步情况绘制成图表,更直观地展示学习趋势。
python复制import matplotlib.pyplot as plt
# 绘制学生进步曲线的示例代码
plt.plot(dates, scores)
plt.title('学生刷题进度趋势')
plt.xlabel('日期')
plt.ylabel('获得星数')
plt.savefig('progress.png')
第二个方向是自动化报告生成。可以定期(比如每周)自动生成学生学习报告,包括刷题数量、进步情况等指标,并自动发送给家长。
第三个方向是集成到更完整的教学管理系统中。比如将刷题数据与课堂表现、作业完成情况等结合起来,构建全面的学生能力评估模型。
还可以考虑添加预警功能,当检测到某个学生连续几天没有进步时,自动发送提醒给老师或家长。这种及时的干预往往能取得更好的督促效果。
在使用这类自动化工具时,有几点教学上的注意事项需要提醒。首先是隐私问题,学生的账号密码需要妥善保管,建议使用专门的密码管理策略。
其次是使用频率要适度,虽然自动化了数据收集,但也不宜过于频繁地检查,以免给学生造成过大压力。通常每天检查一次就足够了。
另外要平衡自动化和人工干预。虽然工具可以自动收集数据,但针对性的指导还是需要老师根据数据进行分析和判断。技术工具应该辅助教学,而不是完全替代教师的专业判断。
最后,建议定期备份收集到的数据。这些历史数据对于评估教学效果和学生长期发展都非常有价值。可以设置自动备份机制,将数据定期保存到安全的位置。