bigywater.tech
爬虫工程 · 58

页面能观察到哪些自动化信号:navigator.webdriver 等

网站的脚本能看到浏览器是不是被自动化工具控制吗?这篇在本机让 headless Chrome 加载一个探测页面,把页面自己的 JavaScript 能读到的一批属性和服务器能读到的请求头列出来。只是描述事实,理解自己的爬虫在对方眼里是什么样子;不涉及如何隐藏。

false / true
只开调试端口 与 加 --enable-automation 时 navigator.webdriver 的值
HeadlessChrome
User-Agent 里自带的标识,请求头和 JS 里读到的一样
469 对 413
两种启动方式下 innerHeight——自动化提示条占了 56 像素

JS 能读到的

实测 · 本机执行输出
  属性                    默认启动                                          加 --enable-automation
  webdriver             False                                         True   ← 不同
  userAgent             Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15  Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15
  brands                Chromium/154, Google Chrome/154, Not A(Brand  Chromium/154, Google Chrome/154, Not A(Brand
  platform              MacIntel                                      MacIntel
  languages             en-US,en                                      en-US,en
  plugins               5                                             5
  mimeTypes             2                                             2
  hardwareConcurrency   10                                            10
  maxTouchPoints        0                                             0
  windowChrome          object                                        object
  screen                800x600                                       800x600
  inner                 756x469                                       756x413   ← 不同
  outer                 756x556                                       756x556
  dpr                   1                                             1
  notification          default                                       default
  hasFocus              False                                         False
  visibility            visible                                       visible
  webglRenderer         no webgl                                      no webgl
  voices                0                                             0
  userAgent 完整内容(两种启动方式相同:True):Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/154.0.0.0 Safari/537.36
  其中是否含 "HeadlessChrome":True

探测脚本读了 19 项:navigator.webdriver、userAgent、userAgentData.brands、platform、languages、plugins、mimeTypes、hardwareConcurrency、window.chrome、屏幕与窗口尺寸、通知权限、焦点、WebGL 渲染器、语音等。两种启动方式下,只有 navigator.webdriver 和 innerHeight 不同。

请求头里的标识

实测 · 本机执行输出
  默认(我们的启动参数:headless=new + 远程调试端口):
      sec-ch-ua-platform: "macOS"
      User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/154.0.0.0 Safari/537.36
      sec-ch-ua: "Chromium";v="154", "Google Chrome";v="154", "Not A(Brand";v="99"
      sec-ch-ua-mobile: ?0
  再加 --enable-automation:
      sec-ch-ua-platform: "macOS"
      User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/154.0.0.0 Safari/537.36
      sec-ch-ua: "Chromium";v="154", "Google Chrome";v="154", "Not A(Brand";v="99"
      sec-ch-ua-mobile: ?0

Chrome 的 headless 模式在 User-Agent 里就是 HeadlessChrome/154.0.0.0,sec-ch-ua 和 sec-ch-ua-platform 随请求发出。这些是浏览器自己宣布的,爬虫是否应该修改它们是另一个问题(见后面 User-Agent 与联系方式一篇)。

不执行脚本的客户端

实测 · 本机执行输出
  请求头:{'Host': '127.0.0.1:9960', 'User-Agent': 'python-requests/2.34.2', 'Accept-Encoding': 'gzip, deflate, zstd', 'Accept': '*/*', 'Connection': 'keep-alive'}
  → 页面上的脚本只能探测"会执行脚本的客户端";不执行脚本的 HTTP 客户端,服务器只能看到上面这几个请求头

用 requests 抓取时,服务器看不到任何脚本探测的结果,只有请求头和连接层的信息(第 15 篇的头顺序、第 13 篇的 TLS 会话、以及 JA3 指纹那一篇)。

分步演示

浏览器自动化信号
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.8 / requests 2.34.2 / aiohttp 3.14.3 / lxml 6.1.1(系统 Python);所有请求只发给本机自己起的测试服务器(127.0.0.1,端口 9960 以上,不访问任何真实网站);服务器可以按实验需要制造延迟、断连、压缩、重定向等行为,并记录收到的原始请求;计时用 time.perf_counter,数字每次运行会有小幅抖动。Chrome 154.0.8037.98 通过 pcdp.py 启动(headless=new、--remote-debugging-port、--disable-gpu 等);探测页面是本机服务器上的最简页面,脚本由 CDP 的 Runtime.evaluate 执行并取回对象;“加 --enable-automation”是在同样参数后追加这一个启动参数;请求头来自本机服务器的记录;WebGL 显示“没有”是因为我的启动参数关闭了 GPU,不代表所有 headless 都没有;全部只在本机,没有访问任何真实网站
    • 没有验证:非 headless(有界面)的 Chrome 的同一组值;Selenium/Playwright 驱动时这些值的变化(没有安装 chromedriver);更多的探测项(Canvas 指纹、字体列表、时区、权限 API 的行为);网站实际会怎样使用这些信号;反爬服务的具体做法;任何隐藏或伪装这些值的方法——不在本系列的范围内
    京ICP备2026067502号-1京公网安备11010502063487号