feat(v2.5.0): Sec-Ch-Ua 头修复 + 结构化提取 + token 预算 + 正文去重 + 连接复用
正确性修复: - 修复 Sec-Ch-Ua 构造 bug: 原实现产出 ""Not_A Brand";v="99"" 双重引号 畸形头(Chrome/Edge 两路径), 严格校验的 WAF 会忽略; 改为品牌数组拼接 - search 403 快速失败: 实例级 403 不再退避重试(~10.5s 空等), 立即 failover - AdaptiveThrottle: --throttle-failure-threshold 0 现为真正禁用语义 - number_of_results 缺失时用 len(results) 兜底(JSON/HTML 路径契约对齐) - 版本对齐: pyproject.toml 与 _config.py 同步 2.5.0 AI 代理体验: - fetch.py --extract json: 结构化骨架(title/meta/headings/links/images) - fetch.py --max-chars N: 提取后语义级截断(区别于 --max-size 字节截断) - search --fetch-total-chars N: --fetch 全局字符预算, 耗尽后 status=skipped - --dedup-fetched-content: 抓取正文 SimHash 去重, status=duplicate - --progress 新增 angle_start/ok/fail + fetch_skip/fetch_duplicate 事件 - fetch.py 补齐 --log-format json + --dump-schema - CSV 媒体列自适应(images/videos 类别自动追加媒体字段列) - --dry-run 批量模式打印实际查询列表 - search 连接复用: requests 可用时走模块级 Session(连接池) 工程治理: - 新增 scripts/release_check.py 发布一致性检查(版本/错误码表漂移) - 新增 tests/test_v250_features.py 46+4 个回归测试(全量 622 通过) - tests/conftest.py: autouse fixture 强制 stdlib 路径(本机有 requests 时 既有 urllib mock 测试不失效)
This commit is contained in:
@@ -268,6 +268,22 @@ python scripts/fetch.py -u https://example.com \
|
||||
|
||||
## 能力清单
|
||||
|
||||
**v2.5.0 新功能与修复**
|
||||
- 修复核心反爬头 `Sec-Ch-Ua` 构造 bug:原实现产出 `""Not_A Brand";v="99""` 畸形头(双重引号),Chrome/Edge 两条路径都存在,严格校验的 WAF 会忽略;现改为品牌数组统一拼接,产出 `"Not_A Brand";v="99", "Chromium";v="140", "Google Chrome";v="140"` 合法格式(真实浏览器已验证)
|
||||
- `fetch.py --extract json`:结构化骨架输出 `{title, meta_description, headings[], links[], images[]}`——AI 只看骨架即可判断页面价值,无需拉全文(隐含 `--format json`;stdlib/bs4 双路径输出同构)
|
||||
- `fetch.py --max-chars N`:提取后语义级字符截断(区别于 `--max-size` 的原始字节截断),`truncated` 字段如实标记
|
||||
- `search.py --fetch-total-chars N`:`--fetch` 全局字符预算,按结果顺序自上而下分配(剩余额度留给下一页),耗尽后剩余 URL 标记 `status="skipped"`(不发请求)——token 受限 agent 的上下文预算控制
|
||||
- `--dedup-fetched-content`:抓取正文相似度去重(SimHash,复用 `--similarity-threshold`),镜像/转载页面标记 `status="duplicate"`(text 清空),避免 AI 重复阅读同一内容
|
||||
- `--progress` 新增 research 角度级事件:`angle_start`/`angle_ok`/`angle_fail`(含 `index`/`total`);fetch 链路新增 `fetch_skip`/`fetch_duplicate` 事件
|
||||
- `fetch.py` 补齐 `--log-format json` 与 `--dump-schema`(与 search.py 对齐,结构化 JSON 契约可程序化发现)
|
||||
- CSV 输出媒体列自适应:images/videos 类别结果自动追加 `img_src`/`thumbnail_src`/`resolution`/`iframe_src`/`source` 列(纯文本结果不变,向后兼容)
|
||||
- `--dry-run` 批量模式打印实际查询列表(`queries` 字段,读本地文件不发 HTTP)
|
||||
- search 连接复用:requests 可用时走模块级 Session(连接池 + TLS 会话恢复),`--pages`/批量/研究模式多请求场景显著降开销;stdlib 零依赖路径不变
|
||||
- search 403 快速失败:实例级 403 不再退避重试(原 ~10.5s 空等),立即 failover;fetch 的 403 UA 轮换语义不受影响
|
||||
- `AdaptiveThrottle` 修复 `--throttle-failure-threshold 0` 语义:现为真正的"禁用自适应退避"(原实现 0 导致首次失败即退避)
|
||||
- 新增 `scripts/release_check.py` 发布一致性检查:版本号(pyproject/_config/文档)与错误码表(common.py/README/SKILL)漂移检测
|
||||
- 版本对齐:pyproject.toml 与 _config.py 同步为 2.5.0(此前 v2.4.0 发布时 pyproject 停在 2.3.0)
|
||||
|
||||
**v2.4.0 新功能**
|
||||
- 新增 `E_BLOCKED` 错误码:fetch 场景的 403(WAF/反爬拦截)从 `E_AUTH` 细分出来——被封锁不是凭证问题,AI Agent 不再误判为"需要检查认证"。新增 `classify_fetch_error()` / `_extract_status_code()`(common.py),应用于 `fetch.py` 与 `search.py --fetch`;SearXNG 实例认证的 403 仍映射 `E_AUTH`(搜索场景不变)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user