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

Python 爬虫实战:抓取小说并保存为本地 TXT 文件

综述由AI生成使用 Python 的 requests 和 BeautifulSoup 库,通过模拟浏览器请求获取小说目录与章节内容。代码演示了如何解析 HTML 结构、处理编码乱码、控制爬取频率以及将文本保存为本地 TXT 文件。重点涵盖反爬策略应对(如 User-Agent 伪装、延时)及常见异常处理,强调遵守 robots.txt 协议与版权法规,实现自动化离线阅读。

猫巷少女发布于 2026/3/22更新于 2026/4/274 浏览

在日常阅读中,很多人喜欢将喜欢的网络小说下载为本地 txt 文件,方便随时翻阅。今天我们来聊聊如何用 Python 爬虫抓取小说网站,并将内容保存为本地 txt 文件。逻辑并不复杂,适合有一定基础的同学尝试。

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

1. 安装 Python 环境

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

2. 安装必要库

本次爬虫主要依赖两个核心库:

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

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

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

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

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

二、爬虫核心逻辑拆解

整个流程其实就三步:先访问目录页拿到所有章节链接,再逐个请求章节页提取正文,最后按顺序写入本地文件。这里的关键在于准确定位 HTML 结构,不同网站的标签可能差异很大。

三、手把手编写爬虫代码

新建一个 Python 文件(如 novel_crawler.py),我们直接看核心逻辑。

导入库与基础配置

首先导入必要的库,并设置好请求头。这里用 User-Agent 伪装成浏览器,防止被网站反爬机制直接拦截。

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"
}
爬取章节列表

接下来写个函数获取目录页里的章节标题和链接。这里要注意,HTML 结构是动态变化的,所以 find 方法里的参数需要根据实际网页调整,建议配合 F12 开发者工具查看。

def get_chapter_list():
    """获取所有章节的标题和链接"""
    :
        
        response = requests.get(catalog_url, headers=headers, timeout=)
        response.encoding = response.apparent_encoding  
        soup = BeautifulSoup(response.text, )
        
        
        
        chapter_list = soup.find(, class_=).find_all()
        
        
        chapters = []
         chapter  chapter_list:
            chapter_title = chapter.text
            chapter_url =  + chapter[]  
            chapters.append({: chapter_title, : chapter_url})
        
        ()
         chapters
     Exception  e:
        ()
         
try
# 发送请求获取目录页内容
10
# 自动识别编码,避免乱码
"html.parser"
# 定位章节列表(根据网站结构调整,可通过浏览器开发者工具查看)
# 示例中假设 div 下有 class="list",实际请根据 F12 确认
"div"
"list"
"a"
# 提取章节标题和链接,存入列表
for
in
"https://www.xsbiquge.com"
"href"
# 拼接完整链接
"title"
"url"
print
f"成功获取 {len(chapters)} 个章节"
return
except
as
print
f"获取章节列表失败:{e}"
return
None
爬取单个章节内容

有了链接后,我们需要把每一章的具体文字抓下来。这里同样要处理编码问题,并且清理掉多余的空白字符。

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")
        
        # 定位正文内容(示例网站正文在 id="content" 的 div 中,需根据实际情况调整)
        content_div = soup.find("div", id="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 "正文获取失败"
保存内容到 txt 文件

最后一步是把所有章节拼起来存成本地文件。这里加了 time.sleep 控制频率,这是为了防止请求过快触发反爬,也是基本的礼貌原则。

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}")
主函数整合

把所有功能串起来,跑一次试试。

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() 方法删除广告标签。
# 假设广告标签是 class="ad" 的 div
for ad in content_div.find_all("div", class_="ad"):
    ad.decompose()  # 删除广告标签

六、注意事项

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

目录

  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. 假设广告标签是 class="ad" 的 div
  21. 六、注意事项
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 基于 C++11 实现前端 Promise 模式
  • 合并两个 Git 仓库并保留完整提交历史
  • ToDesk 顺网云海马云 DeepSeek 模型部署体验对比
  • 基于 GeoTools 和 SpringBoot 的省域驾车最快路线生成实践
  • 大模型分布式训练与高效调参技术实战
  • 使用 Web Unlocker API 高效抓取亚马逊数据
  • Seedance 2.0 双分支扩散变换器架构解析与工程实现
  • C++微服务架构下的好友管理子服务设计与实现
  • Flutter 使用 React 风格库在 OpenHarmony 上的适配与实践
  • 渗透测试基本流程详解:从信息收集到报告撰写
  • Hunyuan-MT-7B WebUI 部署后网页无法访问的排查与解决
  • 无人机遥感滑坡与泥石流图像识别数据集
  • 强化学习 SAC 算法原理与 PyTorch 实现
  • 停车管理系统 APP 前端设计与实现
  • 使用 SCP 命令在 Windows 与 Linux 系统间传输文件
  • 区块链:时间长河共识算法(Time River Consensus Algorithm)
  • 通义万相 2.1 视频生成模型部署与特性解析
  • SpringBoot 整合 LangChain4j AIService 深度使用详解
  • 系统分析师:通信与网络安全及系统访问控制技术
  • AI 时代细胞生物学最新进展综述

相关免费在线工具

  • 加密/解密文本

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

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,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