小说会悄悄消失:这款开源小说下载器,能把100多个网站的书装进TXT和EPUB
【免费下载链接】novel-downloader一个可扩展的通用型小说下载器。项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader
书架上那本书还在,点进去却已是 404——追更的人都懂这种后背发凉的感觉。为了不再让喜欢的作品随网站一起蒸发,我养成了一个新习惯:用开源小说下载器 novel-downloader 把连载中的书提前备份成 TXT 和 EPUB。这是一款可扩展的通用型小说下载器,覆盖国内外 100 多个小说网站。这篇文章,就是昨晚我"抢救"一本书的完整复盘:从为什么备份、怎么装、点了下载后发生了什么,到碰到加密正文怎么解、想自定义怎么改,一条线讲完。
为什么书架上的书会凭空消失:先搞清你要备份什么
不是错觉,小说真的会"消失"。很多作品即使已经入 V、即使你已经订阅,网站一改版或合同一到期,页面说没就没。更极端的情况是轻文轻小说这类整个网站直接关停。热门的书被笔趣阁等转载站接住,后来者还能看到;而那些质量不错但不够火、没有任何转载站收录的作品,就会彻底从互联网上蒸发。
novel-downloader 正是"404 小说文库"项目的组成部分,它的目标很朴素:在书还在的时候,把它稳稳地存到你自己的硬盘上。如果某天你常看的网站连不上了,至少你手里还有一份完整的离线拷贝。
下载完成后,脚本会自动产出几样东西,各有各的用处:
| 下载产物 | 适合场景 | 特点 |
|---|---|---|
| TXT 文档 | 手机阅读器、老设备 | 纯文本、体积最小,几乎任何设备都能打开 |
| EPUB 文件 | 电纸书、平板 | 自带目录、封面、插图与排版,阅读体验最好 |
| 原样 HTML 打包 | 开发者排查、保留网站原貌 | 连同原始页面与调试日志一起归档,方便核对 |
小贴士:脚本执行下载任务时会播放一段无声音频,这是为了防止浏览器把后台标签页休眠、中断下载,属于正常现象,不是 bug,也不必关掉它。
装好它只需三步:装管理器、跑一次构建、点一下图标
第一步,先给浏览器装一个脚本管理器(Tampermonkey、Violentmonkey 或 Greasemonkey 任选其一)。novel-downloader 本质是油猴脚本,需要这个"容器"来运行。
第二步,拿到脚本本体。想直接开箱即用,可以装已打包发布的版本;想改代码、跟新版本,也可以自己构建。构建只要四条命令:
git clone https://gitcode.com/gh_mirrors/no/novel-downloader cd novel-downloader yarn install yarn build第一行把源码克隆到本地,第二行进入项目目录,第三行用 yarn 安装全部依赖,第四行用 webpack 打包。构建完成后,把生成的bundle.user.js文件拖进脚本管理器界面即可完成安装。想改代码的话,改完再跑一次yarn build就能拿到新脚本。
第三步,打开任意一个受支持的小说网站。当页面右上角出现下载图标时,点击它,下载就开始了,右下角会有进度条。
点击下载后的半小时,脚本替你在后台做了四件事
昨晚那本三百多章的书,从点击图标到拿到文件大约花了半小时。这半小时里,脚本其实在后台干了四件活:
- 收集书籍信息:书名、作者、简介、封面、分卷和章节列表,一次性抓齐;
- 逐章抓取正文:按章节链接依次请求,跳过已购买检查,识别 VIP 章节;
- 清洗正文:用内置的 DOM 清洗逻辑(底层用了 Readability 算法)把广告、导航、脚本噪音全部剥掉,只留干净的段落和图片;
- 打包导出:把正文边下边写,用流式压缩生成 TXT 与 EPUB,所以几千章的大长篇也不会把浏览器内存撑爆。
下载过程中想看得更细,可以按下 F12 打开控制台,每一步状态都打印在那里;如果下载异常卡住,控制台日志也是排查的第一手资料。
正文被加密成天书?三种解码器这样把它翻译回来
能直接抓到纯文字是最好的,但很多网站不会让你这么舒服:晋江文学城用自定义字体加密正文,字符看着是正常汉字,复制出来却是乱码;海棠、书耽的 VIP 章节干脆只给图片版;还有些网站把文字伪装成图片。针对这些反爬手段,脚本准备了三层解码方案,逐级兜底:
| 解码方案 | 处理方式 | 适用场景 | 速度 |
|---|---|---|---|
| 文件名映射解码 | 根据图片文件名直接匹配对应文字 | 文件名里藏着字符信息的简单替换 | 最快 |
| 哈希值匹配解码 | 下载图片、计算哈希值后匹配已知字符 | 文件名会变、但图片内容不变的情况 | 中等 |
| OCR 光学字符识别 | 浏览器内跑 PaddleOCR 中文模型识别 | 复杂图片正文,无从映射只能硬识别 | 最慢但最准 |
遇到晋江这类字体加密,脚本会自动把网站的字体文件下载下来,逐一建立"字形 → 汉字"的映射关系,再反过来还原正文;图片版章节则走文件名映射或哈希匹配,实在匹配不上的复杂图片才动用 OCR。你甚至可以在设置里打开调试模式,查看字体匹配的详细过程。
别把整本书都搬走:三个高频自定义需求,一条代码搞定
不是每次都想把整本下载下来。脚本在设置里预留了几个自定义入口,最常见的是这三种:
只下载前 50 章,或只要番外,在自定义章节过滤里写:
// 只下载前 50 章 function chapterFilter(chapter) { return chapter.chapterNumber <= 50; } // 或:只要番外 function chapterFilter(chapter) { return chapter.chapterName && chapter.chapterName.includes("番外"); }chapterFilter对每一章返回 true 或 false,返回 true 的才会被下载,改判断条件就能精准圈定下载范围。
想要"第X章 标题"这样的章节命名、或自定义正文字号缩进,在自定义保存选项里写:
const saveOptions = { getchapterName(chapter) { return chapter.chapterName ? `第${chapter.chapterNumber}章 ${chapter.chapterName}` : `第${chapter.chapterNumber}章`; }, mainStyleText: `p { text-indent: 2em; line-height: 1.6; }` };getchapterName决定章节标题长什么样,mainStyleText直接决定正文 CSS,段落缩进、行距、字号都在这里调。
下载太快被反爬,想放慢,就去设置里调三个参数:concurrencyLimit(并发数)、sleepTime(基础间隔)、maxSleepTime(最大间隔)。默认分别是 1、500ms、2000ms,节奏已经比较克制。
小贴士:间隔不要一味往小了调——长佩文学这类反爬严格的站,每分钟约只能下 6 章,开太多并行反而容易触发风控,耐心等是最优解。
让脚本认识新网站:继承一个模板类,实现两个方法
所有网站支持都收敛在src/rules/目录里,按站点形态分类存放:
| 规则类型 | 适配的站点形态 | 代表网站 |
|---|---|---|
| onePage | 单页式目录 | 各类笔趣阁、UU看书 |
| twoPage | 分页式目录 | 轻之文库、18看书 |
| special | 需要特殊处理的平台 | 晋江、起点、pixiv、番茄 |
| biquge / mbtxt | 同源网站批量适配 | 笔趣阁变体、全书斋 |
给新网站写支持,核心就是继承BaseRuleClass,实现bookParse(解析书籍信息和目录)和chapterParse(解析章节正文)两个方法。大部分单页站点甚至不用从零写,直接套用src/rules/onePage/template.ts的mkRuleClass模板,把书名的选择器、章节列表的选择器、正文的清洗函数填进去就行,写完后在src/router/download.ts里注册一条匹配规则,再yarn build一次即可。这也是项目"可扩展"三个字的由来——加站成本被压到了最低。
六个真实踩过的坑,附排查步骤
- 付费章节下不下来:先确认已登录网站账号、且已购买对应章节。未登录或未购买时,付费章节会被直接忽略,这是设计如此,不是 bug。
- 长佩下载特别慢:正常,反爬限速每分钟约 6 章。不要多开页面同时下载多本长佩小说,否则更容易被限。
- 详情页没有下载图标:长佩、pixiv 这类单页应用网站,直接按下 F5 重新加载页面即可,无需反复刷新标签。
- 下载卡住、没有任何文件生成:在设置里开启调试模式,日志会写进下载产物里的
debug.log;也可以启用测试视图,把日志选项卡内容复制出来保存成 txt,提交问题时会用到。 - 遇到问题去哪反馈:请到项目支持页面按模板提交 issue,并附上上述日志。发在评论区、交流群组的反馈不会被处理。
- 存档到互联网档案馆的授权弹窗:首次使用会询问是否将当前书页存档至 archive.org 以备日后查看。同意与否都不影响下载功能,但注意该功能会搜集并上报 IP、User-Agent、当前 URL 等少量信息,介意的话拒绝即可。
下一步:从顺手使用者变成共建者
如果你常看的网站刚好不在支持列表里,最有效的做法是提交 issue 描述清楚站点结构,或者直接参考src/rules/onePage/template.ts写一条规则提交上来——项目欢迎代码贡献,而不是只等别人实现。想深入了解内部设计的,可以读读仓库里的docs/目录和CLAUDE.md,里面有针对 Cloudflare 挑战页、closed shadow DOM 这类硬核场景的方案文档。
先做这三件事吧:今晚把正在追的书挨个备份一遍;把下载参数按自己的网速调一轮;如果顺手,再给这个项目提第一个 issue 或 PR。书会消失,但备份不会——这份安心,值得花一个晚上来换。📚
【免费下载链接】novel-downloader一个可扩展的通用型小说下载器。项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考