前言

在 Python 爬虫开发过程中,服务器对爬虫程序的识别与拦截是开发者必须解决的核心问题之一。多数网站会通过检测 HTTP 请求头中的 User-Agent(简称 UA)字段,判断访问来源是否为合法浏览器,非浏览器 UA 会直接被拒绝访问或返回异常数据。因此,UA 伪装是爬虫入门到进阶的必备技能,也是实现稳定、合规数据爬取的基础保障。

本文将从基础理论、环境配置、实战案例、原理剖析、优化方案全维度讲解自定义请求头与 UA 伪装技术,帮助开发者掌握浏览器伪装核心逻辑,规避基础反爬机制,实现稳定的网页访问与数据爬取。

本文涉及的核心依赖库与官方资源如下:

  1. requests 库官方文档:Python 最常用的 HTTP 请求库,用于发送网络请求、自定义请求头;
  2. Python 官方下载地址:爬虫开发基础环境,建议安装 3.8 及以上版本;
  3. Fake User-Agent 库官方文档:自动生成随机浏览器 UA 的第三方库,提升爬虫伪装效果;
  4. 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 字段判断访问者是人类使用的浏览器,还是自动化爬虫程序

  1. 合法浏览器 UA:服务器正常返回网页数据;
  2. 爬虫默认 UA(如 requests 库默认 UA:python-requests/2.31.0):服务器直接拦截,返回 403 Forbidden、空白页面或验证码。

1.3 UA 伪装的核心意义

  1. 突破基础反爬:伪装成合法浏览器,绕过服务器的 UA 检测机制;
  2. 保证数据完整性:避免因身份识别失败导致的页面数据缺失、乱码问题;
  3. 提升爬虫稳定性:降低被服务器封禁 IP 的风险,实现长期稳定爬取;
  4. 适配网页渲染:部分网页会根据 UA 返回不同的页面结构,伪装后可匹配目标页面结构。

1.4 爬虫合规性说明

本文仅用于技术学习与研究,爬虫使用需严格遵守《网络安全法》《计算机信息网络国际联网安全保护管理办法》,爬取公开、非敏感数据,禁止爬取受版权保护、隐私数据,遵守网站robots.txt协议,合理控制爬取频率,避免对服务器造成压力。

二、开发环境配置与依赖库安装

2.1 基础环境要求

  1. 操作系统:Windows 10 及以上、macOS、Linux 均可;
  2. Python 版本:3.8 ~ 3.12(稳定兼容版本);
  3. 开发工具: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 核心实现步骤
  1. 导入 requests 库;
  2. 手动定义合法浏览器 UA;
  3. 构建请求头字典,将 UA 写入User-Agent字段;
  4. 发送 GET 请求,携带自定义请求头;
  5. 解析响应结果,验证伪装效果。
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 代码原理深度剖析
  1. 库导入import requests引入 HTTP 请求核心库,所有网络请求基于该库实现;
  2. 目标 URL:指定需要访问的网页地址,本文使用百度首页作为测试地址,公开无反爬限制;
  3. 请求头构建
    • User-Agent:手动填写 Chrome 浏览器的真实 UA,是伪装核心;
    • 补充AcceptAccept-Language等字段:模拟真实浏览器的请求行为,避免仅伪装 UA 被识别;
  4. 请求发送requests.get()方法接收三个核心参数:
    • url:目标网页地址;
    • headers:自定义请求头,服务器会优先解析该字段;
    • timeout:超时设置,防止网络卡顿导致程序无限等待;
  5. 编码处理response.encoding = response.apparent_encoding自动识别网页编码,解决中文乱码;
  6. 响应验证:HTTP 状态码200代表请求成功,证明 UA 伪装生效;
  7. 异常处理:捕获网络超时、连接失败等所有请求异常,提升程序健壮性。
3.1.4 静态 UA 伪装优缺点

表格

优点 缺点
实现简单,代码量少 UA 固定,频繁爬取易被服务器识别
无需额外依赖,入门友好 无法适配多浏览器、多设备场景
适合小规模、一次性爬取 维护成本高,需手动更新 UA

3.2 动态随机 UA 伪装(进阶方案)

静态 UA 的固定性容易被服务器的流量分析机制识别,动态随机 UA 伪装通过fake-useragent库自动生成随机 UA,每次请求使用不同的浏览器 UA,完美模拟真实用户的访问行为,是中大规模爬虫的首选方案。

3.2.1 核心实现步骤
  1. 导入requestsfake_useragent库;
  2. 初始化FakeUserAgent对象,生成随机 UA;
  3. 构建动态请求头,每次请求自动替换 UA;
  4. 发送请求,验证随机 UA 效果;
  5. 批量测试,验证伪装稳定性。
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 代码原理深度剖析
  1. 随机 UA 生成器FakeUserAgent()初始化对象,内置海量主流浏览器 UA 库;
  2. UA 生成方式
    • ua.chrome:仅生成 Chrome 浏览器 UA,针对性伪装;
    • ua.firefox:仅生成火狐浏览器 UA;
    • ua.random:生成全平台(手机、电脑、多浏览器)随机 UA,伪装效果最强;
  3. 动态请求头:每次循环都会重新生成 UA,确保每次请求身份唯一;
  4. 批量测试:循环 10 次请求,验证随机 UA 的稳定性,模拟真实用户多次访问场景;
  5. 异常跳过:单次请求失败不影响整体程序,提升容错率。
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 获取真实请求头的方法
  1. 打开 Chrome/Firefox 浏览器,按F12打开开发者工具;
  2. 切换到Network(网络)选项卡,刷新页面;
  3. 点击任意网页请求,在Request Headers中复制所有字段;
  4. 转换为 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 性能优化方案

  1. UA 缓存机制:对于高频请求,缓存生成的 UA,避免重复调用fake-useragent,提升请求速度;
  2. 请求头精简:保留核心字段(User-Agent、Accept、Accept-Language),无需冗余字段,减少请求体积;
  3. 批量 UA 池:提前生成 100 个随机 UA,存储为列表,循环调用,避免实时生成耗时。

6.2 爬虫最佳实践

  1. 组合伪装:UA 伪装 + 延时设置 + IP 代理,三重防护规避反爬;
  2. 合规爬取:遵守网站 robots 协议,不爬取敏感数据,控制爬取频率;
  3. 日志记录:记录每次请求的 UA、状态码,便于异常排查;
  4. 动态适配:根据目标网站调整请求头,不使用通用模板;
  5. 异常重试:请求失败自动重试,更换 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 核心知识点总结

  1. 请求头:HTTP 请求的核心身份标识,服务器通过请求头识别访问者;
  2. UA 伪装:爬虫基础必备技能,分为静态 UA(入门)和动态随机 UA(进阶);
  3. 核心库requests负责发送请求,fake-useragent负责生成随机 UA;
  4. 伪装等级:静态 UA < 动态 UA < 完整请求头伪装 < 移动端 UA 伪装;
  5. 工程化:封装请求头工具类,实现代码复用,适配大型爬虫项目;
  6. 异常处理:捕获网络、超时、伪装失败等异常,提升爬虫稳定性。

7.2 后续学习方向

本文是 Python 爬虫系列第一篇,聚焦自定义请求头与 UA 伪装,后续将逐步更新以下实战项目:

  1. 单页图片批量下载与分类本地文件夹存储;
  2. 网页 JSON 接口数据解析写入 CSV 表格;
  3. 分页循环爬取科普资讯基础实现方案;
  4. 延时设置优化规避短频访问封禁问题。

掌握本文内容后,你已经具备突破基础反爬的能力,能够稳定访问绝大多数无强反爬的网页,为后续图片下载、数据解析、分页爬取打下坚实基础。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐