公司动态

TypeScript小说下载器:构建可扩展架构的数字内容保存方案

📅 2026/7/26 16:46:32
TypeScript小说下载器:构建可扩展架构的数字内容保存方案
TypeScript小说下载器构建可扩展架构的数字内容保存方案【免费下载链接】novel-downloader一个可扩展的通用型小说下载器。项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader 数字阅读时代的架构挑战在当前的网络环境中数字内容的脆弱性已成为技术社区必须面对的挑战。小说网站的结构多样性、内容呈现方式的不断变化以及平台可能随时关闭的现实构成了一个复杂的数字内容保存难题。我们开发的novel-downloader项目正是对这一挑战的技术回应——一个基于TypeScript构建的、具备高度可扩展性的小说下载解决方案。作为一款油猴脚本novel-downloader直接在浏览器环境中运行避免了传统爬虫工具需要配置代理、处理Cookie等复杂操作。其核心设计理念是通过模块化的规则系统实现对100小说网站的智能适配同时保持代码的清晰结构和易于维护的特性。novel-downloader的后台运行状态展示通过开发者工具监控网络请求和下载进度 模块化架构深度解析核心模块设计项目采用清晰的分层架构每个模块承担特定职责src/ ├── main/ # 核心数据模型Book、Chapter、Attachment ├── rules/ # 网站解析规则按网站类型分类组织 ├── lib/ # 工具库和辅助函数 ├── save/ # 多格式输出引擎 └── ui/ # 用户界面组件Book类src/main/Book.ts作为核心数据容器管理小说的元数据、章节列表和保存配置。每个Book实例包含完整的作品信息支持通过saveOptions进行自定义输出配置。Chapter类src/main/Chapter.ts封装了章节的解析逻辑包括内容提取、图片处理和状态管理。这种设计使得每个章节可以独立处理支持并行下载和错误重试机制。规则系统的技术实现规则系统是novel-downloader的核心创新。在src/rules/目录下我们按照网站类型建立了多层级的规则组织// 基础规则类示例 export abstract class BaseRuleClass { abstract bookParse(): PromiseBook; abstract chapterParse(): PromiseChapterParseObject; // 通用DOM解析方法 protected async cleanDOM(element: HTMLElement): PromiseCleanResult { // 清理HTML提取纯文本和图片 } }每种网站类型都有对应的规则实现onePage/单页式网站所有章节在同一页面twoPage/分页式网站章节内容分布在多个页面special/特殊网站需要额外处理逻辑如字体加密、图片文字等多格式输出引擎src/save/模块实现了多种输出格式的支持TXT格式纯文本输出适合快速阅读和文本处理EPUB格式标准电子书格式支持目录导航和图文混排RAW格式原始HTML保存保留网站原始结构每种格式都有独立的处理逻辑通过模板引擎Jinja2生成最终文件。这种设计使得添加新的输出格式变得简单直观。novel-downloader提取的小说正文内容格式清晰保留了原始排版结构 技术实现细节与扩展机制DOM解析与内容提取项目采用渐进式的DOM解析策略首先通过CSS选择器定位内容区域然后应用cleanDOM函数清理无关元素// src/lib/cleanDOM.ts的核心逻辑 export async function cleanDOM( element: HTMLElement, mode: TM | normal ): PromiseCleanResult { // 移除广告、导航、评论等无关元素 // 提取纯文本内容 // 收集图片资源 // 应用用户自定义的清理规则 }对于复杂的网站结构我们实现了nextPageParse函数支持自动翻页和内容合并。这在处理分页式网站时尤为重要。图片文字处理的三层解码方案面对使用图片代替文字的网站如西瓜书屋我们实现了三级解码策略文件名映射通过图片文件名直接匹配文字速度最快哈希匹配计算图片哈希值进行匹配平衡速度与准确性OCR识别使用PaddleOCR进行光学字符识别准确性最高但速度较慢// src/lib/decoders/ImageCache.ts中的实现 export class ImageCache { async decode(imageUrl: string): Promisestring { // 尝试文件名映射 const filenameMatch this.filenameMapping.get(imageUrl); if (filenameMatch) return filenameMatch; // 尝试哈希匹配 const hash await this.calculateHash(imageUrl); const hashMatch this.hashMapping.get(hash); if (hashMatch) return hashMatch; // 最后使用OCR return await this.ocrDecode(imageUrl); } }字体加密处理对于使用字体加密的网站如晋江文学城我们实现了自动字体映射系统。当检测到加密字体时系统会下载字体文件并解析字形映射建立Unicode到实际字符的映射表应用映射表替换加密字符novel-downloader处理含图片小说的效果图片与文字完美整合 扩展开发指南添加新网站支持要为新的小说网站添加支持开发者只需创建新的规则文件并实现几个关键方法创建规则文件在适当的src/rules/子目录中创建新的TypeScript文件实现BaseRuleClass继承基础类并实现bookParse和chapterParse方法注册路由在src/router/download.ts中添加网站匹配规则更新配置文件在header.json的match字段添加URL模式// 示例简单的单页式网站规则 export class ExampleRule extends BaseRuleClass { public constructor() { super(); this.imageMode TM; this.charset utf-8; } async bookParse(): PromiseBook { // 解析书籍基本信息 const doc await getHtmlDOM(this.bookUrl, this.charset); const bookname doc.querySelector(h1).textContent.trim(); const author doc.querySelector(.author).textContent.trim(); return new Book({ bookUrl: this.bookUrl, bookname, author, // ... 其他参数 }); } async chapterParse(): PromiseChapterParseObject { // 解析章节内容 const doc await getHtmlDOM(this.chapterUrl, this.charset); const content doc.querySelector(.content) as HTMLElement; return await cleanDOM(content, TM); } }调试与测试项目提供了完善的调试工具调试模式在设置中启用后生成详细的debug.log文件测试视图可视化界面显示解析结果和错误信息控制台日志通过F12开发者工具查看实时运行状态novel-downloader解析的小说目录页面自动识别章节结构和元数据⚡ 高级配置与自定义自定义下载参数通过window.saveOptions对象用户可以完全控制输出格式// 自定义章节标题格式 const saveOptions { getchapterName: (chapter) { return 第${chapter.chapterNumber}章 ${chapter.chapterName || }; }, // 自定义CSS样式 mainStyleText: p { text-indent: 2em; line-height: 1.6; }, // 章节排序规则 chapterSort: (a, b) a.chapterNumber - b.chapterNumber };章节筛选功能用户可以定义chapterFilter函数来选择性下载章节// 只下载前50章 function chapterFilter(chapter) { return chapter.chapterNumber 50; } // 只下载特定卷的内容 function chapterFilter(chapter) { return chapter.sectionName 第一卷; }性能优化配置针对不同网站的反爬机制可以调整下载参数// 在设置面板中调整 { parallelThreads: 3, // 并行下载线程数 downloadInterval: 1000, // 下载间隔毫秒 maxInterval: 5000 // 最大间隔时间 }️ 构建与部署本地开发环境搭建# 克隆项目 git clone https://gitcode.com/gh_mirrors/no/novel-downloader cd novel-downloader # 安装依赖 yarn install # 开发构建 yarn build # 生产构建 yarn build:production构建完成后在dist/目录中会生成bundle.user.js文件可以直接安装到油猴脚本管理器中。持续集成与测试项目使用TypeScript进行类型检查确保代码质量# 类型检查 yarn type-check # 代码格式化 yarn format # 运行测试 yarn testnovel-downloader处理的长文本内容保留了完整的角色对话和世界观设定 技术价值与社会意义开源协作模式novel-downloader采用AGPL-3.0许可证鼓励社区贡献。项目的模块化设计使得添加新网站支持变得简单开发者可以专注于特定网站的解析逻辑而无需理解整个系统的复杂性。我们建立了清晰的贡献流程在GitHub上提交issue描述需求创建对应的规则文件提交Pull Request经过代码审查后合并数字文化遗产保存项目的核心价值超越了单纯的技术工具。在404时代许多优秀的网络文学作品因各种原因从互联网上消失。novel-downloader不仅是一个下载工具更是数字文化遗产保存的技术方案。通过集成互联网档案馆archive.org的存档功能对于无登录墙的小说网站脚本可以自动将书籍详情页和目录页存档为后人保留访问这些作品的机会。技术栈选择的意义选择TypeScript作为开发语言具有多重优势类型安全减少运行时错误提高代码可靠性更好的开发体验智能提示和代码补全易于维护清晰的接口定义和类型约束社区生态丰富的类型定义和工具链支持油猴脚本的运行环境选择也体现了技术权衡无需安装直接在浏览器中运行跨平台支持所有主流浏览器权限控制明确的权限声明用户可控自动更新通过脚本管理器自动获取新版本 未来发展方向技术路线图性能优化进一步优化图片处理和OCR识别速度规则自动化探索基于机器学习的网站结构自动识别格式扩展支持更多电子书格式如MOBI、PDF云同步集成云存储服务实现多设备同步社区生态建设我们计划建立更完善的开发者文档和示例包括详细的规则开发教程常见问题解决方案性能优化指南贡献者指南 开始使用对于终端用户安装过程简单直接安装油猴脚本管理器Tampermonkey、Violentmonkey等访问项目页面获取最新脚本访问支持的小说网站点击右上角下载图标对于开发者项目提供了完整的开发环境克隆项目并安装依赖研究现有规则实现为新网站创建规则文件提交Pull Request贡献代码novel-downloader代表了我们对数字内容保存的技术思考和实践。通过模块化设计、类型安全和社区协作我们构建了一个既强大又灵活的工具帮助读者保存他们珍视的数字内容同时也为开源社区贡献了一个高质量的技术解决方案。在技术不断演进的时代这样的工具不仅解决了实际问题更体现了开源精神的价值——通过代码共享和技术协作共同应对数字时代的挑战。【免费下载链接】novel-downloader一个可扩展的通用型小说下载器。项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考