Python 爬虫实战进阶:自定义请求头 UA 伪装浏览器访问网页

前言
在 Python 爬虫开发过程中,服务器对爬虫程序的识别与拦截是开发者必须解决的核心问题之一。多数网站会通过检测 HTTP 请求头中的 User-Agent(简称 UA)字段,判断访问来源是否为合法浏览器,非浏览器 UA 会直接被拒绝访问或返回异常数据。因此,UA 伪装是爬虫入门到进阶的必备技能,也是实现稳定、合规数据爬取的基础保障。
本文将从基础理论、环境配置、实战案例、原理剖析、优化方案全维度讲解自定义请求头与 UA 伪装技术,帮助开发者掌握浏览器伪装核心逻辑,规避基础反爬机制,实现稳定的网页访问与数据爬取。
本文涉及的核心依赖库与官方资源如下:
- requests 库官方文档:Python 最常用的 HTTP 请求库,用于发送网络请求、自定义请求头;
- Python 官方下载地址:爬虫开发基础环境,建议安装 3.8 及以上版本;
- Fake User-Agent 库官方文档:自动生成随机浏览器 UA 的第三方库,提升爬虫伪装效果;
- HTTP 请求头官方规范:HTTP 协议请求头标准定义,辅助理解 UA 与请求头原理。
本文全程采用实战化教学,包含完整可运行代码、逐行原理解析、异常处理方案,覆盖单机爬虫基础伪装全场景,适合爬虫初学者、基础开发者学习与实践。
一、爬虫请求头与 UA 伪装核心基础
1.1 HTTP 请求头核心概念
HTTP(超文本传输协议)是爬虫与网页服务器通信的基础协议,客户端向服务器发送请求时,会携带请求头(Request Headers) 信息,用于告知服务器客户端的设备类型、浏览器版本、支持的编码格式、访问来源等关键信息。
请求头由多个键值对组成,常见字段包括:
User-Agent:客户端身份标识,核心伪装字段;Accept:客户端可接收的响应数据类型;Accept-Encoding:支持的数据压缩格式;Accept-Language:客户端偏好的语言;Referer:当前请求的来源页面;Connection:连接管理方式。
服务器通过解析这些字段,决定是否响应请求、返回何种数据,这也是反爬机制的核心检测点。
1.2 User-Agent(UA)定义与作用
User-Agent 是请求头中最核心的字段,是服务器识别访问者身份的关键依据,其标准格式为:
plaintext
浏览器标识/版本 (操作系统; CPU类型; 浏览器引擎) 浏览器内核标识/版本 页面渲染引擎/版本
示例:Chrome 浏览器 UA
plaintext
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
服务器通过 UA 字段判断访问者是人类使用的浏览器,还是自动化爬虫程序:
- 合法浏览器 UA:服务器正常返回网页数据;
- 爬虫默认 UA(如 requests 库默认 UA:
python-requests/2.31.0):服务器直接拦截,返回 403 Forbidden、空白页面或验证码。
1.3 UA 伪装的核心意义
- 突破基础反爬:伪装成合法浏览器,绕过服务器的 UA 检测机制;
- 保证数据完整性:避免因身份识别失败导致的页面数据缺失、乱码问题;
- 提升爬虫稳定性:降低被服务器封禁 IP 的风险,实现长期稳定爬取;
- 适配网页渲染:部分网页会根据 UA 返回不同的页面结构,伪装后可匹配目标页面结构。
1.4 爬虫合规性说明
本文仅用于技术学习与研究,爬虫使用需严格遵守《网络安全法》《计算机信息网络国际联网安全保护管理办法》,爬取公开、非敏感数据,禁止爬取受版权保护、隐私数据,遵守网站robots.txt协议,合理控制爬取频率,避免对服务器造成压力。
二、开发环境配置与依赖库安装
2.1 基础环境要求
- 操作系统:Windows 10 及以上、macOS、Linux 均可;
- Python 版本:3.8 ~ 3.12(稳定兼容版本);
- 开发工具:PyCharm、VS Code 等任意 Python 编辑器。
2.2 核心依赖库安装
本文需要两个核心库,分别用于发送 HTTP 请求和生成随机 UA,安装命令如下:
2.2.1 requests 库安装
requests 是 Python 生态中最简洁、高效的 HTTP 请求库,替代原生urllib库,支持自定义请求头、超时设置、会话保持等功能,是爬虫开发的首选库。 安装命令(CMD/Terminal 执行):
bash
运行
pip install requests
验证安装:打开 Python 交互环境,输入import requests无报错则安装成功。
2.2.2 fake-useragent 库安装
手动编写 UA 容易重复且繁琐,fake-useragent库可自动生成主流浏览器(Chrome、Firefox、Safari、Edge)的随机 UA,大幅提升伪装效果。 安装命令:
bash
运行
pip install fake-useragent
2.3 依赖库版本兼容性说明
为避免版本冲突,推荐固定安装稳定版本,命令如下:
bash
运行
# 安装稳定版requests
pip install requests==2.31.0
# 安装稳定版fake-useragent
pip install fake-useragent==1.4.0
三、自定义请求头 UA 伪装基础实现
3.1 静态 UA 伪装(基础方案)
静态 UA 伪装是指手动编写固定的浏览器 UA,写入请求头中发送请求,是最简单、最基础的伪装方式,适合入门学习、小规模爬取场景。
3.1.1 核心实现步骤
- 导入 requests 库;
- 手动定义合法浏览器 UA;
- 构建请求头字典,将 UA 写入
User-Agent字段; - 发送 GET 请求,携带自定义请求头;
- 解析响应结果,验证伪装效果。
3.1.2 完整代码实现
python
运行
# 导入核心请求库
import requests
# 1. 目标爬取网页(选择公开无强反爬的测试页面)
target_url = "https://www.baidu.com"
# 2. 自定义静态请求头:核心为User-Agent伪装
headers = {
# 手动填写Chrome浏览器的UA
"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/avif,image/webp,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "keep-alive"
}
# 3. 发送GET请求,携带自定义请求头
try:
# timeout=10:设置10秒超时,避免请求卡死
response = requests.get(url=target_url, headers=headers, timeout=10)
# 自动识别网页编码,解决中文乱码问题
response.encoding = response.apparent_encoding
# 4. 验证响应结果
print("=" * 50)
print(f"请求状态码:{response.status_code}")
print(f"响应数据长度:{len(response.text)} 字符")
print(f"当前使用的UA:{headers['User-Agent']}")
print("=" * 50)
# 状态码200表示请求成功,伪装生效
if response.status_code == 200:
print("✅ UA伪装成功,服务器正常响应数据!")
else:
print("❌ 请求失败,服务器未正常响应!")
# 异常处理:捕获网络错误、超时错误
except requests.exceptions.RequestException as e:
print(f"❌ 请求发生异常:{str(e)}")
3.1.3 代码原理深度剖析
- 库导入:
import requests引入 HTTP 请求核心库,所有网络请求基于该库实现; - 目标 URL:指定需要访问的网页地址,本文使用百度首页作为测试地址,公开无反爬限制;
- 请求头构建:
User-Agent:手动填写 Chrome 浏览器的真实 UA,是伪装核心;- 补充
Accept、Accept-Language等字段:模拟真实浏览器的请求行为,避免仅伪装 UA 被识别;
- 请求发送:
requests.get()方法接收三个核心参数:url:目标网页地址;headers:自定义请求头,服务器会优先解析该字段;timeout:超时设置,防止网络卡顿导致程序无限等待;
- 编码处理:
response.encoding = response.apparent_encoding自动识别网页编码,解决中文乱码; - 响应验证:HTTP 状态码
200代表请求成功,证明 UA 伪装生效; - 异常处理:捕获网络超时、连接失败等所有请求异常,提升程序健壮性。
3.1.4 静态 UA 伪装优缺点
表格
| 优点 | 缺点 |
|---|---|
| 实现简单,代码量少 | UA 固定,频繁爬取易被服务器识别 |
| 无需额外依赖,入门友好 | 无法适配多浏览器、多设备场景 |
| 适合小规模、一次性爬取 | 维护成本高,需手动更新 UA |
3.2 动态随机 UA 伪装(进阶方案)
静态 UA 的固定性容易被服务器的流量分析机制识别,动态随机 UA 伪装通过fake-useragent库自动生成随机 UA,每次请求使用不同的浏览器 UA,完美模拟真实用户的访问行为,是中大规模爬虫的首选方案。
3.2.1 核心实现步骤
- 导入
requests和fake_useragent库; - 初始化
FakeUserAgent对象,生成随机 UA; - 构建动态请求头,每次请求自动替换 UA;
- 发送请求,验证随机 UA 效果;
- 批量测试,验证伪装稳定性。
3.2.2 完整代码实现
python
运行
# 导入核心库
import requests
from fake_useragent import FakeUserAgent
# 初始化随机UA生成器
ua = FakeUserAgent()
# 目标测试URL
target_url = "https://www.baidu.com"
# 批量测试10次随机UA伪装效果
for i in range(1, 11):
try:
# 1. 动态生成随机UA(支持chrome、firefox、safari、edge等参数)
random_ua = ua.chrome # 随机生成Chrome浏览器UA
# random_ua = ua.random # 生成全平台随机UA
# 2. 构建动态请求头
headers = {
"User-Agent": random_ua,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive"
}
# 3. 发送请求
response = requests.get(url=target_url, headers=headers, timeout=10)
response.encoding = response.apparent_encoding
# 4. 输出每次请求结果
print(f"第{i}次请求")
print(f"随机UA:{random_ua}")
print(f"状态码:{response.status_code}")
print("-" * 60)
except Exception as e:
print(f"第{i}次请求异常:{str(e)}")
continue
3.2.3 代码原理深度剖析
- 随机 UA 生成器:
FakeUserAgent()初始化对象,内置海量主流浏览器 UA 库; - UA 生成方式:
ua.chrome:仅生成 Chrome 浏览器 UA,针对性伪装;ua.firefox:仅生成火狐浏览器 UA;ua.random:生成全平台(手机、电脑、多浏览器)随机 UA,伪装效果最强;
- 动态请求头:每次循环都会重新生成 UA,确保每次请求身份唯一;
- 批量测试:循环 10 次请求,验证随机 UA 的稳定性,模拟真实用户多次访问场景;
- 异常跳过:单次请求失败不影响整体程序,提升容错率。
3.2.4 动态 UA 伪装优缺点
表格
| 优点 | 缺点 |
|---|---|
| UA 随机生成,无法被简单识别 | 首次使用需联网加载 UA 库 |
| 支持多浏览器、多设备伪装 | 极端网络环境下可能生成失败 |
| 无需手动维护 UA,降低维护成本 | 需额外安装第三方库 |
| 适合中大规模、长期爬虫项目 | 无 |
3.3 无 UA 伪装的错误演示(对比验证)
为直观验证 UA 伪装的必要性,我们编写无 UA 伪装的代码,观察服务器响应结果:
python
运行
import requests
# 不携带任何请求头,使用requests默认UA
response = requests.get("https://www.baidu.com", timeout=10)
print(f"状态码:{response.status_code}")
print(f"默认UA:{response.request.headers['User-Agent']}")
运行结果:
plaintext
状态码:200
默认UA:python-requests/2.31.0
说明:百度首页对基础爬虫兼容,但绝大多数网站会直接返回 403 Forbidden 错误。例如爬取部分资讯网站、电商网站,无 UA 伪装会直接被拦截,无法获取任何数据。这也证明了 UA 伪装是爬虫开发的必备基础操作。
四、自定义请求头高级扩展
4.1 完整请求头配置(极致伪装)
真实浏览器的请求头包含十余个字段,仅配置 UA 无法达到极致伪装效果。我们可以复制真实浏览器的完整请求头,实现 1:1 伪装,彻底规避反爬检测。
4.1.1 获取真实请求头的方法
- 打开 Chrome/Firefox 浏览器,按
F12打开开发者工具; - 切换到
Network(网络)选项卡,刷新页面; - 点击任意网页请求,在
Request Headers中复制所有字段; - 转换为 Python 字典格式,写入代码。
4.1.2 完整请求头代码示例
python
运行
import requests
# 复制浏览器完整请求头,实现极致伪装
full_headers = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"Accept-Encoding": "gzip, deflate, br",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Host": "www.baidu.com",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Upgrade-Insecure-Requests": "1",
"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",
"sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Google Chrome\";v=\"120\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\""
}
# 发送请求
response = requests.get("https://www.baidu.com", headers=full_headers, timeout=10)
print(f"极致伪装状态码:{response.status_code}")
4.2 请求头封装成工具类(工程化开发)
在大型爬虫项目中,需将请求头与 UA 伪装封装为通用工具类,实现代码复用、统一管理,符合 Python 工程化开发规范。
4.2.1 工具类代码实现
python
运行
# headers_util.py:请求头工具类
import requests
from fake_useragent import FakeUserAgent
class HeadersUtil:
"""请求头与UA伪装工具类,支持静态、动态、完整请求头"""
# 初始化随机UA生成器
ua = FakeUserAgent()
@staticmethod
def get_static_headers():
"""获取静态请求头"""
return {
"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",
"Accept-Language": "zh-CN,zh;q=0.9"
}
@staticmethod
def get_random_headers():
"""获取动态随机请求头"""
return {
"User-Agent": HeadersUtil.ua.random,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9",
"Accept-Language": "zh-CN,zh;q=0.9"
}
# 测试工具类
if __name__ == '__main__':
# 调用静态请求头
static_headers = HeadersUtil.get_static_headers()
print("静态请求头:", static_headers)
# 调用随机请求头
random_headers = HeadersUtil.get_random_headers()
print("随机请求头:", random_headers)
4.2.2 工具类使用方法
在爬虫主程序中直接导入调用,无需重复编写代码:
python
运行
from headers_util import HeadersUtil
import requests
# 使用随机请求头发送请求
response = requests.get("https://www.baidu.com", headers=HeadersUtil.get_random_headers(), timeout=10)
print(f"工具类调用结果:{response.status_code}")
4.3 移动端 UA 伪装(适配手机端网页)
部分网站会根据 UA 区分电脑端和手机端页面,移动端页面结构更简单、数据更易爬取。我们可以通过伪装移动端 UA,爬取手机端网页数据。
4.3.1 移动端 UA 代码示例
python
运行
import requests
from fake_useragent import FakeUserAgent
ua = FakeUserAgent()
# 生成移动端随机UA
mobile_headers = {
"User-Agent": ua.mobile,
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9",
"Accept-Language": "zh-CN,zh;q=0.9"
}
# 访问移动端网页
response = requests.get("https://m.baidu.com", headers=mobile_headers, timeout=10)
response.encoding = "utf-8"
print(f"移动端UA伪装状态码:{response.status_code}")
五、常见异常问题与解决方案
在自定义请求头与 UA 伪装过程中,开发者常遇到各类异常,本文整理高频异常、原因、解决方案,帮助快速排错。
表格
| 异常类型 | 异常原因 | 解决方案 |
|---|---|---|
| 403 Forbidden | UA 无效、请求头不完整、IP 被封禁 | 更换随机 UA、补充完整请求头、添加延时、切换 IP |
| 超时错误(Timeout) | 网络卡顿、服务器响应慢 | 延长超时时间(timeout=30)、检查网络 |
| fake-useragent 生成失败 | 联网失败、库版本过低 | 升级库、手动指定 UA、离线加载 UA 库 |
| 中文乱码 | 未正确设置网页编码 | 添加 response.encoding = response.apparent_encoding |
| 页面数据为空 | 伪装失败、服务器返回空页面 | 更换请求头、验证 URL 正确性、检查反爬机制 |
| SSL 证书错误 | 网站证书不合法 | 添加 verify=False 参数(仅测试使用) |
5.1 核心异常代码修复示例
5.1.1 修复 fake-useragent 生成失败
python
运行
# 方案1:手动指定UA,替代随机生成
headers = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.0 Mobile/15E148 Safari/604.1"}
# 方案2:升级fake-useragent库
# pip install --upgrade fake-useragent
5.1.2 修复 SSL 证书错误
python
运行
# 仅测试环境使用,生产环境不建议关闭证书验证
response = requests.get(url, headers=headers, timeout=10, verify=False)
六、UA 伪装性能优化与最佳实践
6.1 性能优化方案
- UA 缓存机制:对于高频请求,缓存生成的 UA,避免重复调用
fake-useragent,提升请求速度; - 请求头精简:保留核心字段(User-Agent、Accept、Accept-Language),无需冗余字段,减少请求体积;
- 批量 UA 池:提前生成 100 个随机 UA,存储为列表,循环调用,避免实时生成耗时。
6.2 爬虫最佳实践
- 组合伪装:UA 伪装 + 延时设置 + IP 代理,三重防护规避反爬;
- 合规爬取:遵守网站 robots 协议,不爬取敏感数据,控制爬取频率;
- 日志记录:记录每次请求的 UA、状态码,便于异常排查;
- 动态适配:根据目标网站调整请求头,不使用通用模板;
- 异常重试:请求失败自动重试,更换 UA 后重新请求。
6.3 优化后完整爬虫模板(可直接复用)
python
运行
# 通用爬虫模板:UA伪装+异常处理+延时+重试
import requests
import time
from fake_useragent import FakeUserAgent
class BaseSpider:
def __init__(self):
self.ua = FakeUserAgent()
self.retry_num = 3 # 重试次数
self.delay = 1 # 请求延时1秒
def get_headers(self):
"""获取随机请求头"""
return {"User-Agent": self.ua.random, "Accept-Language": "zh-CN,zh;q=0.9"}
def request_url(self, url):
"""发送请求,支持重试与延时"""
for i in range(self.retry_num):
try:
headers = self.get_headers()
response = requests.get(url, headers=headers, timeout=15)
response.encoding = response.apparent_encoding
if response.status_code == 200:
return response.text
time.sleep(self.delay)
except Exception as e:
print(f"第{i+1}次重试失败:{e}")
time.sleep(self.delay)
return None
# 测试模板
if __name__ == '__main__':
spider = BaseSpider()
result = spider.request_url("https://www.baidu.com")
if result:
print("✅ 爬虫模板运行成功!")
else:
print("❌ 爬虫模板运行失败!")
七、总结与后续学习规划
7.1 核心知识点总结
- 请求头:HTTP 请求的核心身份标识,服务器通过请求头识别访问者;
- UA 伪装:爬虫基础必备技能,分为静态 UA(入门)和动态随机 UA(进阶);
- 核心库:
requests负责发送请求,fake-useragent负责生成随机 UA; - 伪装等级:静态 UA < 动态 UA < 完整请求头伪装 < 移动端 UA 伪装;
- 工程化:封装请求头工具类,实现代码复用,适配大型爬虫项目;
- 异常处理:捕获网络、超时、伪装失败等异常,提升爬虫稳定性。
7.2 后续学习方向
本文是 Python 爬虫系列第一篇,聚焦自定义请求头与 UA 伪装,后续将逐步更新以下实战项目:
- 单页图片批量下载与分类本地文件夹存储;
- 网页 JSON 接口数据解析写入 CSV 表格;
- 分页循环爬取科普资讯基础实现方案;
- 延时设置优化规避短频访问封禁问题。
掌握本文内容后,你已经具备突破基础反爬的能力,能够稳定访问绝大多数无强反爬的网页,为后续图片下载、数据解析、分页爬取打下坚实基础。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐

所有评论(0)