Playwright爬虫绕过Cloudflare人机验证

发布时间 2023-11-23 21:01:35作者: Penn00

1. 问题描述

有些网关接入了Cloudflare的人机验证组件,当使用Playwright等自动化工具爬取的时候,会被人机验证阻拦。阻断的效果如下:

2. 问题原因

Selenium、Puppeteer、Playwright等自动化控制工具的实现都会遵循一个规范,就是使用这些工具的时候,获取 navigator 的 webdriver 属性时,会返回 true,而普通浏览器会返回 undefined

3. 解决方案

方案1:通过CDP修改属性

cdp为Chrome Devtools-Protocol(Chrome 开发工具协议)。
代码如下:

const js = `Object.defineProperty(navigator, 'webdriver', {
  get: () => undefined
})`;
await page.addInitScript(js);

执行后, navigator.webdriver, 其值变成了 undefined 了。

【无效】方案2:增加启动参数

在浏览器启动参数中增加 --disable-blink-features=AutomationControlled 参数。
代码如下:

// 初始化浏览器实例
  const context = await chromium.launchPersistentContext(userDataDir, {
    headless: false,
    args: [
      "--disable-gpu",
      "--disable-software-rasterize",
      "--disable-blink-features=AutomationControlled",
    ],
  });

这个方案可以修改值,但只是修改为 false ,而不是移除该参数,依然无法解决。

4. 参考资料

  1. 使用Playwright绕过Webdriver检测
  2. 一种取巧的方式绕过 Cloudflare v2 验证
  3. (新)关于修改window.navigator.webdriver代码失效问题
  4. CDPSession-Playwright