feat(v2.2.1): 修复 Brotli 乱码 + 缓存治理 + 多页聚合 + 研究模式增强

核心修复(v2.2.1):
- 修复 Brotli 乱码 bug: build_browser_headers 智能声明 Accept-Encoding,
  仅在 brotli 可用时才声明 br; fetch.py 双路径 br 解压(requests + stdlib)
  此前 Chrome/Edge UA 抓取 example.com 等返回 br 的站点输出乱码

v2.2.0 新功能:
- main() 拆分为 _handle_verify/_handle_research/_handle_batch/_handle_single
- --cache-max-size MB: 缓存大小上限 + LRU 淘汰(默认 100MB)
- --pages N: 多页聚合 + 跨页去重
- --research 跨角度合并: 新增 merged_results 字段
- --stream / --progress: JSON Lines 流式输出 + request_id 贯穿
- --dry-run / --save-config / --log-format json
- --similarity-dedup / --throttle-* 参数化
- 15-UA 池 + PDF/docx 解析 + error_code 字段

文档与测试:
- SKILL.md: 版本号唯一(元数据),删除版本标记干扰
- README.md: 测试数量 539 -> 544
- 544 passed (新增 5 个 Content-Encoding 解压测试)
This commit is contained in:
2026-08-03 17:14:33 +08:00
parent 0c8fdc1e45
commit 157219d982
10 changed files with 2044 additions and 563 deletions
+15 -2
View File
@@ -150,9 +150,22 @@ def test_build_headers_includes_accept_language():
def test_build_headers_includes_accept_encoding():
"""Accept-Encoding 必须存在;Firefox 不发 br"""
"""Accept-Encoding 必须存在;Firefox 不发 brChrome/Edge 仅在
本机安装了 brotli 解压器时才声明 br(v2.2.1 智能声明)。
未安装 brotli 时声明 br 会导致服务器返回 br 压缩字节而 requests
无法解压 → 全页乱码。这是 fetch.py 真实环境的 bug 修复。
"""
# 导入 common 的 brotli 检测状态
from common import _HAS_BROTLI
chrome_headers = build_browser_headers(FALLBACK_UAS[0])
assert "br" in chrome_headers["Accept-Encoding"]
# Chrome/Edge:根据 brotli 可用性决定是否声明 br
if _HAS_BROTLI:
assert "br" in chrome_headers["Accept-Encoding"]
else:
assert "br" not in chrome_headers["Accept-Encoding"]
assert "gzip" in chrome_headers["Accept-Encoding"]
firefox_ua = next(ua for ua in FALLBACK_UAS if "Firefox/" in ua)
firefox_headers = build_browser_headers(firefox_ua)