豆备 DOUBAK
← 开发日志

又名是搜索里最值钱的一栏

记得《重返沉默之丘》而不记得《寂静岭2》的人,没有又名就什么都搜不到。而把它按裸斜杠切开,会在档案里存下 176 个不存在的片名。

作品详情页是这份档案里最占地方的东西——按字节算是 90.3%, 一度差点被砍掉。留下来的理由只有一个:那一整块带标签的信息只有详情页上有, 而其中最值钱的是又名

为什么是又名

实测:2940 个作品里 2011 个有又名(电影 94%、音乐 49%; 书、游戏、舞台剧的页面上根本没有这一行)。 它装的是台译、港译和原文名。

一个记得《重返沉默之丘》但不记得《寂静岭2》的人,在没有又名的档案里搜不到任何东西。 所以它在搜索里与标题同权重,而且命中的是又名时要把又名显示出来—— 否则用户会以为搜错了。

null[] 必须分开:前者是「没读过详情页」, 后者是「读了,这页就是没有」。合成一个之后,「还欠多少」这个问题就答不出来了。

整块 #info 原样收进来

作品记录里现在多了一个 info,键就用豆瓣自己的标签:

{"导演": ["克里斯托夫·甘斯"], "制片国家/地区": ["法国", "日本"]}

不翻译、不归一化、不搞一套跨媒介的统一分类。解析器的产出会被当作 「页面当时就是这么说的」,做主张是下游的事。 实测覆盖:电影 2094/2102、书 145/145、音乐 84/84;游戏和舞台剧是 0, 它们的页面上没有这一块。

三条判据,每一条错了都不报错

① 按 div 嵌套深度截,不能截固定长度

span.pl 在页面别处还用来标评论区的用户名。截过头, 就会把几十个陌生人的 id 当成字段名存进档案主人的数据里。 截到第一个 </div> 也不行。

② 单引号双引号都要认

导演、编剧、主演用的是 class='pl',其余字段用 class="pl"。 只认双引号的话,恰好把最有价值的三个字段整个漏掉——而且是安安静静地漏掉。

③ 值按  /  切,不能按裸斜杠切

这条是纠正上一版。裸斜杠会把这些切开:

犯罪101(港/台)          → 「犯罪101(港」 + 「台)」
2026-01-23(美国/中国大陆) → 两半

(港/台) 是中文里「港台译名相同」的标准写法。 实测 4022 张有又名的页面上,裸切比正确切法多出 176 条而这 176 条全是切坏的片名——它们每一个看上去都很正常。

这类错误的可怕之处不在于数量,而在于它产出的是合法形态的数据: 一个片名字段里装着一个像片名的字符串,任何校验都拦不住, 只有把它跟真实页面对着看才会发现那不是一部电影。

顺序也是一条判据

修完这些之后还剩一个问题:2102 部电影里只有 44 部拿到了又名, 而抽样说应该是 94%。

原因是详情页只能补充列表页已经建好的作品记录, 而抓取总是先抓列表页、后抓详情页——两件事被写在了同一遍扫描里, 于是绝大多数详情页在被读到的时候,对应的作品还不存在。 规范里早就写着「详情页必须先全读完」,它不抛异常,只是安静地丢掉大部分数据。

顺带还挖出一个性能上的老朋友:段文件的缓存每处理完一次捕获就被清掉, 下一条又把同一个 159 MB 的段重新解压一遍。571 个列表页时勉强能忍, 2925 个详情页时就是十分钟还没跑完——改成只在换档案时才清,6 秒。 这是同一个 bug 第二次出现(站点生成器那边是 8 分钟 vs 1.5 秒)。

← 更新:打了分的广播,正文一律没抓到 更早:两个整整齐齐的零 →