使用 Python 爬虫下载网络小说去除广告干扰
前言
在闲暇时间阅读网络小说是一种常见的消遣方式,但在浏览网页版小说时,经常会被弹窗广告、侧边栏广告以及误触跳转等干扰体验。尤其是想要点击下一章时,不小心点击到广告链接会严重影响阅读流畅度。为了解决这一问题,我们可以利用 Python 编写一个简单的网络爬虫程序,将目标小说的章节内容抓取并保存为本地文本文件,从而实现无广告的离线阅读。

一、环境配置
在开始编写代码之前,需要确保开发环境满足以下要求:
- Python 版本:推荐使用 Python 3.7 及以上版本(本文基于 3.7.3 编写)。
- 集成开发环境 (IDE):建议使用 PyCharm 或 VS Code,便于代码调试与管理。
- 依赖库安装:
requests:用于发送 HTTP 请求。lxml:用于解析 HTML 文档,支持 XPath 查询。time:内置模块,用于控制请求频率,防止触发反爬机制。
安装命令如下:
pip install requests lxml
二、准备工作
- 创建项目目录:在电脑指定位置创建一个文件夹,用于存放爬取的小说文件和脚本代码。
- 确定目标网站:选择一个允许爬取的小说网站,获取其书籍详情页和章节页的 URL 结构。
- 分析页面结构:使用浏览器开发者工具(F12)查看 HTML 源码,定位小说名称、目录列表及正文内容的 DOM 节点路径(XPath)。无需额外安装插件,现代浏览器已内置强大的元素检查功能。
三、核心代码实现
以下是完整的爬虫脚本示例,包含异常处理与基础的反爬策略:
import requests
from lxml import etree
import time
import os
# 设置目标书籍的详情页 URL
target_url = 'https://www.biquge365.net/newbook/33411/'
# 设置请求头,模拟浏览器访问
headers = {
'Referer': 'https://www.biquge365.net/book/33411/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.39'
}
def fetch_novel_info(url):
"""获取小说基本信息和目录"""
try:
response = requests.get(url, headers=headers, verify=False)
response.encoding = response.apparent_encoding
html = etree.HTML(response.text)
# 提取小说名称
novel_name_list = html.xpath('/html/body/div[1]/div[3]/div[1]/h1/text()')
if not novel_name_list:
print("未找到小说名称")
return None, []
novel_name = novel_name_list[0].strip()
# 提取章节目录链接
chapter_links = html.xpath('/html/body/div[1]/div[4]/ul/li[*]/a/@href')
return novel_name, chapter_links
except Exception as e:
print(f"获取信息失败:{e}")
return None, []
def download_chapter(chapter_url, headers):
"""下载单个章节内容"""
try:
response = requests.get(chapter_url, headers=headers)
response.encoding = response.apparent_encoding
html = etree.HTML(response.text)
# 提取章节标题
title_list = html.xpath('//*[@id="neirong"]/h1/text()')
if not title_list:
return None, None
chapter_title = title_list[0]
# 提取正文内容
content_list = html.xpath('//*[@id="txt"]/text()')
content = '\n'.join(content_list)
return chapter_title, content
except Exception as e:
print(f"下载章节失败 {chapter_url}: {e}")
return None, None
def main():
# 获取小说信息
novel_name, chapters = fetch_novel_info(target_url)
if not novel_name or not chapters:
print("无法获取小说信息,请检查 URL 是否正确")
return
# 创建保存目录
save_dir = f"./novel_{novel_name}"
if not os.path.exists(save_dir):
os.makedirs(save_dir)
print(f"开始下载小说:{novel_name}")
for link in chapters:
# 拼接完整 URL
full_url = 'https://www.biquge365.net' + link
# 获取章节内容
title, content = download_chapter(full_url, headers)
if title and content:
file_path = os.path.join(save_dir, f"{title}.txt")
with open(file_path, 'w', encoding='utf-8') as f:
f.write(title + '\n\n' + content)
print(f"成功保存:{title}")
# 延时防止被封 IP
time.sleep(2)
if __name__ == '__main__':
main()
四、代码逻辑详解
- 请求头设置:
User-Agent字段至关重要,它告诉服务器我们使用的是浏览器而非脚本,降低被拦截风险。 - 编码处理:
response.encoding = response.apparent_encoding自动识别网页编码,避免中文乱码。 - XPath 解析:使用
lxml.etree快速定位 HTML 中的特定节点,例如通过//*[@id="txt"]定位正文容器。 - 反爬策略:在循环中插入
time.sleep(2),模拟人类阅读速度,避免短时间内大量请求触发服务器防火墙。 - 异常捕获:使用
try-except包裹网络请求和文件操作,确保单个章节失败不会导致整个程序崩溃。
五、结果展示
运行脚本后,会在当前目录下生成以小说名命名的文件夹,内部包含所有章节的 TXT 文件。打开任意文件即可在无广告环境下阅读。

六、注意事项与优化建议
1. 法律与道德规范
在使用爬虫技术时,请务必遵守目标网站的 robots.txt 协议,尊重版权,仅用于个人学习研究,严禁用于商业盈利或大规模分发盗版内容。
2. 通用性扩展
上述代码针对特定网站结构编写。若要适配其他小说网站,需重新分析其 HTML 结构,修改 XPath 表达式即可复用框架。
3. 进阶优化方向
- 多线程下载:使用
concurrent.futures加速章节下载过程。 - 数据库存储:将章节内容存入 SQLite 或 MySQL,便于检索和管理。
- 图形界面:结合
tkinter开发 GUI 工具,方便非技术人员使用。
4. 学习资源推荐
若希望深入学习 Python 编程与爬虫技术,建议参考官方文档、开源社区教程及经典技术书籍。保持对新技术的好奇心,持续实践是提升技能的关键。
结语
通过简单的 Python 脚本,我们成功实现了小说内容的本地化存储,彻底解决了网页广告干扰的问题。这不仅提升了阅读体验,也让我们掌握了网络数据采集的基本方法。希望本文能为你开启自动化办公或数据分析的大门。

