User-Agent分析实战指南:识别浏览器、设备与爬虫请求
三个真实场景:为什么你需要做 User-Agent 分析
很多站长和开发者直到线上出问题,才第一次认真去看请求头。实际上,User-Agent(简称 UA)是排查问题时成本最低、信息量最大的一个字段。
场景一:服务端日志排查
Nginx、Apache 或云厂商的访问日志里,默认就会记录 UA。当某个接口的 404 在一天内暴涨,或者某类请求持续返回 5xx,把日志按 UA 分组一统计,往往就能看出端倪:是某款浏览器版本集中报错,还是某类脚本在刷接口。日志里常见的 UA 可能长这样:Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html),如果不解析,很难第一时间判断它是搜索引擎还是普通用户。
场景二:前端兼容性测试
做响应式站点或移动端适配时,服务端常常会根据 UA 做跳转或返回不同的 HTML。这时候就需要构造不同的 UA 去验证:Android 手机访问会不会被正确识别成移动端?iPad 会不会被误判成桌面?微信内置浏览器是否走到了特殊逻辑?手动修改浏览器 UA 或用命令行请求都可以,但验证完成后,你还需要一个地方快速确认那串 UA 到底会被解析成什么结果。
场景三:反爬与风控识别
正常的浏览器请求和脚本请求,在 UA 上有明显差异。大量空 UA、curl、python-requests 的请求,基本可以判定为非人类流量;而一些“自称 Chrome 但版本号停留在五年前”或者 UA 与其他请求头相互矛盾的请求,则属于典型的伪装特征。把 UA 解析结果与 IP 频次、Referer、请求头完整性结合起来看,能显著降低误杀正常用户的概率。
拆解一条 UA 字符串:每一段都有含义
先看一条最常见的桌面 Chrome UA:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
它可以拆成四块来读:
- Mozilla/5.0:历史遗留的兼容标记。早期浏览器靠它绕过针对 Netscape 的检测,如今几乎所有浏览器都保留了这一段,本身没有太多信息量。
- 括号内的平台段:(Windows NT 10.0; Win64; x64) 描述操作系统与架构;在移动端则会变成 (iPhone; CPU iPhone OS 17_2 like Mac OS X) 或 (Linux; Android 14; Pixel 8) 这样的形式。
- 渲染引擎段:AppleWebKit/537.36 (KHTML, like Gecko) 说明它属于 WebKit 家族,Chrome、Edge、Safari 都会带这一段,所以只看“Safari”两个字并不能判断是苹果浏览器。
- 真实标识段:Chrome/120.0.0.0 才是浏览器名称与版本,末尾的 Safari/537.36 是为了兼容而固定写死的值。
明白了这个套路,再去看 Firefox 的 Gecko/20100101、Edge 的 Edg/、Opera 的 OPR/,就不会被这些兼容性字段误导。
常见浏览器与设备的 UA 特征速查
桌面浏览器
- Chrome:同时出现 AppleWebKit、Chrome/版本号、Safari/537.36。
- Edge:基于 Chromium,但会带 Edg/版本号,注意不是早期的 Edge/。
- Firefox:Gecko/20100101 Firefox/版本号,不含 WebKit。
- Safari(macOS):Version/版本号 Safari/版本号,没有 Chrome 字样。
移动设备与 App 内置浏览器
- iPhone:包含 iPhone; CPU iPhone OS 版本号 like Mac OS X。
- iPad:包含 iPad; CPU OS 版本号 like Mac OS X,部分新版 iPadOS 默认请求桌面站点,UA 会与 Mac 高度相似,识别时要注意。
- Android:包含 Android 版本号; 机型代号,前面通常有 Linux;。
- 微信 / 微博等内置浏览器:在标准 UA 基础上追加 MicroMessenger/、Weibo/ 等标记,做活动页统计时很有价值。
搜索引擎与爬虫
- Googlebot、Bingbot、Baiduspider、YandexBot 等,一般会附带 +http://… 形式的说明地址,这是官方爬虫的重要特征。
- 脚本与工具类:python-requests/2.x、curl/8.x、Go-http-client/1.1、Java/1.8.0、okhttp/4.x、Scrapy/2.x、Apache-HttpClient 等,看到这些基本可以判定为非浏览器客户端。
- 可疑伪装:UA 自称主流浏览器,但版本号极旧、缺少 Sec-CH-UA 等新型客户端提示头,或 UA 与 Accept、Accept-Language 明显不匹配。
用在线工具三步完成 UA 解析
手工对着 UA 逐段比对效率很低,尤其是要在几十条日志里找规律时。这时可以直接用 UA解析在线工具 把字符串丢进去,几秒钟就能拿到结构化结果。
- 获取 UA:在浏览器里访问工具页,点击“获取我的 UA”,或者从日志、抓包工具、Postman 中复制现成的 UA 字符串粘贴进去。
- 选择样本:如果只是想对比不同设备,可以用工具内置的 Chrome、Safari、iPhone、Android、iPad、搜索引擎爬虫等示例快速切换。
- 读取结果:工具会输出浏览器名称与版本、浏览器类型、内核(WebKit、Blink、Gecko)、制造商、操作系统、设备类型(桌面 / 手机 / 平板)以及原始字符串。
对于做兼容性测试的同学,把不同设备的 UA 依次丢进 浏览器信息识别与设备识别 工具里,很快就能整理出一份“UA → 预期渲染结果”的对照表。整个过程在本地浏览器完成,UA 不会上传服务器,排查线上日志时也不用担心数据外泄。
实战建议与三个常见误区
真正把 UA 用起来,除了会解析,还要知道它的边界在哪里。
- 误区一:把 UA 当作唯一身份标识。UA 是客户端自己填的,浏览器插件、爬虫框架、命令行参数都能随意修改,真正做风控时要叠加 IP、行为路径、Cookie 等多维信号。
- 误区二:只匹配“Safari”。Chrome、Edge 的 UA 里都带 Safari 字样,用字符串包含来判断会大面积误判,应优先匹配 Chrome/、Edg/、Firefox/ 等更具体的标识。
- 误区三:忽略 UA 简化的趋势。隐私浏览模式、部分安卓定制系统以及浏览器的 UA 缩减计划,都会让 UA 越来越“模糊”,新项目更建议同时读取 User-Agent Client Hints。
一句话总结
UA 不是万能的,但在日志排查、兼容性验证和流量甄别这三件事上,它依然是性价比最高的切入点。花十分钟学会读它,再配一个顺手的请求头分析工具,很多“玄学问题”会立刻变得有迹可循。