详解
User-Agent 请求头是网络上最古老的身份标识之一。客户端发送的每个 HTTP 请求都包含一行 `User-Agent:`,用于标明客户端软件(浏览器或库)、版本号、操作系统,以及通常还有渲染引擎。服务器利用它进行内容协商(移动端与桌面端布局)、数据分析,以及日益普遍的机器人检测。
在爬虫场景中,User-Agent 是最容易出错的信号。常见 HTTP 库的默认 User-Agent(如 `python-requests/2.31.0`、`axios/1.5.0`、`okhttp/4.10.0`)会立即暴露身份。即便是 Playwright 和 Puppeteer 的默认 User-Agent 也包含 `HeadlessChrome`,反机器人系统会对此立即标记。
最简单的应对方法是在每个请求中设置 Chrome 的 UA。但问题在于,仅靠 User-Agent 是不够的——现代指纹识别技术会将 UA 与 `sec-ch-ua` 客户端提示、TLS 指纹、JavaScript navigator 对象以及 Accept-Language 请求头进行交叉比对。设置了 Chrome UA 却暴露了 Python 的 TLS 握手特征,反而会比直接保留默认 UA 产生更大的风险。
工作原理
当您的客户端与服务器建立连接时,请求行中包含请求头。`User-Agent` 行就是其中之一。服务器会解析它(或仅记录它),并根据所见内容对请求进行路由。Windows 上现代 Chrome 的 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`。'Mozilla/5.0' 前缀具有历史渊源,每个浏览器都会发送它,以兼容旧版系统。
现代 HTTP 中,真实浏览器还会发送 `sec-ch-ua`('Sec-CH-UA' 客户端提示)请求头,其中携带结构化的浏览器、版本及平台数据。反爬虫系统会将这些数据与 User-Agent 字符串进行比对,并标记其中的不一致之处。因此,User-Agent 轮换必须与一致的 `sec-ch-ua-*` 更新以及匹配的 TLS 指纹配合使用。