跳到正文

开源的 playwright-stealth 替代方案

在 Python 中给 Playwright 加上 stealth 能力,playwright-stealth 是最快的办法:套一层包装,每个页面就会获得一组 JavaScript 规避脚本。但这些规避脚本只是原版浏览器上的覆盖,连它的维护者都称其为概念验证。Clearcote 则直接在引擎中原生地设置这些值,页面找不到任何覆盖。

playwright-stealth 是什么?

playwright-stealth 是 puppeteer-extra-plugin-stealth 面向 Playwright 的 Python 移植版。AtuboDad 的原始移植版自 2024 年年中以来就没再更新;如今 PyPI 上的这个包名由一个积极维护的分支(Mattwmaster58)接手,它发布了 API 更简洁的 2.0 版,并合并了积压的 pull request。它采用 MIT 许可,使用极为广泛:PyPI 月下载量约 2.4M 次。

它的原理是在每个 context 上注册初始化脚本,每个脚本修补一个破绽:navigator.webdriver、navigator.languages、插件、WebGL 厂商、chrome.runtime 等等。维护者对它的上限直言不讳:README 表示,除了最简单的机器人检测,别指望它能绕过其他任何检测,并把它定位为一个起点。原因在于结构:JavaScript 覆盖可以通过 Function.prototype.toString 或属性描述符检查被识破;页面的初始化脚本触及不到 Web Worker;而且这个包完全没有处理 Playwright 驱动自身的 CDP 副作用或网络层。

Clearcote 与 playwright-stealth 对比

功能Clearcoteplaywright-stealth
实现方式 引擎层面的 C++ 补丁:原生值 原版浏览器上的 JavaScript 初始化脚本
可被检测的痕迹 无:页面、iframe 和 worker 中都是原生值 可通过 toString、属性描述符和 worker 重新读取发现覆盖
指纹身份 由一个种子生成的一致身份画像(canvas、WebGL、字体、navigator) 在主机真实值之上手动设置的少数几个值
驱动 / CDP 副作用 在启动时(isolated world)和引擎中加以抑制 未处理;使用原版 Playwright 驱动
TLS / 网络层一致性 ClientHello 跟随所声明的 Chrome 版本 未处理
框架 Playwright 与 Puppeteer(Python、Node、.NET) Playwright(Python)
接入方式 替换浏览器二进制文件 一行代码包装 Playwright
费用 开源版构建免费;最新构建凭 GitHub 免费使用;Pro $49/月 免费开源(MIT)

对比整理于 2026年9月。playwright-stealth 的许可方式:开源(MIT);细节可能会变化,请以其项目的最新信息为准。

团队为什么选择 Clearcote

原生实现,而非覆盖

playwright-stealth 的每个规避脚本都会用 JavaScript 函数替换真实的浏览器函数,而这种替换是可以被观察到的。Clearcote 在 Chromium 内部修改值,页面检查到的函数就是真正的原生函数。

每个 realm 中结果一致

初始化脚本修补的是页面。从 Web Worker 或新建的 iframe 中重新读取同一个值,得到的就是未经修补的原值。引擎层面的值则处处一致。

完整的身份,而非零星几个字段

一个 --fingerprint 种子就能生成一台在 canvas、WebGL、音频、字体、屏幕和硬件上都一致的机器,而不是在真实主机之上叠加几处覆盖。

保留你的 Playwright 代码

Clearcote 是一个 Chromium 二进制文件。把 executable_path 指向它,或者使用 SDK 的 launch(),Playwright 脚本的其余部分都不用改。

什么情况下 playwright-stealth 可能更合适

  • 你想在检测宽松的目标上花五分钟试一试,不想管理浏览器二进制文件。
  • 你的目标网站只检查 navigator.webdriver 这类明显的破绽。
  • 你已经在用 Clearcote,想知道还需不需要它?不需要。它的规避脚本只是重复设置引擎已经设好的值,再叠加 JavaScript 覆盖反而会把引擎消除掉的痕迹带回来。

常见问题

playwright-stealth 还能用吗?

它仍然可以安装和运行,维护中的分支(2.x)也在更新。够不够用取决于目标网站。它自己的 README 就提醒过,它只能应对最简单的检测,因为 JavaScript 覆盖本身可以被检测到,而且它不改动驱动层和网络层。

playwright-stealth 和 Clearcote 有什么区别?

playwright-stealth 向原版 Chromium 注入 JavaScript 来覆盖一组值。Clearcote 是修改版 Chromium,这些值都是原生的,在各个 frame 和 worker 之间保持一致,底层还有与之匹配的 TLS 指纹。两者都用普通的 Playwright 来驱动。

应该把 playwright-stealth 和 Clearcote 一起用吗?

不应该。引擎已经会报告一致的值,再叠加 JavaScript 覆盖只会把原生函数替换成可被检测的函数。用普通的 Playwright 启动 Clearcote 即可。

Node.js 有 playwright-stealth 吗?

Node 上的对应方案是 playwright-extra 搭配 puppeteer-extra 的 stealth 插件,同样基于 JavaScript 覆盖的设计。Clearcote 在 Python、Node 和 .NET 中的用法完全相同。

相关阅读

问答Why does Function.toString() reveal a hooked function?Calling toString() on a native function returns “[native code]”; an override returns its own source instead — so detectors stringify APIs to catch JavaScript spoofs.问答Playwright vs Puppeteer for stealth: does it matter?Both drive Chromium over CDP, so both leak the same automation artifacts. Stealth comes from the browser binary and launch defaults, not the framework you pick.对比Clearcote 与 puppeteer-extra-plugin-stealth 对比给 Puppeteer 加装规避脚本,stealth 插件仍是安装量最大的方式,每周下载量约 840,000 次,但它自 2023 年 3 月以来就没有发布过新版本。每个规避脚本都是原版 Chrome 上的 JavaScript 补丁,而 JavaScript 补丁会自我暴露。Clearcote 则在引擎中原生地设置这些值。对比Clearcote 与 Camoufox 对比Camoufox 是一款做得很好的开源指纹浏览器,基于 Firefox。Clearcote 把同样的引擎层面思路用在 Chromium 上,让你的自动化呈现的是约 69% 的网民实际在用的浏览器,而不是只有约 3% 的人在用的那一款。对比Clearcote 与 CloakBrowser 对比CloakBrowser 是一款能力扎实的引擎层面 stealth Chromium,用户众多,但其打过补丁的二进制文件是闭源的。Clearcote 同样工作在引擎层面,运行更新的 Chromium,并提供开源版构建,其中每个补丁你都能阅读并重新构建。对比Clearcote 与 undetected-chromedriver 对比undetected-chromedriver 每月下载量仍有约 2M 次,但它的最后一个版本发布于 2024 年 2 月。它在原版 Chrome 上隐藏 Selenium/ChromeDriver 的痕迹,却完全不涉及指纹或网络层。Clearcote 在引擎中同时修改这两者。

试试这款开源 Chromium 替代方案

免费开源,可直接接入 Playwright 与 Puppeteer,一直到 TLS 握手都保持一致。

通过 GitHub 可免费使用一个浏览器。无需信用卡。