Skip to content

zzusp/Web-Novel-Downloader

Repository files navigation

Web小说下载器 (Web Novel Downloader)

一个功能强大的Web小说下载工具,支持从网站批量下载小说章节,并提供多种输出格式。

🔄 最新更新:项目已重构为模块化架构,提高了代码的可读性和可维护性。所有功能保持不变,使用方式完全兼容。

✨ 主要功能

  • 智能章节解析:使用XPath表达式精确提取章节链接和内容
  • 并发下载:支持多线程并发下载,提高效率
  • 分页支持
    • 章节内分页:处理跨多页的章节内容
    • 章节列表分页:支持多页章节列表的自动翻页
  • 内容处理
    • 正则表达式过滤
    • 字符串替换(支持图片标签替换为文字)
    • 内容清理和格式化
  • 多种输出格式
    • TXT:纯文本格式
    • EPUB:标准电子书格式,支持目录导航
  • 元数据管理:自动保存和加载章节信息
  • 章节组织:按元数据哈希组织章节文件到 chapters_<hash>/ 目录
  • 断点续传:跳过已下载的章节
  • Cloudflare保护处理:自动处理反爬虫保护
  • 配置文件系统:支持JSON配置文件,一键执行完整工作流程
  • 浏览器控制:支持无头模式和有头模式切换
  • 智能跳过:自动跳过已存在的元数据文件,支持断点续传
  • 反检测机制:内置反爬虫检测和Cloudflare保护处理
  • 错误处理:完善的错误检测和用户友好的错误信息

🚀 快速开始(普通用户)

下载可执行文件

项目提供了预构建的可执行文件,无需安装Python环境即可使用:

Windows版本

  • 文件: dist/web-novel-downloader.exe
  • 大小: 约15MB
  • 要求: Windows 10/11
  • 使用: 双击运行或命令行调用

macOS版本

  • 文件: dist/web-novel-downloader.app
  • 大小: 约15MB
  • 要求: macOS 10.14+
  • 使用: 双击运行或命令行调用

基本使用步骤

1. 解析章节列表

# Windows(默认后台运行) ./web-novel-downloader.exe parse --menu-url "https://example.com/novel" --chapter-xpath "//a[@class='chapter-link']" --content-xpath "//div[@class='content']" # macOS(默认后台运行) ./web-novel-downloader.app/Contents/MacOS/web-novel-downloader parse --menu-url "https://example.com/novel" --chapter-xpath "//a[@class='chapter-link']" --content-xpath "//div[@class='content']" # 显示浏览器窗口(用于调试) ./web-novel-downloader.exe parse --menu-url "https://example.com/novel" --chapter-xpath "//a[@class='chapter-link']" --content-xpath "//div[@class='content']" --no-headless

2. 下载章节

# Windows(默认后台运行) ./web-novel-downloader.exe download --metadata-file chapters/metadata/chapters_<hash>.json --concurrency 5 # macOS(默认后台运行) ./web-novel-downloader.app/Contents/MacOS/web-novel-downloader download --metadata-file chapters/metadata/chapters_<hash>.json --concurrency 5 # 显示浏览器窗口(用于调试或手动处理验证) ./web-novel-downloader.exe download --metadata-file chapters/metadata/chapters_<hash>.json --concurrency 5 --no-headless

3. 章节内容字符串替换(可选)

# Windows ./web-novel-downloader.exe replace --metadata-file chapters/metadata/chapters_<hash>.json --string-replacements "[['<p>',''],['</p>',''],['<div>',''],['</div>','']]" # macOS ./web-novel-downloader.app/Contents/MacOS/web-novel-downloader replace --metadata-file chapters/metadata/chapters_<hash>.json --string-replacements "[['<p>',''],['</p>',''],['<div>',''],['</div>','']]"

4. 合并为TXT文件

# Windows ./web-novel-downloader.exe merge --metadata-file chapters/metadata/chapters_<hash>.json --format txt --output "my_novel.txt" --title "小说标题" # macOS ./web-novel-downloader.app/Contents/MacOS/web-novel-downloader merge --metadata-file chapters/metadata/chapters_<hash>.json --format txt --output "my_novel.txt" --title "小说标题"

5. 合并为EPUB文件

# Windows ./web-novel-downloader.exe merge --metadata-file chapters/metadata/chapters_<hash>.json --format epub --output "my_novel.epub" --title "小说标题" --author "作者名" # macOS ./web-novel-downloader.app/Contents/MacOS/web-novel-downloader merge --metadata-file chapters/metadata/chapters_<hash>.json --format epub --output "my_novel.epub" --title "小说标题" --author "作者名"

配置文件工作流程(推荐)

使用配置文件可以一次性完成所有步骤,无需手动执行每个命令。

1. 创建配置文件

在项目根目录创建 configs/ 文件夹,然后创建JSON配置文件:

{ "version": "1.0", "task_name": "我的小说下载任务", "description": "从example.com下载小说的配置", "browser": { "chrome_path": "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe", "headless": true, "proxy": null }, "novel": { "menu_url": "https://www.example.com/book/123456", "title": "我的最爱小说", "author": "作者名称", "output_filename": "my_favorite_novel" }, "parsing": { "hash": "my_novel_123", "chapter_xpath": "(//div[@class='bd'])[2]//ul[@class='list']//li/a", "content_xpath": "//div[@class='page-content']", "chapter_pagination_xpath": null, "chapter_list_pagination_xpath": "//a[contains(text(),'下一页')]", "content_regex": null }, "downloading": { "concurrency": 3, "content_regex": null }, "processing": { "string_replacements": [ ["<p>", ""], ["</p>", ""], ["<div>", ""], ["</div>", ""] ], "regex_replacements": [ ["<img[^>]*>", "[图片]"], ["\\s+", " "] ], "case_sensitive": false, "backup_enabled": false, "file_pattern": "*.html" }, "merging": { "format": "epub", "reverse_order": false, "output_directory": "~/Downloads/Novels" } }

2. 验证配置文件

./web-novel-downloader.exe config validate configs/my_novel.json

3. 执行完整工作流程

./web-novel-downloader.exe task --config configs/my_novel.json

这个命令会自动执行以下步骤:

  1. 解析章节列表(如果元数据文件已存在则跳过)
  2. 下载所有章节内容
  3. 处理内容(字符串替换等)
  4. 合并为最终文件

智能跳过功能

系统会自动检测已存在的元数据文件:

  • 如果元数据文件存在且URL匹配,自动跳过解析步骤
  • 如果元数据文件存在但URL不匹配,会重新解析
  • 支持断点续传,避免重复下载已完成的章节

反检测机制

内置多种反爬虫检测机制:

  • 自动检测Cloudflare保护页面
  • 智能处理404错误页面
  • 反自动化检测(禁用自动化标识)
  • 自定义User-Agent和浏览器参数

详细使用说明

解析章节 (parse)

解析网站上的章节列表,提取章节链接和标题。

必需参数

  • --menu-url:小说目录页URL
  • --chapter-xpath:章节链接的XPath表达式
  • --content-xpath:章节内容的XPath表达式

可选参数

  • --chapter-pagination-xpath:章节内分页的XPath表达式
  • --chapter-list-pagination-xpath:章节列表分页的XPath表达式
  • --content-regex:内容过滤的正则表达式
  • --string-replacements:字符串替换规则(JSON格式)
  • --proxy:代理服务器地址
  • --headless:无头模式运行浏览器(默认:True)
  • --no-headless:显示浏览器窗口

示例

./web-novel-downloader.exe parse \ --menu-url "https://www.example.com/book/123456" \ --chapter-xpath "(//div[@class='bd'])[2]//ul[@class='list']//li/a" \ --content-xpath "//div[@class='page-content']" \ --chapter-list-pagination-xpath "//a[contains(text(),'下一页')]" \ --string-replacements "[['<p>',''],['</p>',''],['<div>',''],['</div>','']]"

下载章节 (download)

使用已保存的元数据下载章节内容。

必需参数

  • --metadata-file:指定要使用的 chapters_<hash>.json 元数据文件路径(支持相对路径)

可选参数

  • --concurrency:并发下载数量(默认3)
  • --proxy:代理服务器地址
  • --content-regex:内容过滤的正则表达式(覆盖元数据中的设置)
  • --headless:无头模式运行浏览器(默认:True)
  • --no-headless:显示浏览器窗口

示例

# 使用元数据文件下载 ./web-novel-downloader.exe download --metadata-file chapters/metadata/chapters_879584cc.json # 指定并发数量 ./web-novel-downloader.exe download --metadata-file chapters/metadata/chapters_879584cc.json --concurrency 5 # 使用代理下载 ./web-novel-downloader.exe download --metadata-file chapters/metadata/chapters_879584cc.json --proxy 127.0.0.1:10808

合并章节 (merge)

将下载的章节合并为单个文件。

必需参数

  • --metadata-file:指定要使用的 chapters_<hash>.json 元数据文件路径(支持相对路径)
  • --output:输出文件名

可选参数

  • --format:输出格式(txt/epub,默认txt)
  • --title:小说标题
  • --author:作者名称(EPUB格式需要)

示例

# 生成TXT文件 ./web-novel-downloader.exe merge --metadata-file chapters/metadata/chapters_879584cc.json --format txt --output "my_novel.txt" --title "我的小说" # 生成EPUB文件 ./web-novel-downloader.exe merge --metadata-file chapters/metadata/chapters_879584cc.json --format epub --output "my_novel.epub" --title "我的小说" --author "作者名"

字符串替换 (replace)

对已下载的章节文件进行字符串替换。

必需参数

  • --metadata-file:指定要使用的 chapters_<hash>.json 元数据文件路径(支持相对路径)
  • --string-replacements:替换规则(JSON格式)

💡 JSON格式说明:支持两种格式:

  • 单引号格式:[['old1','new1'],['old2','new2']]
  • 双引号格式:[["old1","new1"],["old2","new2"]]

可选参数

  • --regex-replacements:正则表达式替换规则
  • --case-sensitive:是否区分大小写(默认False)
  • --backup:是否创建备份文件
  • --dry-run:预览模式,不实际修改文件
  • --pattern:文件匹配模式(默认*.html)

示例

# 基本字符串替换(单引号格式) ./web-novel-downloader.exe replace --metadata-file chapters/metadata/chapters_879584cc.json --string-replacements "[['<p>',''],['</p>','']]" # 基本字符串替换(双引号格式) ./web-novel-downloader.exe replace --metadata-file chapters/metadata/chapters_879584cc.json --string-replacements "[[\"<p>\",\"\"],[\"</p>\",\"\"],[\"<br>\",\"\\n\"]]" # 预览模式 ./web-novel-downloader.exe replace --metadata-file chapters/metadata/chapters_879584cc.json --string-replacements "[['old','new']]" --dry-run # 正则表达式替换 ./web-novel-downloader.exe replace --metadata-file chapters/metadata/chapters_879584cc.json --regex-replacements "[['<img[^>]*>','[IMAGE]']]" # 创建备份 ./web-novel-downloader.exe replace --metadata-file chapters/metadata/chapters_879584cc.json --string-replacements "[['old','new']]" --backup

高级功能

分页支持

章节内分页:处理跨多页的章节内容

./web-novel-downloader.exe parse \ --menu-url "https://example.com/novel" \ --chapter-xpath "//a[@class='chapter']" \ --content-xpath "//div[@class='content']" \ --chapter-pagination-xpath "//a[contains(text(),'下一页')]"

章节列表分页:处理多页的章节列表

./web-novel-downloader.exe parse \ --menu-url "https://example.com/novel" \ --chapter-xpath "//a[@class='chapter']" \ --content-xpath "//div[@class='content']" \ --chapter-list-pagination-xpath "//a[contains(text(),'下一页')]"

内容过滤

使用正则表达式过滤内容:

./web-novel-downloader.exe parse \ --menu-url "https://example.com/novel" \ --chapter-xpath "//a[@class='chapter']" \ --content-xpath "//div[@class='content']" \ --content-regex "第.*?章.*?$"

字符串替换

支持复杂的字符串替换规则:

# 清理HTML标签 ./web-novel-downloader.exe replace \ --string-replacements "[['<p>',''],['</p>',''],['<div>',''],['</div>','']]"

🔍 故障排除

常见问题

  1. Cloudflare保护

    • 程序会自动处理Cloudflare保护
    • 如果遇到问题,请等待几分钟后重试
  2. XPath表达式错误

    • 使用浏览器开发者工具检查元素结构
    • 确保XPath表达式正确匹配目标元素
  3. 内容提取失败

    • 检查content-xpath是否正确
    • 尝试更简单的XPath表达式
  4. EPUB文件问题

    • 确保使用支持EPUB的阅读器
    • 检查文件是否完整下载

调试技巧

  1. 使用dry-run模式
./web-novel-downloader.exe replace --string-replacements "[['old','new']]" --dry-run
  1. 检查元数据
ls chapters/metadata/ cat chapters/metadata/*.json
  1. 查看章节文件
ls chapters/ head -20 chapters/*.html

🛠️ 开发者指南

技能要求

使用本工具进行开发需要具备以下基础知识:

  • XPath基础:能够编写XPath表达式来定位HTML元素
  • HTML基础:理解HTML结构,能够识别网页元素
  • 浏览器开发者工具:会使用F12开发者工具检查元素结构
  • Python基础:具备基本的Python命令行使用能力

💡 提示:如果不熟悉XPath,建议先学习XPath语法。可以使用浏览器开发者工具的Console标签测试XPath表达式:$x("your-xpath-here")

开发环境设置

安装依赖

pip install -e .

开发模式安装

# 安装开发依赖 pip install -e ".[dev]" # 或使用构建脚本 python scripts/build/build.py --help

使用Python包

方法一:使用脚本

  1. 解析章节列表
python scripts/book_downloader.py parse --menu-url "https://example.com/novel" --chapter-xpath "//a[@class='chapter-link']" --content-xpath "//div[@class='content']"
  1. 下载章节
python scripts/book_downloader.py download --metadata-file chapters/metadata/chapters_879584cc.json --concurrency 5
  1. 章节内容字符串替换(可选)
python scripts/book_downloader.py replace --metadata-file chapters/metadata/chapters_879584cc.json --string-replacements "[['<p>',''],['</p>',''],['<div>',''],['</div>','']]"
  1. 合并为TXT文件
python scripts/book_downloader.py merge --metadata-file chapters/metadata/chapters_879584cc.json --format txt --output "my_novel.txt" --title "小说标题"
  1. 合并为EPUB文件
python scripts/book_downloader.py merge --metadata-file chapters/metadata/chapters_879584cc.json --format epub --output "my_novel.epub" --title "小说标题" --author "作者名"

方法二:安装为包后使用

  1. 安装包
pip install -e .
  1. 使用命令行工具
web-novel-downloader parse --menu-url "https://example.com/novel" --chapter-xpath "//a[@class='chapter-link']" --content-xpath "//div[@class='content']" web-novel-downloader download --metadata-file chapters/metadata/chapters_879584cc.json --concurrency 5 web-novel-downloader merge --metadata-file chapters/metadata/chapters_879584cc.json --format epub --output "my_novel.epub" --title "小说标题" --author "作者名"

方法三:作为Python包使用

from book_downloader import NovelDownloader # 创建下载器实例 downloader = NovelDownloader( chapter_xpath="//a[@class='chapter-link']", content_xpath="//div[@class='content']", concurrency=5 ) # 下载小说 import asyncio asyncio.run(downloader.download_novel("https://example.com/novel"))

开发工具

运行测试

pytest

代码格式化

black src/ tests/ scripts/

类型检查

mypy src/

构建和安装

构建包

# 使用构建脚本(推荐) python scripts/build/build.py --packages --version v0.0.1 # 或手动构建 python -m build

构建可执行文件

# 使用构建脚本(推荐) python scripts/build/build.py --exe windows --version v0.0.1 # 或手动构建 pyinstaller build_win.spec --clean # 构建所有内容 python scripts/build/build.py --all

安装包

# 从构建的包安装 pip install dist/book_downloader-1.0.0-py3-none-any.whl # 或从源码安装 pip install .

项目架构

技术特性

  • 模块化架构:代码拆分为多个模块,提高可读性和可维护性
  • 异步处理:使用asyncio实现高效的异步下载
  • 浏览器自动化:基于pydoll的浏览器自动化,支持JavaScript渲染
  • XPath解析:使用lxml进行精确的HTML解析
  • EPUB标准:完全符合EPUB 2.0标准,支持各种电子书阅读器
  • 错误处理:完善的错误处理和恢复机制
  • 进度显示:详细的下载进度和状态显示
  • 元数据管理:智能的章节信息存储和检索
  • 跨平台构建:支持Windows和macOS可执行文件构建
  • 智能构建系统:自动回退机制,确保构建成功

依赖包

  • pydoll-python:浏览器自动化
  • lxml:HTML/XML解析
  • asyncio:异步编程支持(Python内置)

模块架构

项目采用模块化设计,将原来的单一文件拆分为多个功能模块:

  • config.py:配置和常量管理
  • utils.py:通用工具函数
  • metadata.py:章节元数据管理
  • epub_generator.py:EPUB文件生成
  • core.py:核心下载功能(NovelDownloader类)
  • cli.py:命令行接口和参数解析
  • novel_downloader.py:主入口文件

这种设计提高了代码的可读性、可维护性和可扩展性。详细说明请参考 PROJECT_STRUCTURE.md

项目结构

book-downloader/ ├── src/ # 源代码目录 │ └── book_downloader/ # 主包 │ ├── __init__.py # 包初始化文件 │ ├── config.py # 配置和常量 │ ├── utils.py # 工具函数 │ ├── metadata.py # 元数据管理 │ ├── epub_generator.py # EPUB生成模块 │ ├── core.py # 核心下载功能 │ ├── cli.py # 命令行接口 │ └── scraper.py # 基础爬虫模块 ├── scripts/ # 可执行脚本 │ ├── book_downloader.py # 主入口脚本 │ └── scraper.py # 爬虫脚本 ├── tests/ # 测试目录 │ ├── __init__.py │ ├── conftest.py # 测试配置 │ ├── test_utils.py # 工具函数测试 │ └── test_config.py # 配置测试 ├── spec/ # 项目规范文档 │ ├── develop-logs/ # 开发日志 │ └── development-progress.md ├── chapters/ # 章节文件目录 │ ├── metadata/ # 元数据存储 │ │ └── chapters_<hash>.json # 章节元数据文件 │ ├── chapters_<hash>/ # 按元数据哈希组织的章节目录 │ │ └── *.html # 下载的章节文件 │ └── chapters_<other_hash>/ # 其他小说的章节目录 ├── temp/ # 临时文件目录 ├── setup.py # 安装脚本 ├── pyproject.toml # 现代Python项目配置 ├── build_win.spec # Windows PyInstaller配置 ├── build_macos.spec # macOS PyInstaller配置 ├── README.md # 说明文档 └── docs/ # 文档目录 ├── QUICK_START.md # 快速开始指南 ├── USAGE_GUIDE.md # 使用指南 └── PROJECT_STRUCTURE.md # 项目结构说明 

贡献

欢迎提交Issue和Pull Request来改进这个项目。

贡献指南

  1. Fork 本仓库
  2. 创建特性分支 (git checkout -b feature/amazing-feature)
  3. 提交更改 (git commit -m 'Add some amazing feature')
  4. 推送到分支 (git push origin feature/amazing-feature)
  5. 打开 Pull Request

支持

如果您遇到问题或有建议,请:

  1. 查看使用指南获取详细使用说明
  2. 查看项目结构了解项目架构
  3. 提交Issue描述您的问题

📄 许可证

本项目采用MIT许可证。

⚠️ 免责声明

本项目仅供学习和交流使用,严禁用于商业用途。

使用须知

  1. 学习目的:本项目仅用于技术学习和个人研究
  2. 禁止商用:严禁将本项目用于任何商业用途
  3. 遵守法律:使用者需遵守当地法律法规和网站使用条款
  4. 版权尊重:请尊重原网站和作者的版权,仅下载个人学习使用
  5. 风险自担:使用本工具产生的任何后果由使用者自行承担

法律声明

  • 本项目不承担因使用本工具而产生的任何法律责任
  • 使用者应当遵守目标网站的robots.txt和使用条款
  • 请合理使用,避免对目标网站造成过大负担
  • 如涉及版权问题,请立即停止使用并删除相关内容

请在使用前仔细阅读并同意以上条款。

About

一个功能强大的Web小说下载工具,支持从网站批量下载小说章节,并提供多种输出格式

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages