novel-downloader实战指南:5步打造你的专属小说下载规则
【免费下载链接】novel-downloader一个可扩展的通用型小说下载器。项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader
你是否曾经想下载喜欢的小说却发现网站不支持?或者面对反爬机制感到束手无策?novel-downloader正是为解决这些问题而生的开源工具。这个基于TypeScript开发的通用小说下载器,通过灵活的规则系统,让你能够轻松扩展对任何小说网站的支持。本文将带你从零开始,深入理解其规则引擎,掌握实战技巧,成为一名真正的规则开发高手。
一、理解novel-downloader的核心架构
在开始编写规则前,让我们先了解novel-downloader的设计哲学。这个项目的核心在于其模块化的规则系统,不同类型的网站对应不同的规则目录:
- 单页式规则(
src/rules/onePage/):适用于章节内容在同一页面展示的小说网站 - 双页式规则(
src/rules/twoPage/):适用于章节内容分两页展示的网站 - 特殊规则(
src/rules/special/):处理需要登录、验证码或特殊加密的网站 - 通用库(
src/rules/lib/):包含字体解密、OCR识别等通用工具
图:novel-downloader规则目录结构展示,清晰的模块化设计让扩展变得简单
二、快速入门:5分钟创建你的第一个规则
让我们从一个最简单的例子开始。假设我们要为"256文学城"网站创建规则,只需要几行代码:
import { mkRuleClass } from "./template"; export const c256wxc = mkRuleClass({ bookUrl: document.location.href, bookname: document.querySelector(".art_tit").innerText.trim(), author: document.querySelector("span.bookinfo:nth-child(1) > a").innerText .replace(/^作者:/, "") .trim(), introDom: document.querySelector(".infotype > p") as HTMLElement, introDomPatch: (introDom) => introDom, coverUrl: null, aList: document.querySelectorAll(".catalog > li > a"), getContent: (doc) => doc.querySelector(".book_con") as HTMLElement, contentPatch: (content) => content, });这个规则的核心在于mkRuleClass函数,它封装了所有必要的逻辑。让我们分解一下关键参数:
- bookname:使用CSS选择器定位小说标题元素
- author:提取作者信息,并进行简单的文本清理
- aList:获取所有章节链接的列表
- getContent:定义如何从章节页面提取正文内容
三、如何优雅处理复杂网站结构?
3.1 应对多层嵌套的章节结构
很多小说网站采用分卷结构,比如第一卷、第二卷等。novel-downloader提供了优雅的解决方案:
export const complexRule = mkRuleClass({ // ... 其他参数 sections: document.querySelectorAll(".volume-title"), // 卷标题选择器 getSName: (sElem) => sElem.innerText.trim(), // 获取卷名 aList: document.querySelectorAll(".chapter-list a"), // 章节链接 getAName: (aElem) => { // 自定义章节名提取逻辑 const rawText = aElem.innerText.trim(); return rawText.replace(/第(\d+)章/, "第$1章"); }, });图:小说网站目录页面示例,展示章节列表和分卷结构
3.2 处理VIP章节和付费内容
对于需要付费的VIP章节,规则可以智能处理:
getIsVIP: (aElem) => { const hasVIPIcon = aElem.querySelector(".vip-icon") !== null; const isPaid = aElem.classList.contains("paid-chapter"); return { isVIP: hasVIPIcon, isPaid: isPaid, }; },当检测到VIP章节但未付费时,系统会自动跳过这些章节,避免下载失败。
四、深度解析:内容提取的最佳实践
4.1 精准定位正文内容
提取小说正文是规则开发的核心。不同的网站有不同的DOM结构,你需要仔细分析:
getContent: (doc) => { // 尝试多种选择器,提高兼容性 return ( doc.querySelector("#content") || doc.querySelector(".article-content") || doc.querySelector(".novel-content") || doc.querySelector(".chapter-content") ) as HTMLElement; },4.2 内容清理与净化
很多小说网站会在正文中插入广告、推荐链接等无关内容。contentPatch函数就是为此而生:
contentPatch: (content) => { // 移除广告元素 content.querySelectorAll(".advertisement, .recommend, .related-articles").forEach(el => el.remove()); // 清理多余的空行 const text = content.innerText; const cleanedText = text.replace(/\n{3,}/g, "\n\n"); // 创建新的干净元素 const cleanDiv = document.createElement("div"); cleanDiv.innerHTML = cleanedText; return cleanDiv; },图:小说章节内容展示,需要精确提取正文区域并清理无关元素
五、高级技巧:应对反爬机制
5.1 字体加密破解
一些网站使用字体加密来防止爬虫。novel-downloader内置了字体解密模块:
import { jjwxcFontDecode } from "../lib/jjwxcFontDecode"; export const encryptedRule = mkRuleClass({ // ... 基础配置 getContent: (doc) => { const content = doc.querySelector("#content") as HTMLElement; if (content) { // 应用字体解密 return jjwxcFontDecode(content); } return content; }, });5.2 OCR验证码处理
对于需要验证码的网站,可以使用OCR模块自动识别:
import { OCRDecoder } from "../../lib/decoders/OCRDecoder"; async function handleCaptcha(imageUrl: string): Promise<string> { const ocr = new OCRDecoder(); const code = await ocr.decodeImage(imageUrl); return code; }六、实战演练:从零创建完整规则
让我们通过一个完整的例子,学习如何为"笔趣阁"类网站创建规则:
import { mkRuleClass } from "./template"; export const biqugeRule = mkRuleClass({ bookUrl: document.location.href, bookname: document.querySelector("#info h1").innerText.trim(), author: document.querySelector("#info p") .innerText.replace(/作\s*者:/, "") .trim(), introDom: document.querySelector("#intro") as HTMLElement, introDomPatch: (introDom) => { // 移除简介中的"简介:"前缀 const text = introDom.innerText.replace(/^简介:/, ""); const cleanDiv = document.createElement("div"); cleanDiv.innerText = text; return cleanDiv; }, coverUrl: document.querySelector("#fmimg img")?.getAttribute("src") || null, aList: document.querySelectorAll("#list dd a"), sections: document.querySelectorAll("#list dt"), getSName: (sElem) => sElem.innerText.trim(), getContent: (doc) => doc.querySelector("#content") as HTMLElement, contentPatch: (content) => { // 移除笔趣阁特有的广告和提示 content.querySelectorAll("script, .bottem, .page_chapter").forEach(el => el.remove()); return content; }, concurrencyLimit: 5, // 并发限制,避免被封IP sleepTime: 1000, // 请求间隔1秒 });图:小说章节正文示例,展示需要提取的文本内容
七、调试与测试技巧
7.1 使用浏览器开发者工具
在编写规则时,浏览器开发者工具是你的最佳助手:
- 打开目标小说网站
- 按F12打开开发者工具
- 使用元素选择器(Ctrl+Shift+C)定位元素
- 在Console中测试CSS选择器
7.2 本地测试规则
创建规则后,你可以在本地进行测试:
# 克隆项目 git clone https://gitcode.com/gh_mirrors/no/novel-downloader # 安装依赖 cd novel-downloader npm install # 运行测试 npm test -- --grep "你的规则名称"八、常见问题与解决方案
8.1 选择器失效怎么办?
网站经常更新DOM结构,导致选择器失效。解决方案:
- 使用更通用的选择器:避免使用过于具体的类名
- 添加备用选择器:提供多个选择器选项
- 使用相对定位:通过父元素定位目标元素
8.2 如何处理动态加载的内容?
对于使用JavaScript动态加载内容的网站:
// 等待特定元素加载完成 async function waitForElement(selector: string, timeout = 5000): Promise<Element> { return new Promise((resolve, reject) => { const startTime = Date.now(); const check = () => { const element = document.querySelector(selector); if (element) { resolve(element); } else if (Date.now() - startTime > timeout) { reject(new Error(`Element ${selector} not found`)); } else { setTimeout(check, 100); } }; check(); }); }8.3 如何避免被封IP?
- 设置合理的请求间隔:
sleepTime参数控制请求间隔 - 限制并发数:
concurrencyLimit参数限制同时请求数量 - 使用代理轮换:在需要时可以集成代理支持
九、进阶学习与贡献指南
9.1 理解核心模块
要成为规则开发专家,建议深入理解以下核心模块:
src/lib/rule.ts:规则基类和工具函数src/lib/cleanDOM.ts:DOM清理和净化逻辑src/lib/http.ts:HTTP请求处理src/main/Chapter.ts:章节数据模型
9.2 参与社区贡献
当你创建了稳定可用的规则后,可以考虑贡献给社区:
- 确保代码符合项目编码规范
- 添加充分的注释和文档
- 在
test/sites.ts中添加测试用例 - 提交Pull Request到项目仓库
9.3 最佳实践总结
- 保持代码简洁:规则应该专注于提取逻辑,避免复杂业务
- 考虑可维护性:使用清晰的变量名和注释
- 处理异常情况:考虑网络错误、元素不存在等情况
- 遵循单一职责:每个规则只处理一个网站
十、开始你的规则开发之旅
现在你已经掌握了novel-downloader规则开发的核心技能。无论是简单的单页式网站,还是复杂的需要验证码的付费站点,你都有能力为其创建下载规则。
记住,规则开发是一个迭代的过程。先从简单的网站开始,逐步挑战更复杂的结构。多使用浏览器开发者工具分析页面结构,多参考现有的规则实现,你很快就能成为规则开发高手。
图:小说文本原始格式,展示了从网页到本地文件的转换过程
开始你的第一个规则吧!当你成功下载第一本小说时,那种成就感会让你爱上开源贡献。如果在开发过程中遇到问题,项目的Issue页面和社区讨论区都是很好的求助渠道。
行动起来,让更多小说网站加入支持列表,为开源社区贡献你的力量!
【免费下载链接】novel-downloader一个可扩展的通用型小说下载器。项目地址: https://gitcode.com/gh_mirrors/no/novel-downloader
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考