豆备 DOUBAK
← 开发日志

v1.3.2,以及为什么格式版本跳到了 1.4

两组修复:抓取卡死、重试成功了缺口却收不回。 档案格式随之从 1.3 走到 1.4——它只多了一个可选字段。

v1.3.2 已经发布。 两件事都来自同一次真实抓取的反馈,各自已经写过一篇,这里只列结果:

  • 抓取卡住不动—— 一次抓取停了 8494 秒。真凶是超时只盖住半次往返:浏览器的 fetch() 在响应头到达时就返回,而随后读正文那一步没有任何上限。 而它能卡这么久,是因为另外三道保护各自堵住了自救的一段。四处都修了; 同样的卡死现在最多卡 5 分钟,然后被判死、接管、从断点继续。
  • 重试成功了,缺口却收不回—— 一张图三次超时记下缺口,点重试、成功了,而档案里那句「抓不下来」原样封了进去。 缺口现在多存一份结构化的 URL,成功捕获时精确抹掉。

面板还多了两句话:帮助页的「进度长时间不动」(5 分钟后自动接管, 不必重装扩展),以及导入按钮旁边那行——系统的文件夹对话框一次只能选一个文件夹, 要一次导入多份,选中它们共同的上一级

那个 1.4 是什么

不是扩展的版本号。这个项目有两条独立的版本线,混起来看会很吓人:

版本号说的是什么现在是
扩展版本你装的这个软件v1.3.2
spec_version档案文件夹的格式bundle/1.4

1.4 与 1.3 的全部差别是一个可选字段:一处「这一页抓不下来」的缺口, 现在除了那句给人看的话,还单独存一份它说的那个 URL。

为这一个字段动版本号,是规范自己的规矩新增可选字段就是一次小版本。听起来小题大做,但它买下的东西很具体—— 档案是冻住的,一份 2022 年的备份今天还要能读。 「这份档案是按哪一版写的」必须写在文件里,而不是靠读的人去猜。

这个字段还带来一条新的校验:一处缺口说某个 URL 抓不下来, 而同一份档案里就有那个 URL 的成功捕获——校验器现在会报错。 换句话说,这一类错话从今往后能被第三方当场看出来, 不必相信生产者的自述。

新旧怎么搭,一张表说完

结论先说:老档案什么都不用做。不用重抓,不用转换,不用导出再导入。 下面这些是实际验过的——手上那 26 份真实档案正好横跨四个格式版本 (1.0 四份、1.1 八份、1.2 六份、1.3 八份),全套流程跑了一遍。

场景支持吗依据
新版扩展导入 1.0–1.3 的老档案 ✅ 支持 导入只核对文件名、字节数与摘要,从不看版本号
一个目录里混着好几个格式版本,一起解析 ✅ 支持 实测:26 份一起解析,产出 2963 条标记
拿老档案当基准,接着做增量抓取 ✅ 支持 链的判据是档案编号与水位线,与格式版本无关
老档案建站 / 导出到 NeoDB ✅ 支持 样张站就是这么生成的
抓到一半(1.3.1),升级之后接着抓完 ✅ 支持 断点续抓不按版本校验;收尾时按新版本如实写下
版本的扩展 / 解析器读 1.4 的档案 ✅ 支持 规范要求读者容忍不认识的字段,两边都有专门的用例在跑
校验器校验老档案 ✅ 支持 实测 26 份里 22 份通过;4 份报的是七月那个已知的老毛病,与版本无关
校验器(1.3 那一版)校验 1.4 的新档案 ⬜ 会被拒 唯一的例外,见下

最后一行是整张表里唯一的「不支持」,而它是故意的: 档案格式的 schema 不接受它不认识的字段。一个 1.3 时代的校验器看到 url 会说「这不合规」——它说得对,按它知道的那一版确实不合规。 这条规矩存在的理由是宁可响亮地拒绝,也不要默默地少读一个字段; 规范里另外两次小版本递增(unknown 判定、导入档案的成色取值)也都是这样。

解决办法是把规范仓库更新到最新——那是校验器这一个工具的事, 跟你的档案、跟扩展、跟解析器都没有关系。

一句话版本:装上 v1.3.2,老档案照旧用,新抓的档案里多了一个字段。 只有一件事会变——如果你手上留着一份旧的 validate.py 用来自己核对, 更新它。

更早:档案是全的,声明是错的 →