千万级图书 MARC 数据的汇总与处理方案

一本书的准确信息,往往不在某一个地方,而是散落在各地图书馆的 OPAC、联合目录和书目站点里。 任何一家的数据都有缺口:有的缺主题词,有的缺出版信息,有的连 ISBN 都有错。 把上千万条 MARC 记录汇成一份干净、可信的权威数据,靠的不是某个强大的单机程序, 而是一条分工明确的流水线。整条链路分三段:获取、清洗、使用。

一、数据获取:成百上千的爬虫,匀速前进

每个目标站点一个专用爬虫——它们之间的差异远比想象中大:有的直接暴露 MARC 原始记录 (ISO2709 / MARC21),有的只有网页字段需要解析转换;有的按控制号翻页,有的只支持检索式遍历。 为每一家单独写适配,采集层彼此隔离,一个站点改版不会波及全线。

匀速是这一段的关键词。每个爬虫内部挂一个令牌桶,把请求速率压在每秒一两个的水平, 夜间错峰、避开对方高峰时段;单条失败退避重试,连续失败就熔断降速并告警。 慢是刻意的:宁可把采集周期拉长到数周,也不给源站造成压力——爬虫的寿命比速度重要。

进度上做断点续抓:每个爬虫维护自己的游标(控制号或页码),中断后从断点继续; 进入增量阶段后,按更新时间只拉新记录。落地纪律只有一条: 原始 MARC 先原样存档(append-only),再解析成统一的 JSON 中间格式。 原始数据永远可以回放,后面任何一段逻辑出了问题,都不需要回头重爬。

二、数据清洗:重复数据的过滤与合并

同一本书,在不同来源下会有几条到几十条记录。去重分两层:

  • 第一层靠 ISBN。它是天然的主键——统一做 ISBN-10/13 转换、去连字符之后精确归并。
  • 缺 ISBN 的记录退到第二层,用题名 + 作者 + 出版社 + 出版年做模糊匹配: 编辑距离加规则过滤,阈值宁可收紧——错合比漏合更难挽回。

归一化在匹配之前完成:作者名的「(美)」「[美]」前缀、全半角、中西文姓名顺序统一; 题名去掉副题标点和多余空白;出版社走别名映射表。所有规则版本化,重跑可复现。

合并是字段级的,不是记录级的。每个字段按来源优先级和质量打分择优 (权威书目馆 > 高校馆 > 公共馆),逐字段合成一条「黄金记录」,同时保留每个字段值的出处:

{
  "isbn": "9787xxxxxxx",
  "title":    { "value": "……", "from": "nlc",   "confidence": 0.98 },
  "creator":  { "value": "……", "from": "calis", "confidence": 0.95 },
  "subject":  [ "……", "……" ]
}

冲突不确定时保留多值而不是硬二选一——丛书名、译名这类字段尤其如此。 有了出处,任何一次合并都可以追溯、可以回滚。

三、数据使用:权威信息源

清洗后的黄金记录有两个用途。

一是书目校对。站点现有书目与权威库比对,ISBN、题名、作者、出版社不一致时生成修正建议, 高置信度自动回填,其余进人工队列;缺失的字段(页数、开本、丛编、主题词)直接补齐。 书目质量从「依赖单次录入」变成「有底库兜底」。

二是 AI 搜索补全。AI 找书的结果在出口处用权威库校准: 模型负责理解需求、做推荐和排序,而书名、作者、出版社、ISBN 这些事实字段一律以权威库为准。 模型幻觉出来的书目信息,在离开流水线之前就被替换或拦下。

形态上,黄金记录进入搜索索引与缓存层,支持按 ISBN、题名、作者多路查询; 上游爬虫持续增量,黄金记录定期重建,数据保持新鲜。

这套方案没有复杂架构,取舍就是一句话:抓取慢而稳,清洗可复现,使用有出处。 上千万条数据不靠单点力气大,靠每一段都足够简单、足够可靠。