ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

电子书库数据机制一次看明白:24071 本书到实时搜索的完整链路

电子书库数据机制一次看明白:24071 本书到实时搜索的完整链路

电子书库数据机制一次看明白:24071 本书到实时搜索的完整链路

【免费下载链接】ebook-treasure-chest欢迎来到电子书下载宝库,一个汇聚了各类电子书下载链接的地方。无论你是喜欢阅读经典文学、经管励志、终身学习、职场创业、技术手册还是其他类型的书籍,这里都能满足你的需求。 该库涵盖了帆书app(原樊登读书)、微信读书、京东读书、喜马拉雅等读书app的大部分电子书。项目地址: https://gitcode.com/GitHub_Trending/eb/ebook-treasure-chest

24071 条电子书下载链接、1000 个标签书单、一个始终可用的搜索框——这是 ebook-treasure-chest(电子书下载宝库)目前的规模。下面所有数字都来自仓库里的解析统计文件:1000 个 md 文件,0 个解析失败,成功率 100%。这篇文章只讲一件事:这么大的数据怎么进仓库、怎么整理、怎么被搜索,以及这个库凭什么能一直维护下去。

书库覆盖帆书(原樊登读书)、微信读书、京东读书、喜马拉雅等读书 app 的大部分书籍,每本书都提供 epub、mobi、azw3 三种常见格式的下载链接。书籍按标签组织成md/目录下的书单文件,比如 md/文学.md、md/历史.md。解析统计给出的规模如下:

指标数值
已解析书目总数24071 本
标签分类数1000 个
解析成功率1000/1000 文件,0 失败
记录的最大书籍 ID64970

书目数最多的前 6 个标签:

标签书目数
文学2711
历史1748
科普743
管理613
社会558
推理531

注意 24071 是所有书单文件的书条目合计,一本带多个标签的书会分别计入对应的多个书单。

全量重建的三步流程:备份、定位最大 ID、分批抓取带断点续传

整个项目最重的部分是 scripts/sync/ 目录下的同步管道。全量同步由 sync_all_books.py 负责,一键入口是 run_full_sync.sh,它会先检查配置文件(源站点域名BOOK_SITE_DOMAIN)再执行。流程分三步:

  1. 先备份:backup_md.py 把整个 md/ 目录复制到md_backup/,目录名带时间戳。后续抓取出问题时,直接从这里恢复。
  2. 定位最大书籍 ID:源站给每本书一个自增 ID。find_max_book_id.py 先从首页的书籍链接里提取 ID;找不到就在 1–100000 区间做二分查找。结果写入仓库根的 max_book_id_found.txt。
  3. 分批抓取并生成书单:test_batch_sync.py 按 ID 抓取书籍详情页,20 个并发、每请求间隔 0.5 秒,超时保护 600 分钟;支持按每批 2 万分批、批间暂停 5 秒;已处理的 ID 会落盘,中断后下次运行自动跳过,也就是断点续传。

抓取完成后,每本书被写入对应标签的书单。生成书单里还有一个保护细节:包含源站域名的链接不会写进 md 文件,只保留网盘的真实下载链接,避免敏感域名泄露到公开仓库。

🔁 增量同步为什么只抓 64970 之后的新书

全量同步要处理 6 万多条数据、跑上几个小时,日常更新不可能次次这么干。

incremental_sync.py 只有四步:

  1. 读取上次同步到的最大 ID(批量脚本每次运行后会记录在md/max_book_id.json);
  2. 再访问源站首页,拿到当前的最大 ID;
  3. 如果当前最大 ID 不大于上次,直接结束——没有新书;
  4. 否则,只抓取「上次最大 ID + 1」到「当前最大 ID」这一段区间。

仓库根目录的 max_book_id_found.txt 当前记录64970,意味着源站已有 64970 个书号,日常增量只需处理上次同步之后新出现的部分。全量同步的成本是 6 万+ 次请求,增量同步只处理差值 🔑 这是长期可维护的关键。

增量同步成功后,同样会更新 README 的热门分类章节并重新生成搜索数据,与全量一致。

两级解析:从 md 书单到 6.8MB 的可搜索 JSON

md 书单是"给人读"的数据,搜索页需要"给机器读"的数据。两级解析完成这次转换。

第一级:md → JSON。parse_md_to_json.py 遍历全部 1000 个 md 文件,从每一行表格里抽出书名、作者、下载链接,补上标签、语言、格式字段,写入 docs/all-books.json;同时把解析统计写进 docs/parse-stats.json——开头的"1000/1000 成功"就是这里的产出。

第二级:JSON → 页面。generate_index.py 读取这份 JSON,生成两个产物:

  • docs/index.html:完整搜索页面,包含统计概览和热门分类书单(前 20 个热门分类,每类最多 10 本);
  • docs/books.json:一份书目数据副本,留给搜索页降级用。

最终的 all-books.json 与 books.json 各约 6.8MB。

搜索页:多关键词与匹配和两级数据降级

先看一下搜索页的实际效果:

搜索页是纯前端实现,逻辑在 docs/search.js,页面会提前预加载数据文件与脚本:

  • 加载数据:优先加载 all-books.json,加载完成后在搜索框里提示已加载的本数;
  • 多关键词:空格分隔多个关键词,每个关键词都必须命中(可命中书名、作者、分类中的任意一个),结果上限 100 条;
  • 高亮与安全:命中文字用<mark>标记,所有文本做 HTML 转义,链接只允许 http/https 协议。

最关键的设计是两级降级:先试 all-books.json,失败后自动改用 books.json,两者都失败才提示用户加载失败。页面里本身还内置了热门分类书单,即使数据加载失败,页面也不会空白。

长期维护:低成本更新管道与公开的赞助记账

这个库凭什么能一直维护下去?看两面。

成本面:全量重建只在首次构建或站点结构变化时发生;日常更新靠增量同步,只处理差值。抓取、解析、索引生成、页面生成整条链路全部脚本化,一条命令就能完成一轮更新。

动力面:sponsors.md 是一份公开的赞助记录,每笔小额赞助都按日期、姓名、金额、留言记入表格。名单目前有 15 条记录,从 2025 年 9 月延续到 2026 年 11 月,最低 1 元;连"学生党没有多少钱,请您喝杯可乐"这样 3 元的留言也被完整保留。

这种"小额、高频、公开"的记账方式,让维护者拿到的不只是资金,还有持续的正向反馈。更新成本低加上反馈公开,就是一个免费书库能持续转动的土壤。

快速开始:克隆电子书库与常用文件速查

如果想在本地运行或二次开发,先克隆仓库:

git clone https://gitcode.com/GitHub_Trending/eb/ebook-treasure-chest

常用文件速查:

路径用途
README.md项目说明、热门分类索引
sponsors.md赞助人公开名单
md/按标签组织的书单
scripts/sync/全量/增量同步与备份脚本
scripts/parse_md_to_json.pymd 书单 → JSON 解析
scripts/generate_index.py生成搜索页与索引
docs/在线搜索页面与数据文件
max_book_id_found.txt最大书籍 ID 记录

回到开头的问题:一个免费的电子书库怎么一直转下去?答案藏在管道里——全量重建负责冷启动,增量同步把日常更新压缩成"只抓 64970 之后的新书",两级降级保证搜索页始终可用;每次更新都足够便宜,每一份支持都被公开记在名单上。低成本加公开反馈,这套组合就是它长期维护的完整机制。

【免费下载链接】ebook-treasure-chest欢迎来到电子书下载宝库,一个汇聚了各类电子书下载链接的地方。无论你是喜欢阅读经典文学、经管励志、终身学习、职场创业、技术手册还是其他类型的书籍,这里都能满足你的需求。 该库涵盖了帆书app(原樊登读书)、微信读书、京东读书、喜马拉雅等读书app的大部分电子书。项目地址: https://gitcode.com/GitHub_Trending/eb/ebook-treasure-chest

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进