Playwright 绕过验证码

如何使用 Playwright 绕过验证码

您是否遇到过任何验证码阻止您的网络抓取工具?在自动化数据收集时,这些挑战可能令人头疼。幸运的是,您可以使用Playwright绕过验证码,我们将向您介绍三种方法:

  1. Base Playwright和 2Captcha
  2. 使用 Stealth 插件的Playwright
  3. 使用 ZenRows 请求屏蔽

Playwright能破解验证码吗?

验证码的目的是对机器人具有挑战性,但对人类来说很容易。但是,我们将看到您可以将Playwright 与补充工具结合使用来摆脱它们。

medium_captcha

一个重要的教训是,您可以 A) 在测试出现时解决或 B) 阻止它出现并在显示时重试

在第一种情况下,您需要使用 Playwright CAPTCHA 求解器,并且它可能会在规模上变得昂贵。在第二种情况下,您的爬虫需要更好地模拟人类行为以保持低调。我们将看到这两种方法,但第二种方法是作为基础的最佳实践。

现在,让我们看看如何实施它们!

方法#1:使用 Base Playwright 和 2Captcha 绕过验证码

我们将讨论的第一种方法是将 Playwright 与2Captcha结合使用,这是一种通过雇用人员代表您来解决 CAPTCHA 的服务。

medium_2captcha

要开始绕过 Playwright CAPTCHA,请先安装库。

npm install playwright

然后,注册一个2Captcha帐户以获取您的 API 密钥并安装软件包。

npm install 2captcha

现在,转到您的代码编辑器,导入这两个库并创建一个async启动无头 Chrome 浏览器的函数(与headless: true生产中一样)。

// Start with calling both Playwright and 2captcha
const { chromium } = require('playwright');
const Captcha = require("2captcha");

(async () => {
  const browser = await chromium.launch({ headless: true });
  const page = await browser.newPage();

将您的 API 密钥传递到一个Captcha.Solver类中,以便稍后在代码中访问 2Captcha 服务。

// Insert your API key here
  const solver = new Captcha.Solver("<Your 2Captcha API key>");

导航到包含 reCAPTCHA 任务的演示页面,等待测试 iframe 的加载并通过 检索其内容captchaFrame.contentFrame()。这将使您能够找到并操纵解决挑战所需的基本要素。

// Call ReCaptcha Website
  const websiteUrl = "https://patrickhlauke.github.io/recaptcha/";
  await page.goto(websiteUrl);

  // Wait for the CAPTCHA element to load
  const captchaFrame = await page.waitForSelector("iframe[src*='recaptcha/api2']");

  // Switch to the CAPTCHA iframe
  const captchaFrameContent = await captchaFrame.contentFrame();

  // Wait for the CAPTCHA checkbox to appear
  const captchaCheckbox = await captchaFrameContent.waitForSelector("#recaptcha-anchor");

  // Click the CAPTCHA checkbox
  await captchaCheckbox.click();

要获得所需的答案,请调用该solver.recaptcha()方法向 2Captcha 的 API 发送请求并检索包含正确答案的响应字符串。6Ld2sf4SAAAAAKSgzs0Q13IZhY02Pyo31S2jgOB5在这里,从 CAPTCHA传递 data-sitekey 参数(即 )是至关重要的,CAPTCHA 是网站采用的挑战类型的唯一标识符。

得到答案后,单击“提交”按钮。

 // Wait for the CAPTCHA challenge to be solved by 2Captcha
  const captchaResponse = await solver.recaptcha("6Ld2sf4SAAAAAKSgzs0Q13IZhY02Pyo31S2jgOB5", websiteUrl);

  // Fill in the CAPTCHA response and submit the form
  const captchaInput = await captchaFrameContent.waitForSelector("#g-recaptcha-response");
  await captchaInput.evaluate((input, captchaResponse) => {
    input.value = captchaResponse;
  }, captchaResponse);
  await captchaFrameContent.waitForSelector("button[type='submit']").then((button) => button.click());

  // Wait for the page to navigate to the next page
  await page.waitForNavigation();

  console.log("CAPTCHA solved successfully!");

  await browser.close();
})();

然而,虽然 2Captcha 可以作为测试和小规模数据提取的有用解决方案,但它并不是大规模网络抓取或解决所有 CAPTCHA 类型的最具成本效益的选择。最好的方法是防止提示挑战。

方法 #2:使用 Playwright 和 Stealth 插件

如果您需要从使用更复杂的 CAPTCHA 挑战的网站上抓取数据,那么之前的 Playwright 设置将不起作用,但Stealth 插件是一个方便的解决方案。这是一个开源项目,通过附加功能来增强 Playwright 以模仿人类网络流量:

  • 掩盖了您的 User-Agent
  • 禁用 WebRTC以防止 IP 地址识别。虽然它没有明确阻止跟踪脚本,但它仍然通过隐藏浏览数据来维护隐私。
  • 它将其他元素添加到您的无头浏览器中,使您的请求看起来更自然。

让我们的示例更加生动,并使用具有基本Cloudflare 保护的网站Astra进行测试。

在开始之前,通过在项目文件夹中运行此命令来安装所需的依赖项:

npm install playwright playwright-extra

注意:您可以在框架中找到 Stealth 插件playwright-extra

通过调用无头 Chrome 浏览器playwright-extrapuppeteer-extra-plugin-stealth启用chromium.use(pluginStealth). 这种工具组合提供了额外的措施,使网站更难检测到您的网络抓取工具。

const { chromium } = require('playwright-extra')
// Load the stealth plugin and use defaults (all tricks to hide playwright usage)
const pluginStealth = require("puppeteer-extra-plugin-stealth");  

// Use stealth
chromium.use(pluginStealth)

// That's it, the rest is playwright usage as normal 😊
chromium.launch({ headless: true }).then(async browser => {

  // Create a new page 
  const page = await browser.newPage()

  // Go to the website 
  await page.goto('https://www.getastra.com/')

   // Wait for page to download
  await page.waitForTimeout(1000); 
   
  // Take screenshot 
  await page.screenshot({ path: 'screen.png'})

  // Close the browser 
  console.log('All done, check the screenshot. ✨')
  await browser.close()
})

browser.newPage()使用并调用函数加载新网页后page.goto(),我们的网站就可以被抓取了。

您的脚本现在功能齐全,可以捕获屏幕截图,如下所示:

使用 Stealth 插件的 Playwright 比以前的方法更容易、更可靠地绕过验证码。但是,某些 CAPTCHA 系统可能仍会检测并阻止您的机器人。

例如,当尝试抓取具有更严格 Cloudflare 保护的网站(如G2)时,您可能会Access denied在使用 Stealth 插件时遇到一条消息。

medium_Stealth2

这种情况的最终解决方案是 ZenRows。让我们了解一下吧!

方法 #3:ZenRows 的最佳验证码绕过

与 Playwright 和其他网络自动化框架不同,ZenRows 是专门为网络爬行而设计的。它甚至可以解决顶级安全系统最复杂的挑战,例如 Cloudflare(1/5 的互联网站点使用)和DataDome。接下来,您将使用它来抓取 G2 以查看它是否有效。

要试用 ZenRows,请注册以获取免费的 API 密钥并通过运行以下命令进行安装:

npm install zenrows

然后,使用以下代码执行启用了js_render,antibot和的 API 请求premium_proxy

const { ZenRows } = require("zenrows");

(async () => {
    const client = new ZenRows("<Your api key>");
    const url = "https://www.g2.com/";

    try {
        const { data } = await client.get(url, {
            "js_render": "true",
            "antibot": "true",
            "premium_proxy": "true"
});
        console.log(data);
    } catch (error) {
        console.error(error.message);
        if (error.response) {
            console.error(error.response.data);
        }
    }
})();

注意:请记住添加您的 API 密钥。

运行它并等待美丽的成功。

medium_zenrows

结论

使用 Playwright 绕过验证码可能是一项艰巨的任务,因为这个流行的挑战旨在防止自动访问网站。但是,通过使用正确的工具和库,您将能够抓取所需的数据。

在本文中,我们看到了三种处理验证码的不同方法:

  • 使用基础 Playwright 和 2Captcha。
  • 将 Playwright 与 Stealth 插件一起使用。
  • 使用 ZenRows 屏蔽请求。

类似文章