跳转到内容
Glossary 3 分钟阅读 1438 次浏览

User-Agent

本文讲解 User-Agent 字符串是什么、其运行机制,以及为提升隐私和安全而更改它的关键原因。

Browser
User-Agent

User-Agent(UA)是一个 HTTP 请求头字段,用于向服务器标识发起请求的客户端软件,例如网页浏览器、移动应用或机器人程序。

什么是 User-Agent?

User-Agent 字符串是包含在客户端请求 HTTP 头中的一段特征文本。它的主要作用是告知服务器客户端类型、操作系统、软件厂商和/或软件版本。服务器随后可以利用这些信息,为特定客户端提供优化后的内容、记录客户端统计数据或实施访问控制。

User-Agent 字符串的结构

虽然没有统一而严格的格式,但 User-Agent 字符串通常遵循一定的模式:出于历史原因,往往以 Mozilla/5.0 开头,随后是平台细节、操作系统和浏览器信息。

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

典型 User-Agent 字符串的拆解:

  • Mozilla/5.0:历史遗留标记,表示与 Mozilla 渲染引擎兼容。大多数现代浏览器出于兼容性都会带上它。
  • (Windows NT 10.0; Win64; x64):平台信息。
    • Windows NT 10.0:操作系统(Windows 10)。
    • Win64:CPU 架构(64 位 Windows)。
    • x64:CPU 架构(64 位处理器)。
  • AppleWebKit/537.36 (KHTML, like Gecko):渲染引擎信息。
    • AppleWebKit/537.36:表示使用 AppleWebKit 渲染引擎,在 Chrome 和 Safari 中很常见。
    • KHTML, like Gecko:另外的历史兼容性标记。KHTML 是 WebKit 的基础,Gecko 则是 Mozilla 的引擎。
  • Chrome/120.0.0.0:浏览器标识与版本。
  • Safari/537.36:次要的浏览器标识,Chrome 常带上它,以兼容那些期待 Safari 的网站。

User-Agent 在 HTTP 请求中如何工作

当客户端(例如网页浏览器或脚本)向服务器发起 HTTP 请求时,会附带各种请求头,其中之一就是 User-Agent 头。

  1. 客户端请求: 客户端构建 HTTP 请求,并自动用其默认字符串填充 User-Agent 头。
  2. 服务器接收: 服务器收到请求并解析请求头,其中包括 User-Agent
  3. 服务器处理: 服务器可以根据 User-Agent 字符串:
    • 提供不同内容: 对移动浏览器的 User-Agent 返回移动端优化版网页,对桌面浏览器的 User-Agent 返回桌面版。
    • 应用特定样式/脚本: 针对已知的浏览器怪异行为调整 CSS 或 JavaScript。
    • 记录客户端统计: 跟踪浏览器使用情况、操作系统分布和机器人活动。
    • 实施安全措施: 拦截或质询来自已知恶意 User-Agent、或与自动化抓取工具相关的 User-Agent 的请求。
    • 重定向或阻止访问: 依据识别出的客户端类型拒绝对某些资源的访问。

代理服务的作用

代理服务在客户端与目标服务器之间充当中介。当客户端通过代理发送请求时,代理可以在把请求转发给目标服务器之前,拦截并修改 HTTP 请求头,包括 User-Agent 字符串。这种修改让客户端能够向服务器呈现与自身原始身份不同的身份。

为什么要更改 User-Agent?

修改 User-Agent 字符串在各种技术场景中都是常见做法,通常借助代理服务来实现。

1. 网页抓取与数据采集

从网站自动提取数据时,经常会遇到分析 User-Agent 字符串的反机器人机制。
* 绕过反机器人检测: 许多网站会识别并拦截来自通用或已知机器人 User-Agent(例如 Python-requests/2.25.1curl/7.64.1)的请求。通过在一组真实浏览器 User-Agent 之间轮换,抓取程序可以模拟正常用户流量,降低被检测和封锁的概率。
* 获取特定设备的数据: 网站针对移动端与桌面端浏览器可能渲染不同的内容或结构。更改 User-Agent 让抓取程序能够明确请求并采集所需的移动端或桌面端视图数据。
* 获得一致的数据: 一些 A/B 测试或内容个性化系统依赖 User-Agent。使用固定、明确的 User-Agent 可以确保抓取程序每次都拿到同一版本的内容,有助于数据一致性。

2. 测试与开发

开发者会利用修改 User-Agent 来做质量保证和调试。
* 跨浏览器/跨设备兼容性测试: 开发者可以模拟不同浏览器(Chrome、Firefox、Safari)、操作系统(Windows、macOS、Linux)和设备类型(桌面、平板、手机),测试网站或应用在各种环境下的渲染和运行情况,而无需准备多台真机或虚拟机。
* 调试特定浏览器的问题: 当某个缺陷只在特定浏览器出现时,更改 User-Agent 可以让开发者复现该环境并进行调试。
* 测试移动端/桌面端跳转: 验证基于 User-Agent 的服务器端重定向是否把用户正确引导到相应版本的站点。

3. 隐私与匿名

修改 User-Agent 是提升在线隐私这一更广泛策略的组成部分。
* 削弱浏览器指纹: User-Agent 字符串是浏览器唯一指纹的组成部分之一,网站可以借此追踪用户。经常更改或随机化 User-Agent,可以让网站更难基于该请求头建立持久的用户画像。
* 隐藏客户端细节: 修改后的 User-Agent 会阻止目标服务器准确识别真实的客户端软件、操作系统和版本,从而提升匿名性。

4. 绕过访问限制

服务器可能会依据识别出的客户端实施访问控制。
* 地域限制内容(配合 IP 代理): 虽然 User-Agent 本身不会改变位置,但一些服务可能会把 User-Agent 检查与 IP 归属地结合起来。真实的 User-Agent 加上目标地区的代理 IP,能够呈现更可信的画像。
* 针对具体网站的封锁: 有些网站会屏蔽旧版浏览器或特定的机器人 User-Agent。把 User-Agent 改成当前常见的浏览器即可绕过这类限制。
* 访问移动端/桌面端版本: 有些站点会根据 User-Agent 自动跳转。明确设置移动端 User-Agent,可以让站点即便在桌面上也返回移动版,反之亦然。

5. 研究与分析

研究人员可能需要模拟特定的用户环境,或在不同条件下采集数据。
* 市场研究: 了解网站如何向使用特定设备或浏览器的用户呈现内容。
* 安全研究: 分析 Web 应用对各种 User-Agent 字符串(包括畸形或异常字符串)的响应,以发现潜在漏洞。

如何通过代理服务更改 User-Agent

使用代理服务时,User-Agent 头会在请求到达目标服务器之前在代理层被修改。这样目标服务器只会看到代理提供的 User-Agent,而看不到原始客户端的 User-Agent。

1. HTTP/SOCKS5 代理(手动注入请求头)

对于只做请求转发的代理,必须由客户端程序自己设置 User-Agent 头,代理随后转发这个已修改的请求头。

使用 Python requests 库的示例:

import requests

target_url = "http://httpbin.org/user-agent" # 一个会回显 User-Agent 的服务

# 定义想要使用的 User-Agent 字符串
custom_user_agent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.1.1 Mobile/15E148 Safari/604.1"

# 定义代理信息
proxy_url = "http://user:[email protected]:port" # 替换为您自己的代理信息

# 用自定义 User-Agent 组装请求头
headers = {
    "User-Agent": custom_user_agent
}

# 组装 proxies 字典
proxies = {
    "http": proxy_url,
    "https": proxy_url,
}

try:
    response = requests.get(target_url, headers=headers, proxies=proxies, timeout=10)
    response.raise_for_status() # 对错误响应(4xx 或 5xx)抛出 HTTPError
    print("Response from target server:")
    print(response.json())
except requests.exceptions.RequestException as e:
    print(f"An error occurred: {e}")

在这个示例中,requests 库发送 headers 字典中指定的 User-Agent,请求随后通过 proxies 字典中定义的代理进行路由。目标服务器(httpbin.org)将收到 custom_user_agent 字符串。

2. 智能代理 / 代理 API(自动化管理)

一些高级代理服务或 API 内置了 User-Agent 管理功能,除了向代理发起的初始请求外,无需客户端额外配置即可自动设置或轮换 User-Agent。

  • 请求头注入: 代理服务可能提供一个选项:当客户端未提供 User-Agent 时自动注入指定或随机的 User-Agent,或者直接覆盖客户端的 User-Agent。
  • API 参数: 一些代理 API 允许在 API 调用中直接以参数形式指定所需的 User-Agent。

概念示例(由 API 驱动的代理):

import requests

# 假设存在一个虚构的代理 API 端点
proxy_api_url = "https://api.proxyprovider.com/request"
target_url = "http://httpbin.org/user-agent"

# 代理 API 的参数
params = {
    "targetUrl": target_url,
    "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
    "apiKey": "YOUR_API_KEY"
}

try:
    response = requests.get(proxy_api_url, params=params, timeout=15)
    response.raise_for_status()
    print("Response from target server via proxy API:")
    print(response.json())
except requests.exceptions.RequestException as e:
    print(f"An error occurred: {e}")

在这个概念性场景中,代理服务会根据传给其 API 的 userAgent 参数在内部完成 User-Agent 的修改。

常见 User-Agent 字符串与最佳实践

选择合适的 User-Agent 对于与目标服务器高效交互至关重要。

常见的 User-Agent 类别

类别 User-Agent 字符串示例 典型使用场景
桌面版 Chrome Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 模拟常规网页浏览,抓取面向桌面端优化的站点数据。
桌面版 Firefox Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/120.0 模拟常规网页浏览,抓取面向桌面端优化的站点数据,测试 Firefox 特有的渲染表现。
移动版 Safari(iOS) Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1 移动端网页抓取,测试站点的移动版本,模拟 iOS 设备流量。
移动版 Chrome(Android) Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Mobile Safari/537.36 移动端网页抓取,测试站点的移动版本,模拟 Android 设备流量。
通用机器人 Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) SEO 分析,爬取公开内容(遵守 robots.txt),以搜索引擎机器人身份标识自己。若未被专门加入白名单,通常会被反机器人系统拦截。
极简/自定义 MyCustomScraper/1.0 用于标识自有应用(与服务器的交互方式已知且被允许),或用于内部工具。由于被封风险很高,一般不适合抓取公开网站。

User-Agent 管理的最佳实践

  1. 使用真实的 User-Agent: 模仿常见的浏览器和操作系统。抓取或测试公开网站时,避免使用通用或空的 User-Agent,因为它们常被判定为机器人。
  2. 轮换 User-Agent: 执行自动化任务时,在一组多样化的 User-Agent 之间轮换(例如混合使用不同操作系统上的 Chrome、Firefox、Safari),会让流量看起来更自然、更难以预测。
  3. 保持 User-Agent 更新: 使用当前的浏览器版本。过时的 User-Agent 可能触发警告或封锁,因为它们可能意味着系统陈旧、未打补丁,或是试图逃避检测的机器人。
  4. 让 User-Agent 与目标内容匹配: 如果目标是站点的移动版本,就使用移动端 User-Agent;如果目标是桌面版本,就使用桌面端 User-Agent。
  5. 与 IP 轮换结合: 若要实现稳健的抓取或访问,User-Agent 轮换应当与通过代理服务进行的 IP 地址轮换结合使用。这种双重手段能显著降低被检测和封锁的概率。
  6. 避免畸形的 User-Agent: 确保 User-Agent 字符串语法正确、形似合法字符串。畸形字符串可能导致服务器解析出错,或让请求立刻被标记为可疑。
已更新: 03.03.2026
返回分类

试用我们的代理

遍布 100+ 国家的 20,000+ 代理

support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.