Python爬虫实战:批量获取小说内容并保存为TXT文件的全流程指南

一、项目背景与目标

在数字阅读场景中,用户常面临付费内容限制、广告干扰等问题。通过Python爬虫技术,可实现小说内容的自动化采集与本地化存储,满足以下需求:

  1. 突破平台付费墙限制
  2. 消除阅读过程中的广告干扰
  3. 建立个人电子书库
  4. 锻炼网络爬虫开发能力

本方案采用通用技术栈实现,不依赖特定平台API,适用于大多数小说类网站。核心流程包括:目标页面分析→请求发送→内容解析→数据清洗→文件存储。

二、技术准备与环境配置

2.1 开发环境要求

  • Python 3.6+(推荐3.8+版本)
  • 第三方库:requests(HTTP请求)、BeautifulSoup(HTML解析)、re(正则匹配)、time(延迟控制)
  • 开发工具:任意文本编辑器或IDE(如VS Code、PyCharm)

2.2 依赖安装

通过pip安装所需库:

  1. pip install requests beautifulsoup4

三、核心实现步骤

3.1 目标页面分析

以某小说网站为例,通过浏览器开发者工具分析:

  1. 章节列表URL规律(如/book/123/chapter/456
  2. 章节内容所在HTML标签(通常为<div>
  3. 翻页机制(静态链接或动态加载)

3.2 基础爬虫框架

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import re
  4. import time
  5. def get_chapter_content(url):
  6. """获取单章节内容"""
  7. headers = {
  8. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
  9. }
  10. try:
  11. response = requests.get(url, headers=headers, timeout=10)
  12. response.raise_for_status()
  13. soup = BeautifulSoup(response.text, 'html.parser')
  14. # 定位内容区域(根据实际网站结构调整)
  15. content_div = soup.find('div', {'id': 'content'})
  16. if content_div:
  17. # 清洗文本内容
  18. text = content_div.get_text(separator='\n', strip=True)
  19. # 移除多余空行
  20. clean_text = re.sub(r'\n{3,}', '\n\n', text)
  21. return clean_text
  22. return None
  23. except Exception as e:
  24. print(f"获取章节失败: {e}")
  25. return None

3.3 批量采集实现

  1. def download_novel(base_url, chapter_urls, book_name):
  2. """批量下载小说章节"""
  3. all_content = []
  4. for i, url in enumerate(chapter_urls, 1):
  5. print(f"正在下载第{i}章...")
  6. content = get_chapter_content(url)
  7. if content:
  8. all_content.append(content)
  9. time.sleep(1) # 礼貌性延迟
  10. else:
  11. print(f"第{i}章下载失败")
  12. # 保存为TXT文件
  13. if all_content:
  14. with open(f"{book_name}.txt", 'w', encoding='utf-8') as f:
  15. f.write('\n\n'.join(all_content))
  16. print(f"小说《{book_name}》下载完成!")
  17. else:
  18. print("未获取到有效内容")

3.4 完整调用示例

  1. if __name__ == "__main__":
  2. # 示例配置(需根据实际网站调整)
  3. BOOK_NAME = "示例小说"
  4. BASE_URL = "https://example.com/book/123"
  5. CHAPTER_URLS = [
  6. f"{BASE_URL}/chapter/{i}" for i in range(1, 21) # 假设前20章
  7. ]
  8. download_novel(BASE_URL, CHAPTER_URLS, BOOK_NAME)

四、进阶优化技巧

4.1 反爬策略应对

  1. User-Agent轮换:维护UA池随机切换
  2. 代理IP使用:通过代理池降低被封风险
  3. 请求频率控制:采用指数退避算法
    ```python
    import random

def get_random_headers():
“””生成随机请求头”””
uas = [
‘Mozilla/5.0 (Windows NT 10.0; Win64; x64)…’,
‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)…’
]
return {‘User-Agent’: random.choice(uas)}

  1. #### 4.2 数据持久化方案
  2. 1. **本地存储**:TXT/JSON格式
  3. 2. **数据库存储**:SQLite轻量级方案
  4. ```python
  5. import sqlite3
  6. def save_to_db(book_name, chapters):
  7. """存储到SQLite数据库"""
  8. conn = sqlite3.connect('novels.db')
  9. c = conn.cursor()
  10. c.execute('''CREATE TABLE IF NOT EXISTS books
  11. (name TEXT PRIMARY KEY, content TEXT)''')
  12. c.execute("INSERT OR REPLACE INTO books VALUES (?, ?)",
  13. (book_name, '\n\n'.join(chapters)))
  14. conn.commit()
  15. conn.close()

4.3 异常处理增强

  1. from requests.exceptions import RequestException, Timeout
  2. def safe_request(url):
  3. """带重试机制的请求"""
  4. max_retries = 3
  5. for _ in range(max_retries):
  6. try:
  7. return requests.get(url, timeout=10)
  8. except (Timeout, RequestException):
  9. time.sleep(2)
  10. raise Exception("请求超时")

五、法律与道德规范

  1. 版权合规:仅采集具有合法授权的内容
  2. robots协议:检查目标网站的/robots.txt文件
  3. 使用限制:避免高频请求影响网站正常运行
  4. 数据用途:严格限定于个人学习研究

六、扩展应用场景

  1. 多源内容聚合:整合多个小说站点资源
  2. 自动化更新:定时检查新章节并追加下载
  3. 格式转换:扩展支持EPUB/MOBI等电子书格式
  4. 阅读辅助:开发简易阅读器支持书签/笔记功能

七、常见问题解决

  1. 内容获取为空:检查CSS选择器是否匹配最新页面结构
  2. 编码错误:显式指定response.encoding = 'utf-8'
  3. 登录限制:研究Cookie/Session机制或使用Selenium
  4. 动态加载:结合Selenium或分析XHR请求

本方案通过模块化设计实现核心功能,开发者可根据实际需求进行组合扩展。建议新手从基础版本开始,逐步添加异常处理、反爬策略等高级功能,最终构建稳健的爬虫系统。