如何使用 Playwright 绕过验证码
您是否遇到过任何验证码阻止您的网络抓取工具?在自动化数据收集时,这些挑战可能令人头疼。幸运的是,您可以使用Playwright绕过验证码,我们将向您介绍三种方法:
Playwright能破解验证码吗?
验证码的目的是对机器人具有挑战性,但对人类来说很容易。但是,我们将看到您可以将Playwright 与补充工具结合使用来摆脱它们。
一个重要的教训是,您可以 A) 在测试出现时解决或 B) 阻止它出现并在显示时重试。
在第一种情况下,您需要使用 Playwright CAPTCHA 求解器,并且它可能会在规模上变得昂贵。在第二种情况下,您的爬虫需要更好地模拟人类行为以保持低调。我们将看到这两种方法,但第二种方法是作为基础的最佳实践。
现在,让我们看看如何实施它们!
方法#1:使用 Base Playwright 和 2Captcha 绕过验证码
我们将讨论的第一种方法是将 Playwright 与2Captcha结合使用,这是一种通过雇用人员代表您来解决 CAPTCHA 的服务。
要开始绕过 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-extra
并puppeteer-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 插件时遇到一条消息。
这种情况的最终解决方案是 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 密钥。
结论
使用 Playwright 绕过验证码可能是一项艰巨的任务,因为这个流行的挑战旨在防止自动访问网站。但是,通过使用正确的工具和库,您将能够抓取所需的数据。
在本文中,我们看到了三种处理验证码的不同方法:
- 使用基础 Playwright 和 2Captcha。
- 将 Playwright 与 Stealth 插件一起使用。
- 使用 ZenRows 屏蔽请求。