Files
GPA_Monitoring/间歇性解析失败说明.md
ChuXun d1dc08a16d 1
2026-01-29 03:39:01 +08:00

4.8 KiB
Raw Blame History

间歇性解析失败说明

现象

日志显示偶尔出现解析失败,但下一次检查又恢复正常:

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. 信任自动化

  • 程序会自动重试
  • 只有持续失败才报警
  • 收到邮件通知时再处理

何时需要手动干预

只在以下情况需要重启服务:

  1. 连续多次收到错误邮件
  2. 日志显示持续登录失败
  3. debug_page.html 显示异常内容
  4. 失败率持续超过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 - 智能容错版