我用 Cursor 写了个 Web 小说下载器📘
最近我花了几天时间,用
Cursor写了一个小工具 —— Web 小说下载器。
简单来说,它能帮你从各大小说网站上批量下载网络小说,并保存为干净的文本文件,让你可以离线阅读,不受广告打扰,也不用担心章节缺失。
项目已经开源在 GitHub:
👉 github.com/zzusp/Web-N…
💡 为什么要做这个工具
很多人(包括我自己)都有这样的经历:
想在网上看一本小说,结果满屏弹窗广告、强制登录、章节乱跳、还要看几页才能到正文。更烦的是,有些站点甚至需要会员才能下载离线版本。
我希望能有一个简单、纯净、可离线的方式阅读网络小说。
于是就动手做了这个小工具 —— Web 小说下载器。
它的目标只有一个:
“帮用户从网页上把小说干净地下载下来,不带广告,不带干扰。”
🚀 它能做什么
目前 Web 小说下载器支持以下功能:
- 🔍 输入小说目录页 URL,一键下载整本小说
- 📚 根据XPATH识别章节标题与内容
- 🧹 去除广告、脚注、无关文字
- 📘 支持单章节内分页的章节内容爬取
- 🧾 自动生成 txt 文件保存
- 🧠 支持断点续传,意外中断可继续下载
- ⚙️ 支持自定义保存路径和文件命名
- 🛡️ 支持 Cloudflare 保护的网站
很多小说网站启用了 Cloudflare 防护机制,普通爬虫会被拦截。
Web 小说下载器支持自动识别并绕过 Cloudflare 验证,能够正常抓取内容,这也是它相较于同类工具的一个主要优势。
在使用之前,有两点前提要求需要注意:
- 🧩 需要本地安装 Google Chrome 浏览器(程序通过浏览器来模拟访问网页);
- 🧠 需要具备一定的前端基础知识,能够编写 XPath 表达式,用于匹配网页中小说章节与正文的元素。
📘 使用说明
整个使用流程非常简单,只需三步即可完成小说下载:
① 创建配置文件
{
"version": "1.0", // 配置文件版本号(用于向后兼容配置格式)
"task_name": "我的小说下载任务", // 任务名称,便于区分多个配置文件
"description": "从example.com下载小说的配置", // 可读描述,说明这个配置的用途或目标网站
"browser": {
"chrome_path": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe", // Chrome 可执行文件路径(必需)
"headless": true, // 是否以无头模式运行浏览器(true:不显示界面,false:显示界面,便于调试)
"proxy": null // 可选代理地址(如 "127.0.0.1:10808"),若不需要填 null
},
"novel": {
"menu_url": "https://www.example.com/book/123456", // 小说目录页 URL(必填)
"title": "我的最爱小说", // 小说标题(用于输出文件的元数据/封面)
"author": "作者名称", // 作者名(EPUB 输出时会用到)
"output_filename": "my_favorite_novel" // 输出文件名(不含扩展名)
},
"parsing": {
"hash": "my_novel_123", // 元数据哈希,用于生成 chapters_<hash>/ 目录,便于断点续传与组织
"chapter_xpath": "(//div[@class='bd'])[2]//ul[@class='list']//li/a", // 提取章节链接的 XPath(必填)
"content_xpath": "//div[@class='page-content']", // 提取章节正文的 XPath(必填)
"chapter_pagination_xpath": null, // 单章节内多页时用于翻页的 XPath(如有则填写,否则为 null)
"chapter_list_pagination_xpath": "//a[contains(text(),'下一页')]", // 章节列表分页的 XPath(支持翻页抓取全部章节)
"content_regex": null // 可选的正文过滤正则(用于提取/清理正文中的特定区域)
},
"downloading": {
"concurrency": 3, // 并发下载章节数(推荐 2~8,根据网络与机器资源调整)
"content_regex": null // 下载阶段可覆盖的内容过滤正则(若在 parsing 中已设置可留空)
},
"processing": {
"string_replacements": [ // 字符串替换规则(依次替换 old -> new)
["<p>", ""], // 示例:移除 <p> 标签
["</p>", ""],
["<div>", ""],
["</div>", ""]
],
"regex_replacements": [ // 正则替换规则(依次替换 regex -> replacement)
["<img[^>]*>", "[图片]"], // 将图片标签替换为占位文本
["\\s+", " "] // 压缩多余空白为单个空格
],
"case_sensitive": false, // 替换是否区分大小写(true/false)
"backup_enabled": false, // 是否为被替换的文件创建备份(true/false)
"file_pattern": "*.html" // 要处理的文件匹配模式(默认 *.html)
},
"merging": {
"format": "epub", // 最终合并输出格式(支持 "txt" / "epub")
"reverse_order": false, // 是否以反序合并章节(true:从最新章到最旧章)
"output_directory": "~/Downloads/Novels" // 最终输出存放目录(可使用绝对或相对路径)
}
}
在项目根目录下新建 configs 文件夹,将上面的 JSON 示例保存为
configs/my_novel.json。
配置中的字段根据目标网站和个人需求修改即可,XPath 可通过浏览器开发者工具选取。
- 📁 目录
- 📄 web-novel-downloader.exe
- 📁 configs
- 📄 my_novel.json
② 验证配置是否正确
执行以下命令,检测配置文件是否有效:
web-novel-downloader-0.0.3.exe config validate configs/my_novel.json
如果终端显示以下内容,说明文件格式与字段内容无误。
③ 启动下载任务
运行:
web-novel-downloader-0.0.3.exe task --config configs/my_novel.json
程序会自动:
- 启动 Chrome(可隐藏窗口)
- 加载小说目录页并解析所有章节链接
- 抓取章节正文并清理无关标签
- 将结果保存为
.txt或.epub文件
完成后,你会在配置中指定的输出目录(如 ~/Downloads/Novels)看到成品文件。
💡 额外提示
- 若遇到 Cloudflare 验证页面,可将
browser.headless设置为false,程序会自动打开浏览器窗口以供用户手动完成验证。 - 支持断点续传:中途关闭程序,再次运行同一配置文件时,会从中断章节继续下载。
- 建议先在小规模章节上测试 XPath 表达式,确认匹配正确后再执行整本下载。
📦 获取方式
项目已经完全开源,感兴趣的朋友可以到 GitHub 下载:
另外还提供了打包好的可执行文件版本,Windows 用户可以直接使用,无需安装任何依赖。
❤️ 写在最后
其实,这个小项目只是我平时写代码时的一个放松尝试。
我希望它能帮更多人重新找回纯粹阅读的乐趣。
没有广告,没有充值提示,也没有被切割成几十页的章节。
只是一本干净的小说文本,让你安静地读下去。
“阅读本该简单。”
📎 项目地址:github.com/zzusp/Web-N…
如果你觉得好用,也欢迎点个 ⭐️ 支持一下。