项目概述

NovelDownloadProgrammer 是一个功能完整的小说下载工具,专为8AReading网站设计,支持异步并发爬取小说章节、自动合并内容、实时进度显示等功能。该项目提供了两种使用方式:Web界面和GUI界面,满足不同用户的操作习惯。

在这里插入图片描述

项目结构

NovelDownloadProgrammer/
├── templates/
│   └── index.html        # Web界面模板
├── Novel_download_8AReading_v3.14.py  # 核心下载脚本
├── app.py                # Flask Web应用
├── novel_download_gui.py # Tkinter GUI应用
└── 小说下载器应用封面.jpeg  # 应用封面图片

核心功能模块

1. 异步并发爬取模块

核心实现:使用aiohttpasyncio实现异步并发下载,提高爬取效率。

async def download_all_chapters_async(chapter_list):
    # 初始化并发信号量
    semaphore = asyncio.Semaphore(CONCURRENT_LIMIT)
    # 批量创建异步任务并执行
    async with aiohttp.ClientSession() as session:
        tasks = [asyncio.create_task(bounded_task(url, idx)) for idx, url in enumerate(chapter_list, 1)]
        results = await asyncio.gather(*tasks)

特点

  • 支持并发限制(默认10个并发)
  • 自动重试机制(最大3次)
  • 实时进度显示
  • 耗时统计

2. 内容解析与处理模块

核心实现:使用BeautifulSoup解析HTML,支持Base64解密内容。

async def get_single_page_content_async(session, url):
    # 获取网页解析对象
    soup = await get_html_soup_async(session, url)
    # 正则匹配Base64加密字符串
    b64_match = re.search(r'str_decode\("(.+?)"\)', html_text)
    # Base64解码正文
    b64_str = b64_match.group(1)
    decoded_html = base64.b64decode(b64_str).decode("utf-8")
    # 提取纯文本并清洗格式
    content = BeautifulSoup(decoded_html, "html.parser").get_text()

特点

  • 支持Base64解密
  • 自动清洗文本格式
  • 处理分页内容合并

3. 目录爬取模块

核心实现:动态解析目录分页,获取所有章节链接。

def get_all_chapter_urls():
    # 解析select标签,获取所有分页option
    select_tag = main_soup.find("select", id="indexselect")
    if select_tag:
        options = select_tag.find_all("option")
        mulu_value = len(options)  # 总页数
    # 遍历所有目录分页
    for page in range(1, mulu_value + 1):
        url = BOOK_URL if page == 1 else f"{BOOK_URL.rsplit('.', 1)[0]}/{page}.html"

特点

  • 动态获取目录分页总数
  • 实时显示目录爬取进度
  • 自动提取小说标题

4. 文件处理模块

核心实现:单章节保存为独立TXT,最终自动合并。

async def merge_chapters(results, save_file):
    # 创建并写入总文件头部
    async with aiofiles.open(save_file, "w", encoding="utf-8") as f:
        # 遍历合并所有章节
        for idx, title, temp_file in results:
            if os.path.exists(temp_file):
                async with aiofiles.open(temp_file, "r", encoding="utf-8") as temp_f:
                    content = await temp_f.read()
                    await f.write(content)
                # 删除临时文件
                os.remove(temp_file)

特点

  • 自动清理临时文件
  • 按章节顺序合并
  • 美观的文件头部格式

界面实现

1. Web界面

技术栈:Flask + HTML + CSS + JavaScript

核心功能

  • 实时进度显示
  • SSE(Server-Sent Events)实时更新
  • 响应式设计
  • 美观的UI界面

关键实现

@app.route('/download_stream')
def download_stream():
    book_url = request.args.get('book_url')
    def generate():
        # 运行脚本并捕获输出
        process = subprocess.Popen(
            cmd,
            stdout=subprocess.PIPE,
            stderr=subprocess.STDOUT,
            text=True,
            cwd=os.path.dirname(__file__)
        )
        # 实时读取输出并发送
        while True:
            line = process.stdout.readline()
            if not line:
                break
            # 发送SSE事件
            yield f"data: {line.strip()}\n\n"
    return Response(generate(), mimetype='text/event-stream')

2. GUI界面

技术栈:Tkinter

核心功能

  • 直观的图形界面
  • 实时进度条
  • 输出信息展示
  • 线程隔离(避免界面卡顿)

关键实现

def download_task(self):
    try:
        # 重定向stdout到我们的输出函数
        class StdoutRedirector:
            def write(self, text):
                if text.strip():
                    self.gui.append_output(text.strip())
            def flush(self):
                pass
        redirector = StdoutRedirector()
        redirector.gui = self
        sys.stdout = redirector
        # 执行下载任务
        chapter_list = get_all_chapter_urls()
        results = asyncio.run(download_all_chapters_async(chapter_list))
        asyncio.run(merge_chapters(results, SAVE_FILE))
    finally:
        # 恢复原始stdout
        sys.stdout = original_stdout

技术亮点

  1. 异步并发:使用asyncioaiohttp实现高效的异步并发下载,大幅提升爬取速度
  2. 多界面支持:同时提供Web界面和GUI界面,满足不同用户需求
  3. 实时进度:通过SSE和线程技术实现实时进度显示
  4. 容错机制:实现了请求重试、异常捕获等容错机制
  5. 用户体验:美观的界面设计和流畅的操作体验
  6. 智能处理:自动提取小说标题、动态解析分页、自动合并内容

性能优化

  1. 并发控制:通过信号量限制并发数,避免对服务器造成过大压力
  2. 异步I/O:使用aiofiles进行异步文件操作,提高I/O效率
  3. 内存管理:单章节保存为临时文件,避免内存占用过大
  4. 网络优化:合理设置超时时间和重试机制

使用方法

Web界面

  1. 启动Flask应用:
    python app.py
    
  2. 打开浏览器访问 http://localhost:5000
  3. 输入小说目录页URL,点击"开始下载"按钮
  4. 等待下载完成,查看输出信息

GUI界面

  1. 运行GUI应用:
    python novel_download_gui.py
    
  2. 在输入框中填写小说目录页URL
  3. 点击"开始下载"按钮
  4. 查看进度条和输出信息

命令行

python Novel_download_8AReading_v3.14.py <小说目录页URL>

依赖项

  • Python 3.7+
  • aiohttp
  • beautifulsoup4
  • requests
  • flask
  • tkinter (Python标准库)

项目价值

  1. 学习价值:展示了异步编程、Web开发、GUI开发等多种技术的综合应用
  2. 实用价值:提供了一个功能完整的小说下载工具
  3. 技术参考:为类似的爬虫项目提供了参考实现

代码优化建议

  1. 异常处理增强:增加更详细的异常类型捕获和处理
  2. 配置外部化:将配置参数移至配置文件,方便用户修改
  3. 日志系统:实现更完善的日志系统,便于问题排查
  4. 多网站支持:扩展支持更多小说网站
  5. 缓存机制:实现缓存机制,避免重复请求

总结

NovelDownloadProgrammer 是一个设计合理、功能完整的小说下载工具,通过异步并发技术提高了下载效率,同时提供了友好的用户界面。该项目展示了如何将多种Python技术(异步编程、Web开发、GUI开发)结合起来,构建一个实用的应用程序。

该项目不仅具有实用价值,也是学习Python各种技术的优秀案例,特别是在异步编程和多界面实现方面。


项目地址:https://github.com/Silent-GitHub01/NovelDownloadProgrammer.git
开发环境:Python 3.7+, Windows
适用网站:8AReading (https://www.8ayd.com/)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐