手把手爬取小说网站:Python 爬虫保存 txt 文件教程

在日常阅读中,很多人喜欢将喜欢的网络小说下载为本地 txt 文件,方便随时翻阅。今天就带大家手把手实现 Python 爬虫爬取小说网站,并将小说内容保存为 txt 文件,全程无复杂逻辑,新手也能轻松上手!

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

1. 安装 Python 环境

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

2. 安装必要库

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

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

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

bash

运行

pip install requests beautifulsoup4 

3. 选择目标小说网站

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

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

二、爬虫核心逻辑拆解

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

三、手把手编写爬虫代码

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

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

python

运行

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:伪装成浏览器访问,防止网站识别为爬虫而拒绝请求,可通过百度 “我的 User-Agent” 获取自己的浏览器标识。

第二步:爬取章节列表(标题 + 链接)

在上述代码后继续添加:

python

运行

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",).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),从而精准提取链接和标题。

第三步:爬取单个章节内容

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

python

运行

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",) 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_namearticle 等),需通过开发者工具确认。

第四步:保存内容到 txt 文件

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

python

运行

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 的风险。

第五步:主函数整合所有逻辑

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

python

运行

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() 方法删除广告标签,例如:python运行

# 假设广告标签是 的 div for ad in content_div.find_all("div", class_="ad"): ad.decompose() # 删除广告标签 

六、注意事项

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

Read more

【C/C++】一文带你彻底玩转C/C++中的指针!(万字解读,非常详细!适合初学者或老手回顾)

【C/C++】一文带你彻底玩转C/C++中的指针!(万字解读,非常详细!适合初学者或老手回顾)

目录 * 一、指针简介 * 二、指针入门 * 1.初见指针 * 2.指针的解引用 * 3.指针的类型 * 4.野指针和空指针 * (1)野指针 * (2)空指针 * 5.指针的简单应用 * 6.结构体与指针 * 三、指针进阶 * 1.指针与数组 * 2.指针的运算 * 3.常量指针与指针常量 * (1)常量指针 * (2)指针常量 * (3)总结 * 3.字符指针与字符串、字符数组 * 4.指针数组与数组指针 * (1)指针数组 * (2)数组指针 * (3)总结 * 5.函数指针和指针函数 * (1)函数指针

By Ne0inhk
华为OD机试双机位C卷:螺旋数字矩阵 (C/C++/Py/Java/Js/Go)

华为OD机试双机位C卷:螺旋数字矩阵 (C/C++/Py/Java/Js/Go)

螺旋数字矩阵 华为OD机试双机位C卷 - 华为OD上机考试2025年双机位C卷 100分题型 华为OD机试双机位C卷真题目录点击查看: 华为OD机试双机位C卷真题题库目录|机考题库 + 算法考点详解 题目描述 疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数n和行数m(0 < n ≤ 999,0 < m ≤ 999),从左上角的1开始,按照顺时针螺旋向内写方式,依次写出2,3…n,最终形成一个m行矩阵。 小明对这个矩阵有些要求: * 每行数字的个数一样多 * 列的数量尽可能少 * 填充数字时优先填充外部 * 数字不够时,使用单个*号占位 输入描述 输入一行,两个整数,空格隔开,依次表示n、m 输出描述 符合要求的唯一矩阵 示例1 输入 9 4 输出

By Ne0inhk

线段树学习笔记(c++)

一、什么是线段树? 线段树(Segment Tree)是一种的二叉树数据结构,基于分治思想,用于高效地处理区间操作。 二、线段树的优点 假设有一个数组 A,大小为 N。 操作类型普通数组前缀和数组线段树单点修改O(1)O(N) (需重建) 区间查询O(N)O(1)  普通数组:修改快,但求区间和慢(要遍历)。 前缀和:查询快,但只要修改一个数,整个前缀和数组都要更新。 线段树:修改和查询都很快,是一种完美的平衡。 三、线段树的结构原理 线段树的核心思想是分治 。 线段树的每一个节点都代表一个区间。 假设我们的数组长度为 4 [1, 2, 3, 4]: 根节点:存整个区间 [1, 4] 的和。 左子节点:

By Ne0inhk
【数据结构】二叉搜索树 C++ 简单实现:增删查改全攻略

【数据结构】二叉搜索树 C++ 简单实现:增删查改全攻略

目录 前言: 1、什么是二叉搜索树? 2、二叉搜索树性能分析 3、key类型二叉搜索树的实现 节点结构 类结构 3.1、插入 3.2、中序遍历 3.3、查找 3.4、删除 4、key_value类型二叉搜索树的实现 节点结构 类结构 4.1、构造函数 4.1.1 默认构造 4.1.2 拷贝构造 4.2、赋值重载 4.3、析构 4.4、插入 总结 前言: 今天这篇,

By Ne0inhk