User-Agent字符串的完整历史
User-Agent(UA)字符串的历史可以追溯到1993年NCSA Mosaic浏览器的诞生。Mosaic的UA字符串结构非常简单:NCSA_Mosaic/2.0 (Windows 3.1)。1994年,Netscape Navigator发布后,为了兼容性,在UA字符串中声称自己是Mozilla(Mosaic的继任者Netscape的代号),形成了Mozilla/1.0 (Win3.1)的格式。
1995年,微软发布Internet Explorer,为了获取支持Mozilla扩展功能的网站内容,IE在UA字符串中声称自己是Mozilla兼容的,同时加入了自己的标识:Mozilla/1.22 (compatible; MSIE 2.0; Windows 95)。从此,几乎所有浏览器的UA字符串都以Mozilla开头,形成了延续至今的"UA兼容性历史包袱"。
2003年,苹果发布Safari浏览器,基于KHTML渲染引擎开发。Safari在UA中加入了KHTML标识,但为了兼容性也保留了Mozilla和AppleWebKit前缀。2008年,Google发布Chrome浏览器,基于WebKit分支的Blink引擎,其UA包含了Mozilla、AppleWebKit、Chrome和Safari四个标识,成为现代浏览器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:历史兼容性标识,几乎所有现代浏览器都以此开头,表示与Mozilla兼容
- Windows NT 10.0; Win64; x64:操作系统信息,表示Windows 10 64位系统
- AppleWebKit/537.36:浏览器使用的渲染引擎,WebKit/Blink引擎的版本号
- KHTML, like Gecko:历史兼容性标识,表示该引擎兼容KHTML和Gecko布局引擎
- Chrome/120.0.0.0:浏览器名称和版本号,Chrome 120
- Safari/537.36:兼容性标识,确保不会被服务器识别为不兼容的浏览器
浏览器引擎对比
不同浏览器使用不同的渲染引擎,理解引擎差异有助于精准解析UA字符串:
| 渲染引擎 | 使用浏览器 | UA特征标识 | 市场份额 | 特点 |
|---|---|---|---|---|
| Blink | Chrome、Edge、Opera、Brave、Vivaldi | AppleWebKit/... Chrome/... | 约65% | Google主导开发,性能优异,更新快 |
| WebKit | Safari、iOS所有浏览器 | AppleWebKit/... Safari/... | 约18% | Apple主导,能耗低,iOS生态唯一引擎 |
| Gecko | Firefox、Tor Browser | Gecko/... Firefox/... | 约3% | Mozilla开发,开源,注重隐私保护 |
| Trident | 旧版IE(IE8-IE11) | MSIE ... Trident/... | 已淘汰 | 微软旧引擎,已停止维护 |
| EdgeHTML | 旧版Edge(2015-2020) | Edge/... EdgeHTML/... | 已淘汰 | 微软旧版Edge引擎,已迁移至Chromium |
移动端UA特征
移动端设备与桌面端设备的UA字符串有显著差异,识别移动端设备对于响应式设计和移动端适配至关重要:
Android设备
Mozilla/5.0 (Linux; Android 14; Pixel 9 Pro) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/126.0.6478.122 Mobile Safari/537.36
Android设备UA的关键特征包括:Linux操作系统、Android版本号、设备型号、Mobile标识(表示移动版浏览器)。
iOS设备
Mozilla/5.0 (iPhone; CPU iPhone OS 18_0 like Mac OS X) AppleWebKit/605.1.15
(KHTML, like Gecko) Version/18.0 Mobile/15E148 Safari/604.1
iOS设备UA的关键特征包括:iPhone/iPad标识、CPU iPhone OS(表示iOS系统)、Version/(表示Safari浏览器版本)、Mobile/(表示移动设备)。
各搜索引擎爬虫UA大全
主流搜索引擎爬虫都会在UA字符串中声明自己的身份,以下是识别各类爬虫的完整参考:
Googlebot(Google网页搜索):
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
Googlebot Image(Google图片搜索):
Googlebot-Image/1.0
Bingbot(微软Bing搜索):
Mozilla/5.0 (compatible; Bingbot/2.0; +http://www.microsoft.com/bing)
Baiduspider(百度搜索):
Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
Yandexbot(Yandex搜索):
Mozilla/5.0 (compatible; YandexBot/3.0; +http://yandex.com/bots)
Sogou Spider(搜狗搜索):
Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)
360Spider(360搜索):
Mozilla/5.0 (compatible; 360Spider/1.0; +http://www.360.cn)
YisouSpider(一搜/UC):
Mozilla/5.0 (compatible; YisouSpider/5.0; +http://www.yisou.com/spider)
DuckDuckBot(DuckDuckGo搜索):
DuckDuckBot/1.0; (+http://duckduckgo.com/duckduckbot.html)
常用爬虫库的UA特征
使用自动化工具和爬虫库时,默认的UA字符串通常具有明显的特征,容易被识别和拦截:
| 库/工具 | 默认UA特征 | 可自定义 | 检测方法 |
|---|---|---|---|
| Puppeteer | HeadlessChrome | 是 | 检测navigator.webdriver属性 |
| Playwright | 包含Playwright标识 | 是 | 检测特定API和属性 |
| Selenium | 包含Selenium标识 | 是 | 检测navigator.webdriver属性 |
| Scrapy | Scrapy/VERSION | 是 | 默认UA即暴露身份 |
| cURL | curl/VERSION | 是 | 明显的命令行工具特征 |
| Python Requests | python-requests/VERSION | 是 | 默认UA即暴露身份 |
浏览器指纹技术
仅靠UA字符串识别用户和检测爬虫远远不够,现代浏览器指纹技术通过采集浏览器和设备的多种特征来生成唯一标识符:
Canvas指纹
利用HTML5 Canvas API绘制相同的图像,不同设备(GPU、显卡驱动、操作系统)的渲染结果存在微小差异。通过获取Canvas图像的base64编码,可以生成一个近乎唯一的设备标识。Canvas指纹的熵值约为5-10比特,设备差异度较高。
WebGL指纹
WebGL(Web Graphics Library)提供了更底层的GPU访问接口,通过查询WebGL的渲染器信息、GPU型号、渲染参数等,可以获取更丰富的设备特征。WebGL指纹的熵值约为10-15比特,能够有效区分不同设备。
音频指纹
AudioContext API允许采集设备音频处理链的特征。不同设备的音频采样率、声道数、音频处理算法的微小差异都会产生独特的音频指纹。音频指纹的稳定性较高,不易受浏览器更新影响。
Font指纹(字体检测)
通过检测系统安装的字体列表来生成指纹。操作系统和安装的软件包不同,系统字体列表也会不同。Font指纹的熵值约为8-12比特。
Timezone检测
通过JavaScript的Intl.DateTimeFormat API检测用户的时区设置。时区信息虽然不能唯一标识用户,但可以作为辅助特征,特别是当用户时区与IP归属地时区不一致时,高度可疑。
综合使用多种指纹技术,可以生成熵值高达30-40比特的浏览器指纹,在大多数情况下能够唯一标识一台设备。
爬虫检测的对抗与反对抗
爬虫检测是一场持续的攻防对抗,双方的技术手段不断演进:
- 动态UA切换:爬虫程序通过随机切换UA字符串列表来规避UA层面的检测,常用的UA池包含数百个真实浏览器的UA
- Headless Chrome检测:网站通过检测navigator.webdriver、chrome.runtime等属性来识别Headless Chrome。反对抗措施包括使用工具隐藏这些特征
- 行为模拟:爬虫程序模拟人类用户的行为模式,包括随机延迟、鼠标轨迹、滚动行为、点击模式等,使行为特征更接近真实用户
- 验证码(CAPTCHA):网站使用reCAPTCHA等验证码服务拦截自动化访问。反对抗措施包括使用打码平台或训练深度学习模型自动识别验证码
- IP频率限制:网站对单个IP的请求频率进行限制。反对抗措施包括使用代理IP池、分布式爬虫架构
- JS挑战:网站通过JavaScript计算挑战来验证客户端是否支持完整的JS执行环境,过滤掉基于HTTP库的简单爬虫
API接口设计
GET /api/ua/parse?ua=Mozilla/5.0%20...
{
"code": 0,
"data": {
"ua": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ...",
"parsed": {
"browser": {"name": "Chrome", "version": "120.0.0.0", "major": "120"},
"engine": {"name": "Blink", "version": "537.36"},
"os": {"name": "Windows", "version": "10", "platform": "x64"},
"device": {"type": "desktop", "vendor": "", "model": ""}
},
"is_bot": false,
"bot_name": null,
"bot_detail": null,
"headless": false,
"ua_score": 0
}
}
常见问题解答
Q: 为什么UA字符串如此复杂?
这是历史原因造成的。早期的浏览器通过UA字符串进行内容协商,新浏览器为了兼容性,会在UA中保留旧浏览器的标识,形成了层层叠加的复杂结构。这种"历史包袱"使得UA字符串解析变得异常复杂。
Q: 仅靠UA识别爬虫够用吗?
远远不够。UA字符串可以轻松伪造,几乎所有爬虫框架都支持自定义UA。可靠的爬虫识别方案需要结合IP反向验证、浏览器指纹、行为分析和JavaScript执行环境检测等多种技术手段。
Q: 如何处理缺失UA的请求?
HTTP协议中User-Agent是可选请求头,但缺失UA的请求高度可疑。建议将缺失UA的请求标记为高风险,并结合IP信誉、行为模式等其他维度进行综合判断。