无头浏览器被检测到:原因与解决方法(2026)
网站提示“检测到无头浏览器”,或者悄悄给你的自动化浏览器返回另一个页面。网站这样做,是因为无头浏览器没有窗口运行,并且在一些细微但可以测量的地方,与普通桌面浏览器不同。本指南说明网站会看哪些信号,如何诊断你自己的浏览器暴露了什么,以及合理的解决方式是什么。同时也会说明什么时候应该停下来,或者把这项检测当作验证码步骤来处理。
为什么网站会检测无头浏览器
自动化框架驱动的是真实的浏览器内核,所以页面的大部分行为是一样的。差异主要出现在边缘位置:
- 自动化标志。 由自动化工具驱动的浏览器过去会暴露
navigator.webdriver属性,且值为true,一些框架还会在页面中留下其他痕迹。 - 功能缺失或异常。 无头版本可能报告没有插件、语言列表异常,或者窗口尺寸与真实屏幕不符。
- 渲染差异。 在无头和有头环境下,Canvas 和 WebGL 的输出可能不同,在没有 GPU 的服务器上尤其明显。
- 时间节奏。 自动化的点击和页面加载往往有一种人不会有的节奏。
- 网络行为。 请求头、请求头的顺序以及 TLS 握手,都可能暴露出这不是一个浏览器客户端。
网站会把这些信号综合成一个分数。分数低可能意味着静默降级、额外的检查,或者直接拦截。
第 1 步:看看你的浏览器暴露了什么
在改动任何东西之前,先看看页面能从你的自动化浏览器中读到什么。下面的脚本会打开一个你自己控制的页面,并输出关键信号。它只是一个诊断工具:只在你自己的测试页面上使用,不要用来探测别人的系统。
from playwright.sync_api import sync_playwright
CHECK = """() => ({
webdriver: navigator.webdriver,
languages: navigator.languages,
plugins: navigator.plugins.length,
userAgent: navigator.userAgent,
screen: [screen.width, screen.height],
viewport: [window.innerWidth, window.innerHeight],
timezone: Intl.DateTimeFormat().resolvedOptions().timeZone
})"""
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page()
page.goto("https://example.com") # 替换为你自己的页面
print(page.evaluate(CHECK))
browser.close()
用 headless=False 再运行一次同样的脚本,然后比较两次的输出。两者之间的差异,就是网站可能注意到的地方。
第 2 步:修复不一致的地方,而不只是隐藏标志
只隐藏一个标志、而其他信息保持不变,是最常见的错误。如果 User-Agent 显示 Windows,但字体、时区和屏幕尺寸却描述的是一台 Linux 服务器,这比单一属性更容易被识别。目标是让整个环境内部保持一致:
- 尽量使用有头浏览器,或者使用与当前桌面浏览器相符的无头模式。
- 设置相互匹配的视口和语言。
- 让时区和语言区域与你使用的 IP 地址保持一致。
- 同一个身份复用同一个配置文件及其 Cookie,而不是每次运行都从头开始。
Playwright 可以在一个地方设置其中几项:
context = browser.new_context(
locale="en-US",
timezone_id="America/New_York",
viewport={"width": 1366, "height": 768},
)
page = context.new_page()
第 3 步:放慢速度,像一个普通访客那样操作
自动化如果比人类快得多,就会非常明显。在页面加载之间加入真实的停顿,避免以完全固定的节奏点击同一个元素,并且不要从同一个地址并行打开成百上千个页面。请求更少、速度更慢,也能减轻网站的负载,这本来就是应该做的事。
第 4 步:判断什么时候检测是验证码
有些检测流程的结果不是封锁,而是一个挑战。你会看到验证码控件,这一步需要从识别服务获取 token。目前 Scarnox 上线的验证码类型是 PopularCaptcha。PopularCaptcha Python 指南展示了如何请求并提交 token。其他控件(例如 Cloudflare Turnstile)在路线图上,但尚未上线,所以在规划之前,请先看验证码类型说明。
出现验证码步骤,并不意味着你的其他配置就是正确的。如果同一个网站无论你怎样配置,都封锁每一次无头会话,这就清楚地表明网站所有者不希望被自动化访问。请尊重这一点。
不应该做的事
不要试图对禁止自动化访问的网站隐藏自动化行为,也不要用检测规避工具突破访问控制。这与本指南所讨论的测试和公开数据收集,是完全不同性质的项目。如果你的项目需要你尚未获得授权的访问权限,请询问网站所有者,或者寻找官方 API 或数据源。
负责任地抓取
- 在自动化访问某个网站之前,检查
robots.txt和服务条款。 - 保持较低的请求频率,并缓存已经抓取过的页面。
- 把封锁当作明确的答复,而不是需要绕过的谜题。
- 没有合法依据时,不要收集个人数据。
后续方向
如果你的自动化用于端到端测试,思路有所不同,请参阅自动化测试中的验证码。如果你在使用 Playwright 或 Puppeteer,Playwright 与 Puppeteer 验证码处理说明了 token 应该放在哪里。
免费试用额度,无需信用卡:注册账户,然后在你自己的页面上测试 PopularCaptcha 流程。当前费率请查看定价页面。