开发日志
做了什么、为什么这么做,以及撞上的坑。 更细的改动记录在 Git 提交历史 里。
-
走的时候不用求谁
导出到 NeoDB、Letterboxd、Goodreads 做完了。原先写着「要先和 NeoDB 维护者谈」——那是把 API 当成唯一入口时的判断。
-
抓完之后,先让你看见自己的东西
扩展 1.2.0:档案页多了「查看内容」。抽取器是从解析器仓库整份抄过来的,不是另写一份——那 220 行适配代码买的是只有一份实现。
-
验一验:能不能读将来的档案
规范给读者立过两条义务,而在此之前没有任何东西验证过它们。以及过程中两次写出了恒真的断言。
-
私密的那一份,目录页上也得带锁
豆列渲染进站点。以及一份名单抄在三个入口里,加东西时漏改两处——不报错,只是少了几十页。
-
豆列:值钱的不是清单,是你写在每条上的那句话
扩展 1.1.0 开始抓豆列。以及一份豆列被别的豆列翻到头给停掉了——一个真的静默截断路径。
-
上架当晚,别人替我逮到了两个 bug
三处全都需要一个和我不一样的账号、或者一次和我不一样的操作。装的人多一个,样本就多一个。
-
1.0.0,以及上架
装法从「clone 整个仓库」变成点一下。以及四条在浏览器里从来就没成立过的测试,是 Node 一直宽松才让它们绿着。
-
「导出之后可以放心删掉」——这句话得等到导入做完才诚实
导入做出来了。它必须成为第二条能写档案的路径,于是回头问那条「只能有一条」的规矩到底在保护什么。
-
打了分的广播,正文一律没抓到
2200 条只抽到 789 条,漏掉的 1411 条每一条都带评分。以及广播里那颗星:一份豆瓣自己都不保留的评分变化史。
-
又名是搜索里最值钱的一栏
记得《重返沉默之丘》而不记得《寂静岭2》的人,没有又名就什么都搜不到。而按裸斜杠切开会存下 176 个不存在的片名。
-
两个整整齐齐的零
音乐 84 条标记 0 条短评,舞台剧 5 条也是 0 条。一句告警都没有——因为「这条本来就没写短评」是合法的。
-
一按「开始抓取」就报错:那个 API 在这里根本不存在
档案里写着「这是哪份代码抓的」。那个数字曾经有三份互不认识的副本,全都写死成 0.0.1。
-
双击 index.html,那就是你的豆瓣
站点生成器做完了,sample.doubak.com 上线。以及一个把用户自己写的字悄悄吃掉的 bug。
-
解析器能跑了,以及两个只有换种跑法才会露出来的 bug
豆瓣改演员表被记成「你编辑了这条标记」,页脚的浏览计数变成了编辑历史——两个都不报错,产出看起来完全正常。
-
照片永远不会在增量抓取里出现
增量只看水位线以上,而照片是从广播页面派生的。补抓那一趟:重读 176 个已存页面,抓下 121 张图,零个页面请求。
-
最不可替代的那批字节:自己上传的图
广播附图有三种写法,一个都猜不出来;以及第四次犯同一个错——从手上的样本推出一个封闭集合。
-
公开测试开始:豆备 0.0.1
能跑什么、不能跑什么,以及为什么在还缺一块的时候就开放测试。
-
档案里第一次有了真的图片
作品封面进档案,bundle 格式随之升到 1.1:surface 多了一个 asset。
-
一堆档案不等于一条链
增量抓取上线,以及一个把四次独立全量误接成一条链、把完整性说成「已验证」的 bug。
-
豆瓣的封禁页也返回 200
拿 6341 个真实页面校准判定器,以及豆瓣把「我的广播」改名成「我的动态」那天。
-
豆瓣自己报的数量,不能用来证明抓全了
同一次抓取里,电影的计数是准的,游戏的计数少了 5 个——而且缺口在列表中间。
-
为什么是 WARC 和 JSON Schema,而不是 protobuf
上一版这个项目用 Go + Bazel + protobuf 写的。这一版全部推翻了,理由是 2040 年。