This commit is contained in:
ChuXun
2026-01-29 03:39:01 +08:00
parent 0da692ab97
commit d1dc08a16d
12 changed files with 1607 additions and 39 deletions

View File

@@ -0,0 +1,194 @@
# 间歇性解析失败说明
## 现象
日志显示偶尔出现解析失败,但下一次检查又恢复正常:
```
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. 识别网络错误
```python
# 检查HTML内容长度
if len(html) < 100:
logger.warning(f"HTML内容过短({len(html)}字节),可能是网络问题")
return "NETWORK_ERROR"
```
### 2. 自动重试
当检测到临时性问题时:
- ⚠️ 记录警告但不立即报错
- ⏱️ 等待30秒后自动重试
- 📊 只有连续3次失败才报警
### 3. 智能判断
```python
# 如果解析到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 显示登录页面
## 统计失败率
使用诊断工具检查:
```bash
cd ~/grade_monitor
./diagnose.sh
# 或手动统计
echo "成功次数: $(grep -c '共解析到 [1-9]' monitor.log)"
echo "失败次数: $(grep -c '共解析到 0 门课程' monitor.log)"
```
## 最佳实践
### 1. 不要过度担心
- 偶尔失败是**正常现象**
- 程序已自动处理
- 只要失败率低,无需干预
### 2. 定期检查日志
```bash
# 查看最近的失败记录
grep "未找到成绩表格\|共解析到 0 门课程" ~/grade_monitor/monitor.log | tail -10
# 查看是否自动恢复
tail -n 20 ~/grade_monitor/monitor.log
```
### 3. 调整检查间隔
如果失败频繁,可以增加间隔:
```ini
[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 - 智能容错版