跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表

目录

  1. 一、前期准备:环境与工具
  2. 1. 安装 Python 环境
  3. 2. 安装必要库
  4. 3. 选择目标小说网站
  5. 二、爬虫核心逻辑拆解
  6. 三、手把手编写爬虫代码
  7. 第一步:导入库并设置基础参数
  8. 目标小说目录页 URL(可替换为自己想爬的小说目录页)
  9. 请求头:模拟浏览器访问,避免被网站反爬
  10. 第二步:爬取章节列表(标题 + 链接)
  11. 第三步:爬取单个章节内容
  12. 第四步:保存内容到 txt 文件
  13. 第五步:主函数整合所有逻辑
  14. 四、运行爬虫并查看结果
  15. 五、常见问题与解决方案
  16. 1. 乱码问题
  17. 2. 无法获取章节或正文
  18. 3. 被网站封禁 IP
  19. 4. 爬取到的内容有广告
  20. 假设广告标签是 div.ad
  21. 六、注意事项
Python算法

Python 爬虫爬取小说并保存为 TXT 文件教程

使用 Python 的 requests 和 BeautifulSoup 库爬取网络小说目录及章节内容,并将结果保存为本地 TXT 文件。流程包括环境配置、代码编写、反爬策略处理及常见问题解决,适用于学习网页数据采集技术。

神经兮兮发布于 2026/2/80 浏览

本教程演示如何使用 Python 爬虫将网络小说下载为本地 TXT 文件,涵盖环境配置、代码编写及常见问题处理。

一、前期准备:环境与工具

1. 安装 Python 环境

确保电脑已安装 Python(推荐 3.7 及以上版本),可通过 Python 官网 下载安装。安装时记得勾选 'Add Python to PATH'(自动配置环境变量)。

2. 安装必要库

本次爬虫需要用到两个核心库:

  • requests:用于发送 HTTP 请求,获取网页内容;
  • BeautifulSoup4:用于解析 HTML 页面,提取小说章节和内容。

打开命令行(Win+R 输入 cmd,Mac 打开终端),输入以下命令安装:

pip install requests beautifulsoup4
3. 选择目标小说网站

本次以免费小说测试网站(示例:https://www.xsbiquge.com/15_15338/,仅用于教学,请勿爬取付费或有版权保护的网站)为例,爬取小说《诡秘之主》的正文内容。

注意:爬取前需遵守网站 robots.txt 协议(访问网站域名 + /robots.txt 可查看),且不得用于商业用途,尊重版权方权益。

二、爬虫核心逻辑拆解

  1. 访问小说目录页,获取所有章节的标题和跳转链接;
  2. 逐个访问章节链接,提取章节正文内容;
  3. 将章节标题 + 正文按顺序写入 txt 文件,保存到本地。

三、手把手编写爬虫代码

第一步:导入库并设置基础参数

新建一个 Python 文件(如 novel_crawler.py),写入以下代码:

import requests
from bs4 import BeautifulSoup
import time

# 目标小说目录页 URL(可替换为自己想爬的小说目录页)
catalog_url = "https://www.xsbiquge.com/15_15338/"

# 请求头:模拟浏览器访问,避免被网站反爬
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
  • User-Agent:伪装成浏览器访问,防止网站识别为爬虫而拒绝请求,可通过浏览器开发者工具获取自己的浏览器标识。
第二步:爬取章节列表(标题 + 链接)

在上述代码后继续添加:

def get_chapter_list():
    """获取所有章节的标题和链接"""
    try:
        # 发送请求获取目录页内容
        response = requests.get(catalog_url, headers=headers, timeout=10)
        response.encoding = response.apparent_encoding  # 自动识别编码,避免乱码
        soup = BeautifulSoup(response.text, "html.parser")
        
        # 解析 HTML
        # 定位章节列表(根据网站结构调整,可通过浏览器开发者工具查看)
        chapter_list = soup.find("div", class_="list").find_all("a")
        
        # 提取章节标题和链接,存入列表
        chapters = []
        for chapter in chapter_list:
            chapter_title = chapter.text  # 章节标题
            chapter_url = "https://www.xsbiquge.com" + chapter["href"]  # 章节完整链接(拼接域名)
            chapters.append({"title": chapter_title, "url": chapter_url})
        
        print(f"成功获取 {len(chapters)} 个章节")
        return chapters
    except Exception as e:
        print(f"获取章节列表失败:{e}")
        return None
  • 关键步骤:通过浏览器开发者工具(F12)查看章节列表的 HTML 结构,找到对应的标签(如 div.list a),从而精准提取链接和标题。
第三步:爬取单个章节内容

添加提取章节正文的函数:

def get_chapter_content(chapter_url):
    """根据章节链接,提取正文内容"""
    try:
        response = requests.get(chapter_url, headers=headers, timeout=10)
        response.encoding = response.apparent_encoding
        soup = BeautifulSoup(response.text, "html.parser")
        
        # 定位正文内容(同样根据网站结构调整,示例网站正文在 div.content 中)
        content_div = soup.find("div", class_="content")
        if not content_div:
            return "正文获取失败"
        
        # 提取正文文本,去除多余空格和换行
        content = content_div.text.strip()
        # 替换网站自带的换行符(根据实际情况调整)
        content = content.replace("\n\n", "\n").replace(" ", " ")
        return content
    except Exception as e:
        print(f"获取章节内容失败:{e}")
        return "正文获取失败"
  • 注意:不同网站的正文标签可能不同(如 div.class_name、article 等),需通过开发者工具确认。
第四步:保存内容到 txt 文件

添加保存文件的函数,将所有章节按顺序写入:

def save_to_txt(chapters, novel_name="诡秘之主"):
    """将所有章节内容保存为 txt 文件"""
    # 拼接保存路径(默认保存在当前文件夹,文件名为小说名)
    file_path = f"{novel_name}.txt"
    with open(file_path, "w", encoding="utf-8") as f:
        for i, chapter in enumerate(chapters, 1):
            title = chapter["title"]
            url = chapter["url"]
            print(f"正在爬取第 {i}/{len(chapters)} 章:{title}")
            
            # 获取正文
            content = get_chapter_content(url)
            
            # 写入文件(标题 + 正文,换行分隔)
            f.write(f"【{title}】\n\n{content}\n\n")
            
            # 延迟 1-2 秒,避免请求过快被反爬
            time.sleep(1.5)
    print(f"\n小说已成功保存到:{file_path}")
  • encoding="utf-8":确保中文内容正常显示,避免乱码;
  • time.sleep(1.5):控制爬取速度,模拟人类浏览行为,降低被封 IP 的风险。
第五步:主函数整合所有逻辑

最后添加主函数,调用上述功能:

if __name__ == "__main__":
    # 1. 获取章节列表
    chapters = get_chapter_list()
    if not chapters:
        print("爬取失败,退出程序")
        exit()
    
    # 2. 保存到 txt 文件
    save_to_txt(chapters)

四、运行爬虫并查看结果

  1. 保存 novel_crawler.py 文件;
  2. 打开命令行,切换到文件所在目录(如 cd Desktop);
  3. 运行命令:python novel_crawler.py;
  4. 等待爬取完成,当前文件夹会生成 诡秘之主.txt 文件,打开即可查看完整小说。

五、常见问题与解决方案

1. 乱码问题
  • 原因:编码识别错误;
  • 解决:将 response.encoding = response.apparent_encoding 替换为指定编码(如 response.encoding = "gbk" 或 utf-8),可通过查看网站源码的 <meta charset> 标签确认编码。
2. 无法获取章节或正文
  • 原因:网站结构变更,标签选择器失效;
  • 解决:重新通过浏览器开发者工具(F12)查看最新的 HTML 结构,调整 find() 或 find_all() 中的参数(如标签名、id、class)。
3. 被网站封禁 IP
  • 原因:请求速度过快,被反爬机制识别;
  • 解决:
    • 增加 time.sleep() 的延迟时间(如 2-3 秒);
    • 使用代理 IP(需额外配置 proxies 参数);
    • 更换 User-Agent,模拟不同浏览器。
4. 爬取到的内容有广告
  • 原因:正文区域包含广告标签;
  • 解决:使用 decompose() 方法删除广告标签,例如:
# 假设广告标签是 div.ad
for ad in content_div.find_all("div", class_="ad"):
    ad.decompose()  # 删除广告标签

六、注意事项

  1. 本教程仅用于学习交流,请勿爬取付费小说、有版权保护的内容,否则可能违反法律法规;
  2. 爬取前务必查看网站的 robots.txt 协议,遵守网站的爬取规则;
  3. 控制爬取速度,避免给目标网站服务器造成压力;
  4. 部分网站可能有更复杂的反爬机制(如登录验证、JS 加密),需额外处理(如使用 Selenium 模拟登录、解析 JS 数据)。
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog

更多推荐文章

查看全部
  • Rust + LLM 开发实战:构建智能命令行运维助手
  • 分库分表避坑指南:垂直分库与水平分表策略及分片键选择
  • Antigravity Tools 基于 Rust+Tauri 的 AI 工作流重构实践
  • WebLogic 简介与登录方法指南
  • TI AFE5816:16 通道超声波模拟前端 (AFE) 深度详解
  • IntelliJ IDEA 项目配置与 Web 部署完全指南
  • 使用 Ollama、Open WebUI 和 Docker 本地部署可视化 AI 大语言模型
  • Sora2 API 调用实践及开源前端接入示例
  • 基于 Leaflet 和天地图的长沙市免费运动场所 WebGIS 可视化
  • SeaTunnel Web 可视化数据集成平台教程
  • Ubuntu/Debian 下 libwebkit2gtk-4.1-0 的 APT 安装指南
  • Figma Make 实测:AI 能否辅助完成前端开发
  • CSS 基础语法、选择器及常用属性指南
  • Web-Check 与 cpolar 实现异地远程访问网站检测工具
  • Clawdbot 部署指南:反向代理与 WebAuth 配置
  • Android WebView 版本升级方案详解
  • 机器学习中的逻辑回归
  • IntelliJ IDEA 打包 Web 项目 WAR 包及 Tomcat 部署指南
  • 全栈分页方案:MyBatisPlus 与 Thymeleaf 整合实现
  • 华为交换机首次开局配置步骤:Console 连接与 Web 管理

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online