豆备 DOUBAK
← 开发日志

打了分的广播,正文一律没抓到

2200 条有正文的广播只抽到了 789 条。漏掉的 1411 条,每一条都带评分——不是零星漏网,是一整类。

带评分的广播,<blockquote> 和正文 <p> 之间夹着一颗星:

<blockquote>
  <span class="rating-stars">★★★★★</span>
  <p>7月2号首发玩起了,非常不错!</p>
</blockquote>

而抽取用的正则要求这两者紧挨着。于是凡是打了分的广播,正文一律为空。 实测 2200 条有正文的广播只抽到 789 条,漏掉 1411 条——占 64%。

为什么它能藏这么久

因为 text: null 和「这条广播本来就没写字」长得一模一样, 而后者本来就是大多数——77% 的广播是纯标记动作,本来就没有正文。 所以连比例上都看不出异常:一个正常的空值率,掩护着一整类丢失。

它是从生成出来的页面上肉眼发现的—— 「看过 X」那一行下面本该有一段话。

注意一个字段合法地大部分时候都为空时, 它的空值率就检测不了它自己的 bug。 只能拿它跟别的东西交叉着看(这里是「带评分的广播里有多少条没正文」), 或者去看真实的输出。

广播是这份档案里最不可替代的东西:发布即冻结、可以被静默删除, 也是首次抓取之前那些编辑的唯一证据。丢掉它 64% 的正文是相当严重的一种损失。

而字节一直都在 WARC 里。 改一处重跑,有正文的广播 806 → 2200, 没有重新抓过豆瓣一次。这正是当初把「保存」和「解读」分成两步换来的东西。

那颗星本身,是豆瓣自己都不保留的历史

找到那个 <span> 之后顺手把它存了下来:3401 条广播里 1447 条带评分, 此前全部丢掉。

它和标记页上那个分不是一回事。 标记只留最新的那个——改一次覆盖一次,豆瓣不留历史; 而广播发布即冻结,所以那是「那一天我给了几颗星」。

把同一部作品的几条广播排开,就是一份评分变化史。 实测这份档案里 17 部作品的分变过。其中一部读起来是这样的:

想看 → 在看 ★★★★★ → 看过 ★★★★☆

用户在最后那条广播里解释了为什么降一星。而豆瓣今天只显示 4 星, 中间那段没有任何地方能查到——除了这份档案。

  • 数星星,不解析文案:页面上是实体符号,不是数字。
  • 没打分写 null,不写 0:0 星和没打分是两件不同的事。

同一批还补上了广播卡片上的作品名(target_title), 包括被删条目上的那个占位符——豆瓣把它显示成「未知作品」, 而占位符不是内容,不能当成作品名存进档案。

← 更新:「导出之后可以放心删掉」 更早:又名是搜索里最值钱的一栏 →