--headless参数本身不直接触发风控,真正致命的是其连带启用的自动化痕迹:navigator.webdriver为true、空的navigator.plugins、SwiftShader WebGL渲染器、--enable-automation参数残留等组合特征。

为什么 --headless 参数本身不是问题,但默认行为会暴露无头特征
Playwright 启动 Chromium 时,--headless=new 或旧版 --headless 并不会直接触发风控——真正致命的是它连带启用的数十个自动化痕迹。比如 navigator.webdriver === true、空的 navigator.plugins、WebGLRenderer 显示 SwiftShader、以及进程层残留的 --enable-automation 参数。这些组合在一起,比“有没有图形界面”更容易被识别。
必须禁用的 5 个 Chromium 启动参数
这些参数在真实 Chrome 进程中根本不存在,是静态扫描的第一目标:
-
--disable-blink-features=AutomationControlled:切断navigator.webdriver的源头赋值(仅靠 JS 覆盖不够) -
--disable-infobars:移除顶部“Chrome 正受到自动测试软件控制”提示条 -
--disable-extensions:避免插件管理器注入调试钩子 -
--disable-dev-shm-usage:绕过某些容器环境下的共享内存检测异常 -
--no-sandbox:仅限 Linux 容器内使用;若不加,沙箱机制可能暴露非标准启动路径
viewport、UA、locale 必须协同设置,不能只改一个
单独换 User-Agent 是无效的。反爬系统会交叉验证:
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
viewport宽高建议用非整数常见值,如{"width": 1366, "height": 768},避开 1920×1080 这类“测试机标配” -
User-Agent必须在browser.new_context()初始化时通过user_agent=参数传入,不能只靠set_extra_http_headers()——后者不影响 JS 环境里的navigator.userAgent - 同步设置
locale="en-US"和timezone_id="America/New_York",否则navigator.language和Intl.DateTimeFormat().resolvedOptions().timeZone会穿帮
add_init_script 注入必须覆盖三类关键对象
仅设 navigator.webdriver = false 远远不够。很多站点会在 iframe 或 service worker 中提前读取,且会校验 window.chrome 和 permissions.query:
- 补全
window.chrome对象,至少包含runtime、loadTimes、csi属性(哪怕只是空对象) - 伪造
navigator.plugins和navigator.mimeTypes,长度建议设为 3–5,内容可模拟常见插件如 PDF Viewer、Widevine CDM - 拦截
permissions.query({name: 'notifications'})等调用,返回{state: 'granted'},否则部分风控脚本会因权限拒绝而判定异常
真实环境里最容易被忽略的点,是 WebGL 渲染器和 Canvas 指纹——它们不依赖 JS 注入,而是由 Chromium 启动时的 GPU 配置决定。即使你把所有 JS 层面的属性都伪装好了,canvas.getContext('webgl').getParameter(gl.RENDERER) 返回 Google SwiftShader,就等于主动递上一张“我是无头”的名片。这需要配合 --use-gl=swiftshader 替换为 --use-gl=angle 或直接禁用 WebGL(视目标站是否强依赖该能力而定)。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










