Python 爬虫项目实战:requests 静态网页文本提取与本地 TXT 存储

前言
在网络数据采集领域,静态网页爬虫是入门必备且应用最广泛的技术方向。requests 作为 Python 生态中最简洁、最高效的 HTTP 请求库,完美适配静态网页的数据获取需求,无需复杂配置即可快速发起网络请求、获取网页源码,结合基础文本处理能力,就能实现网页核心文本的提取与本地持久化存储。
本文将从零开始,深度讲解基于 requests 库的静态网页爬虫开发全流程,涵盖环境配置、请求原理、文本提取、异常处理、本地 TXT 存储等核心知识点,搭配完整可运行的实战案例、原理剖析与代码详解,帮助开发者掌握静态网页数据采集的核心技能。
本文涉及的核心工具与官方资源如下,读者可直接点击访问:
- requests 官方文档:权威的使用指南与 API 参考
- Python 官方网站:Python 环境安装与版本管理
- PyPI-requests 库:库的安装包与版本信息
本文全程采用无图片设计,所有逻辑、步骤、数据均通过文字、代码、表格清晰呈现,确保读者在任何阅读环境下都能完整理解内容,快速落地实战项目。
一、环境准备:requests 库安装与基础配置
1.1 Python 环境校验
requests 库依赖 Python 环境,在安装前需确认本地已配置 Python 环境。打开终端(Windows 为 CMD/PowerShell,Mac/Linux 为 Terminal),执行以下命令校验 Python 版本:
bash
运行
python --version
# 或 python3 --version
要求 Python 版本≥3.7,若未安装 Python,可访问上述 Python 官方网站,根据操作系统下载对应安装包,勾选 “Add Python to PATH” 完成环境变量配置。
1.2 requests 库安装
requests 是第三方库,需通过 pip 包管理器安装,终端执行以下命令:
bash
运行
pip install requests
# 国内网络可使用清华镜像加速安装
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
安装完成后,执行pip show requests命令,若显示库的版本、路径等信息,说明安装成功。
1.3 开发工具推荐
推荐使用 PyCharm、VS Code 作为开发工具,轻量化场景下也可使用 Python 自带 IDLE:
- PyCharm 官方下载:专业 Python 开发 IDE,自带调试、代码提示功能
- VS Code 官方下载:轻量级编辑器,安装 Python 插件即可使用
二、requests 核心原理:HTTP 请求与静态网页响应机制
2.1 HTTP 请求基础原理
HTTP(超文本传输协议)是客户端与服务器通信的标准规则,爬虫的本质是模拟浏览器向服务器发送 HTTP 请求,接收服务器返回的网页数据。
requests 库封装了 HTTP 的所有请求方法,静态网页采集最常用的是 GET 请求,其核心流程如下:
- 客户端(爬虫程序)通过 URL 定位目标服务器,发送 GET 请求,携带请求头、参数等信息;
- 服务器接收请求,解析 URL 与请求参数,查询对应的静态网页资源;
- 服务器将网页源码(HTML 文本)封装为 HTTP 响应,返回给客户端;
- 客户端接收响应,提取响应中的文本内容,完成数据采集。
2.2 静态网页核心特征
静态网页是指服务器直接返回固定的 HTML 文本,无需执行 JavaScript 代码即可获取完整数据的网页,核心特征如下:
- 网页源码包含所有展示数据,查看网页源代码即可看到目标文本;
- 响应速度快,无需客户端渲染,适配 requests 直接采集;
- URL 固定,无动态参数或参数简单,请求逻辑易于实现。
2.3 requests 响应对象核心属性
requests 发送请求后会返回一个 Response 对象,该对象包含服务器返回的所有数据,核心属性如下表所示:
表格
| 属性名称 | 作用说明 | 数据类型 |
|---|---|---|
| status_code | HTTP 响应状态码,判断请求是否成功 | int |
| text | 网页源码文本内容(自动解码) | str |
| content | 网页原始二进制数据 | bytes |
| encoding | 响应内容的编码格式 | str |
| url | 实际请求的 URL 地址 | str |
| headers | 响应头信息 | dict |
其中,status_code是请求成功的核心判断依据:200 表示请求成功,404 表示网页不存在,500 表示服务器错误,403 表示服务器拒绝访问。
三、requests 基础实战:发送请求获取静态网页源码
3.1 最简请求案例
以采集百度首页静态源码为例,编写最简爬虫代码,实现请求发送与源码获取:
python
运行
# 导入requests库
import requests
# 目标网页URL
url = "https://www.baidu.com"
# 发送GET请求,获取响应对象
response = requests.get(url)
# 打印响应状态码
print("响应状态码:", response.status_code)
# 打印网页源码文本
print("网页源码:", response.text)
代码原理剖析
import requests:导入 requests 库,调用其核心功能;url = "https://www.baidu.com":定义目标静态网页的 URL 地址,URL 是网络资源的唯一标识;requests.get(url):调用 GET 方法,向目标 URL 发送 HTTP 请求,返回 Response 响应对象;response.status_code:获取响应状态码,验证请求是否成功;response.text:自动根据服务器响应的编码格式解码二进制数据,返回字符串类型的网页源码。
3.2 请求头配置:模拟浏览器访问
部分网站会校验请求来源,直接发送请求会返回 403 错误,需配置请求头(Headers) 模拟浏览器访问。请求头的核心参数是User-Agent,用于标识客户端身份。
获取浏览器 User-Agent 的方法:打开浏览器,按 F12 进入开发者工具,切换到 Network 面板,刷新网页,点击任意请求,在 Request Headers 中找到 User-Agent 字段。
带请求头的请求代码:
python
运行
import requests
# 目标URL
url = "https://www.baidu.com"
# 配置请求头,模拟浏览器访问
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
}
# 发送带请求头的GET请求
response = requests.get(url, headers=headers)
# 打印结果
print("响应状态码:", response.status_code)
print("网页源码长度:", len(response.text))
代码原理剖析
headers字典:存储请求头参数,User-Agent是浏览器标识,让服务器认为请求来自真实浏览器;requests.get(url, headers=headers):将请求头作为参数传入 GET 方法,覆盖默认的请求头信息;- 该配置可解决绝大多数网站的基础反爬限制,保证请求成功。
3.3 编码处理:解决中文乱码问题
网页源码的编码格式不匹配时,response.text会出现中文乱码,requests 提供两种解决方案:
方案 1:手动指定编码格式
python
运行
import requests
url = "https://www.baidu.com"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}
response = requests.get(url, headers=headers)
# 手动设置编码格式(常见编码:utf-8, gbk, gb2312)
response.encoding = "utf-8"
# 也可自动识别编码
# response.encoding = response.apparent_encoding
print("修正编码后的源码:", response.text)
方案 2:使用二进制解码
python
运行
import requests
url = "https://www.baidu.com"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}
response = requests.get(url, headers=headers)
# 通过content获取二进制数据,手动解码为字符串
html = response.content.decode("utf-8", errors="ignore")
print("二进制解码后的源码:", html)
原理剖析
- 网页默认编码格式:中文网页常用
utf-8、gbk、gb2312,英文网页常用iso-8859-1; response.encoding:修改 requests 自动解码的编码格式,匹配网页实际编码;response.content.decode():对原始二进制数据手动解码,errors="ignore"表示忽略无法解码的字符,避免程序报错。
四、静态网页文本提取:核心方法与实战
静态网页文本提取是爬虫的核心环节,基于 requests 获取的 HTML 源码,通过字符串切片、关键词匹配、正则匹配三种方法,提取目标文本。本文先讲解基础方法,正则表达式将在后续专题深入讲解。
4.1 文本提取前置工作:定位目标文本
提取文本前,需先在网页源码中定位目标内容的位置,步骤如下:
- 打开目标静态网页,右键点击 “查看网页源代码”;
- 使用 Ctrl+F 搜索目标文本,记录文本前后的固定标识(标签、关键词、符号);
- 根据固定标识编写提取逻辑,确保精准定位。
4.2 方法一:字符串切片提取固定文本
适用于目标文本位置固定、前后标识唯一的场景,通过find()方法定位索引,再通过切片提取文本。
实战场景:提取百度首页的 “百度一下,你就知道” 核心文本。
python
运行
import requests
# 配置请求信息
url = "https://www.baidu.com"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}
response = requests.get(url, headers=headers)
response.encoding = "utf-8"
html = response.text
# 定位目标文本:找到前后固定标识的索引
start_flag = '<title>'
end_flag = '</title>'
start_index = html.find(start_flag) + len(start_flag)
end_index = html.find(end_flag)
# 切片提取文本
target_text = html[start_index:end_index]
print("提取的网页标题文本:", target_text)
代码原理剖析
html.find(flag):返回标识字符串在源码中第一次出现的索引位置;start_index + len(start_flag):跳过起始标识,定位到目标文本的起始位置;html[start_index:end_index]:Python 字符串切片语法,提取两个索引之间的文本内容。
4.3 方法二:关键词匹配提取批量文本
适用于目标文本包含固定关键词,需批量提取所有匹配内容的场景。
实战场景:提取网页源码中所有包含 “新闻” 的文本片段。
python
运行
import requests
# 获取网页源码
url = "https://www.baidu.com"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}
response = requests.get(url, headers=headers)
response.encoding = "utf-8"
html = response.text
# 关键词匹配提取
keyword = "新闻"
text_list = []
# 按行分割源码,逐行匹配关键词
for line in html.split("\n"):
if keyword in line.strip():
text_list.append(line.strip())
# 打印提取结果
print("包含关键词的文本片段:")
for text in text_list:
print(text)
代码原理剖析
html.split("\n"):将网页源码按换行符分割为列表,每一行作为一个元素;line.strip():去除文本首尾的空格、制表符等空白字符;if keyword in line:判断当前行是否包含目标关键词,匹配则加入结果列表。
4.4 方法三:基础正则表达式提取结构化文本
正则表达式是文本提取的高效工具,这里使用基础正则实现精准提取,完整语法将在后续专题讲解。
实战场景:提取网页中所有的超链接文本与 URL。
python
运行
import requests
import re
# 获取网页源码
url = "https://www.baidu.com"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}
response = requests.get(url, headers=headers)
response.encoding = "utf-8"
html = response.text
# 正则表达式匹配超链接<a href="url">文本</a>
pattern = r'<a href="(.*?)".*?>(.*?)</a>'
result = re.findall(pattern, html, re.S)
# 打印提取结果
print("提取的超链接数据:")
for url, text in result:
print(f"链接:{url},文本:{text}")
代码原理剖析
import re:导入 Python 内置正则表达式库;r'<a href="(.*?)".*?>(.*?)</a>':正则匹配规则,(.*?)表示非贪婪匹配,提取 href 属性和超链接文本;re.findall(pattern, html, re.S):全局匹配所有符合规则的内容,re.S表示匹配换行符,返回元组列表。
五、本地 TXT 存储:文本数据持久化实战
提取的文本数据需持久化存储,TXT 文件是最简洁的存储格式,Python 通过内置文件操作函数实现写入、追加、编码控制。
5.1 TXT 文件存储核心语法
Python 文件操作的核心函数:open(),语法格式:
python
运行
open(file_path, mode, encoding)
参数说明:
file_path:文件保存路径(相对路径 / 绝对路径);mode:文件打开模式,常用模式如下表:
表格
| 模式 | 作用说明 | 注意事项 |
|---|---|---|
| 'w' | 写入模式,覆盖原有内容 | 文件不存在则创建,存在则清空 |
| 'a' | 追加模式,在文件末尾添加内容 | 不会覆盖原有数据 |
| 'r' | 读取模式,仅读取文件内容 | 文件必须存在 |
| 'w+'/ 'a+' | 读写模式,同时支持读写 | 兼顾读取与写入需求 |
encoding:文件编码,统一使用utf-8避免中文乱码。
5.2 实战一:单条文本写入 TXT 文件
将提取的网页标题文本写入本地 TXT 文件:
python
运行
import requests
# 1. 获取网页源码并提取目标文本
url = "https://www.baidu.com"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}
response = requests.get(url, headers=headers)
response.encoding = "utf-8"
html = response.text
# 提取标题
start_index = html.find('<title>') + len('<title>')
end_index = html.find('</title>')
target_text = html[start_index:end_index]
# 2. 写入本地TXT文件
with open("网页标题.txt", "w", encoding="utf-8") as f:
f.write(target_text)
print("单条文本写入TXT文件成功!")
代码原理剖析
with open(...) as f:Python 上下文管理器,自动关闭文件,避免资源泄漏;f.write(target_text):将文本内容写入文件对象;- 执行完成后,在代码同级目录下会生成
网页标题.txt文件,包含提取的标题文本。
5.3 实战二:批量文本追加写入 TXT 文件
将批量提取的超链接数据追加写入 TXT 文件:
python
运行
import requests
import re
# 1. 提取批量目标文本
url = "https://www.baidu.com"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}
response = requests.get(url, headers=headers)
response.encoding = "utf-8"
html = response.text
# 正则提取超链接
pattern = r'<a href="(.*?)".*?>(.*?)</a>'
result = re.findall(pattern, html, re.S)
# 2. 批量追加写入TXT文件
with open("网页超链接数据.txt", "a", encoding="utf-8") as f:
f.write("网页超链接列表:\n")
f.write("-"*50 + "\n")
for link, text in result:
# 格式化写入,每条数据占一行
f.write(f"链接:{link} | 文本:{text}\n")
print("批量文本追加写入TXT文件成功!")
代码原理剖析
- 使用
"a"追加模式,多次运行代码不会覆盖原有文件内容,持续在末尾添加数据; - 格式化写入文本,添加分隔线、换行符,让文件内容更易读;
- 批量遍历提取结果,逐行写入,实现结构化存储。
5.4 实战三:完整爬虫流程:请求 - 提取 - 存储一体化
整合所有知识点,编写完整的静态网页爬虫,实现发送请求→提取核心文本→本地 TXT 存储全流程,以采集科普类静态网页为例:
python
运行
# -*- coding: utf-8 -*-
"""
完整爬虫流程:requests请求 + 文本提取 + TXT存储
目标:采集静态科普网页标题、正文核心文本,保存到本地TXT
"""
import requests
import re
def crawl_static_web(url, save_path):
"""
静态网页爬虫函数
:param url: 目标网页URL
:param save_path: TXT文件保存路径
"""
# 1. 配置请求头,模拟浏览器
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"
}
try:
# 2. 发送HTTP请求,设置超时时间(5秒)
response = requests.get(url, headers=headers, timeout=5)
# 校验响应状态码
if response.status_code != 200:
print(f"请求失败,状态码:{response.status_code}")
return
# 3. 处理编码,获取网页源码
response.encoding = response.apparent_encoding
html = response.text
# 4. 提取核心文本:标题 + 正文
# 提取网页标题
title_match = re.search(r'<title>(.*?)</title>', html, re.S)
title = title_match.group(1).strip() if title_match else "无标题"
# 提取正文文本(匹配p标签内容)
content_list = re.findall(r'<p.*?>(.*?)</p>', html, re.S)
# 清洗正文:去除HTML标签、空白字符
clean_content = []
for content in content_list:
# 去除标签
content = re.sub(r'<.*?>', '', content).strip()
if content:
clean_content.append(content)
content = "\n".join(clean_content)
# 5. 写入本地TXT文件
with open(save_path, "w", encoding="utf-8") as f:
f.write(f"网页标题:{title}\n\n")
f.write("网页正文:\n")
f.write("-"*60 + "\n")
f.write(content)
print(f"爬虫执行成功!数据已保存至:{save_path}")
except requests.exceptions.Timeout:
print("请求超时,请检查网络或URL")
except requests.exceptions.ConnectionError:
print("网络连接失败,请检查网络")
except Exception as e:
print(f"爬虫执行异常:{str(e)}")
# 主函数调用
if __name__ == "__main__":
# 目标静态科普网页URL
target_url = "https://www.kepuxiong.com/article/123.html"
# 保存文件路径
save_file = "科普文章数据.txt"
# 启动爬虫
crawl_static_web(target_url, save_file)
代码原理剖析
- 函数封装:将爬虫逻辑封装为函数,提高代码复用性,支持传入不同 URL 和保存路径;
- 异常处理:捕获超时、连接错误、通用异常,避免程序崩溃,提升稳定性;
- 文本清洗:使用正则去除 HTML 标签、空白字符,保证提取的文本纯净无冗余;
- 结构化存储:分标题、正文存储,添加分隔符,TXT 文件可读性更强;
- 超时设置:
timeout=5表示请求超过 5 秒未响应则终止,避免程序卡死。
六、异常处理:提升爬虫稳定性的核心手段
网络请求存在诸多不确定性(网络波动、URL 错误、服务器限制、超时等),必须添加异常处理机制,保证爬虫稳定运行。requests 库常见异常类型如下表:
表格
| 异常类型 | 触发场景 | 处理方案 |
|---|---|---|
| Timeout | 请求超时,服务器未在指定时间响应 | 设置合理超时时间,重试请求 |
| ConnectionError | 网络连接失败、DNS 查询失败 | 检查网络、URL 正确性 |
| InvalidURL | URL 格式错误 | 校验 URL 格式,补全协议头 |
| HTTPError | HTTP 响应错误(4xx/5xx 状态码) | 判断状态码,跳过错误链接 |
| RequestException | requests 通用异常 | 兜底处理,捕获所有未知错误 |
6.1 完整异常处理代码示例
python
运行
import requests
from requests.exceptions import Timeout, ConnectionError, HTTPError, RequestException
url = "https://www.baidu.com"
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}
try:
response = requests.get(url, headers=headers, timeout=3)
response.raise_for_status() # 主动抛出HTTP异常
print("请求成功")
except Timeout:
print("异常:请求超时")
except ConnectionError:
print("异常:网络连接失败")
except HTTPError:
print(f"异常:HTTP错误,状态码:{response.status_code}")
except RequestException as e:
print(f"异常:请求失败,原因:{str(e)}")
七、反爬规避:基础反爬策略与应对方案
7.1 静态网页常见反爬手段
- User-Agent 校验:服务器校验客户端身份,拒绝非浏览器请求;
- IP 封禁:短时间内频繁请求,服务器封禁 IP;
- 请求频率限制:限制单位时间内的请求次数;
- Referer 校验:校验请求来源页面,判断是否为站内跳转。
7.2 基础应对方案
- 固定配置请求头:必须携带
User-Agent,可选添加Referer、Accept等参数; - 控制请求频率:在请求之间添加延时,避免频繁请求,代码如下:
python
运行
import time
# 每次请求后延时1秒
time.sleep(1)
- 避免恶意采集:遵守网站
robots.txt协议,不采集禁止爬取的数据。
八、项目总结与扩展方向
8.1 本文核心知识点总结
本文完整覆盖了 requests 静态网页爬虫的全流程,核心知识点如下:
- 环境配置:Python 环境搭建、requests 库安装与校验;
- 核心原理:HTTP GET 请求机制、静态网页特征、Response 对象属性;
- 请求优化:请求头配置、编码处理、中文乱码解决;
- 文本提取:字符串切片、关键词匹配、正则表达式提取;
- 数据存储:TXT 文件写入 / 追加、编码控制、结构化存储;
- 稳定性优化:异常处理、反爬规避、超时控制。
8.2 项目扩展方向
基于本文基础,可进一步扩展爬虫功能:
- 批量采集:读取 URL 列表,循环采集多个静态网页,批量存储数据;
- 多线程采集:使用 threading 库提升采集效率;
- 结合 BeautifulSoup:下一篇专题将讲解使用 BeautifulSoup 优化标签筛选与文本提取;
- 数据导出:将文本数据导出为 CSV、Excel 等格式,适配数据分析场景;
- 日志记录:添加日志模块,记录爬虫运行状态与错误信息。
更多推荐



所有评论(0)