4.8 KiB
4.8 KiB
间歇性解析失败说明
现象
日志显示偶尔出现解析失败,但下一次检查又恢复正常:
17:34:05 - ✅ 成功提取成绩信息,共 14 行,解析到 8 门课程
17:36:12 - ✅ 成功提取成绩信息,共 14 行,解析到 8 门课程
17:38:12 - ❌ 未找到成绩表格,解析到 0 门课程
17:40:12 - ✅ 成功提取成绩信息,共 14 行,解析到 8 门课程
原因分析
这种偶发性失败通常是由以下原因造成的:
1. 网络波动(最常见)
- 数据包传输不完整
- HTML内容被截断
- 连接临时中断
2. 服务器临时问题
- 学校服务器负载高
- 短暂的维护或重启
- 数据库查询超时
3. WebVPN不稳定
- WebVPN代理服务波动
- SSL握手失败
- 重定向异常
4. 时机问题
- 正好在服务器更新数据时访问
- 缓存失效瞬间
- 负载均衡切换
改进措施
最新版本已添加智能容错机制:
1. 识别网络错误
# 检查HTML内容长度
if len(html) < 100:
logger.warning(f"HTML内容过短({len(html)}字节),可能是网络问题")
return "NETWORK_ERROR"
2. 自动重试
当检测到临时性问题时:
- ⚠️ 记录警告但不立即报错
- ⏱️ 等待30秒后自动重试
- 📊 只有连续3次失败才报警
3. 智能判断
# 如果解析到0门课程,但之前有课程记录
if len(current_courses) == 0 and len(previous_courses) > 0:
logger.warning("可能是临时问题,30秒后重试")
time.sleep(30)
continue # 重新检查
4. 保存诊断信息
- 自动保存
debug_page.html - 记录HTML长度和摘要
- 便于事后分析
预期行为
场景1:偶发性失败(正常)
[INFO] 成功提取成绩信息,共 14 行
[INFO] 共解析到 8 门课程
[INFO] 等待 120 秒...
[WARNING] 未找到成绩表格
[WARNING] ⚠️ 解析到0门课程,但之前有8门课程,可能是临时问题
[INFO] 等待 30 秒后重试...
[INFO] 成功提取成绩信息,共 14 行 ← 重试成功
[INFO] 共解析到 8 门课程
场景2:持续失败(异常)
[WARNING] ⚠️ 解析到0门课程,可能是临时问题
[WARNING] 连续异常: 1/5
[WARNING] ⚠️ 解析到0门课程,可能是临时问题
[WARNING] 连续异常: 2/5
[WARNING] ⚠️ 解析到0门课程,可能是临时问题
[WARNING] 连续异常: 3/5 ← 开始报警
[ERROR] 连续 3 次无法解析课程(之前有8门课程)
判断标准
✅ 无需担心的情况
- 失败率 < 20%(每10次失败少于2次)
- 失败后1-2次就恢复
- 日志显示"等待30秒后重试"
- 下次检查自动恢复正常
⚠️ 需要关注的情况
- 失败率 > 20%
- 连续3次以上失败
- 日志显示"连续异常"
- 出现错误通知邮件
🚨 需要处理的情况
- 连续5次以上失败
- 失败率 > 50%
- 伴随"会话过期"错误
- debug_page.html 显示登录页面
统计失败率
使用诊断工具检查:
cd ~/grade_monitor
./diagnose.sh
# 或手动统计
echo "成功次数: $(grep -c '共解析到 [1-9]' monitor.log)"
echo "失败次数: $(grep -c '共解析到 0 门课程' monitor.log)"
最佳实践
1. 不要过度担心
- 偶尔失败是正常现象
- 程序已自动处理
- 只要失败率低,无需干预
2. 定期检查日志
# 查看最近的失败记录
grep "未找到成绩表格\|共解析到 0 门课程" ~/grade_monitor/monitor.log | tail -10
# 查看是否自动恢复
tail -n 20 ~/grade_monitor/monitor.log
3. 调整检查间隔
如果失败频繁,可以增加间隔:
[monitor]
CHECK_INTERVAL = 180 # 从120改为180秒
4. 信任自动化
- 程序会自动重试
- 只有持续失败才报警
- 收到邮件通知时再处理
何时需要手动干预
只在以下情况需要重启服务:
- 连续多次收到错误邮件
- 日志显示持续登录失败
- debug_page.html 显示异常内容
- 失败率持续超过50%
其他情况下,让程序自动处理即可。
对比:改进前 vs 改进后
改进前
17:38:12 - ❌ 未找到成绩表格,解析到 0 门课程
17:38:12 - 成绩无变化(共 0 门课程) ← 直接当作正常
17:38:12 - 等待 120 秒... ← 不重试
17:40:12 - 开始新一轮检查 ← 2分钟后才重试
改进后
17:38:12 - ❌ 未找到成绩表格
17:38:12 - ⚠️ 解析到0门课程,但之前有8门课程
17:38:12 - 等待 30 秒后重试... ← 智能判断
17:38:42 - ✅ 成功提取成绩信息 ← 快速恢复
总结: 偶发性失败是网络应用的正常现象。新版本通过智能重试机制,将影响降到最低。只要失败率在合理范围(<20%),无需任何手动干预。
更新日期: 2026-01-21
版本: v2.1 - 智能容错版