在Puppeteer中进行Web Scraping时如何处理验证码?

问题描述 投票:1回答:2

我正在使用Puppeteer进行Web Scraping,我刚刚注意到,有时候,我正试图抓取的网站要求验证码,因为我正在通过计算机进行访问。验证码表格看起来像这样:

所以,我需要有关如何处理这个问题的帮助。我一直在考虑将验证码表单发送到客户端,因为我使用Express和EJS将值发送到我的索引网站,但我不知道Puppeteer是否可以发送类似的东西。

有任何想法吗?

javascript web-scraping captcha puppeteer
2个回答
4
投票

这是一个reCAPTCHA(版本2,请查看demos here),它会显示给您,因为该页面的所有者不希望您自动抓取该页面。

您的选择如下:

选项1:停止抓取或尝试使用官方API

由于页面所有者不希望您抓取该页面,因此您可以简单地尊重该决定并停止抓取。也许有一个可以使用的文档化API。

选项2:自动化/外包验证码解决方案

整个行业都有人(通常在发展中国家)为其他人的机器人填写验证码。我不会链接到任何特定网站,但您可以查看Md.Abu Taher的其他答案,了解有关该主题的更多信息或搜索验证码求解器。

选项3:自己解决验证码

为此,让我解释一下reCAPTCHA如何工作以及当您使用它访问页面时会发生什么。


How reCAPTCHA (v2) works

每个页面都有一个ID,您可以通过查看源代码来检查,例如:

<div class="g-recaptcha form-field" data-sitekey="ID_OF_THE_WEBSITE_LONG_RANDOM_STRING"></div>

加载reCAPTCHA代码后,它会向表单添加一个没有值的响应textarea。它看起来像这样:

<textarea id="g-recaptcha-response" name="g-recaptcha-response" class="g-recaptcha-response" style="... display: none;"></textarea>

解决了挑战之后,reCAPTCHA会在提交表单时向此文本字段添加一个非常长的字符串(之后可以由后端的server / reCAPTCHA服务检查)。


How to solve the captcha yourself

通过复制textarea字段的值,您可以将“已解决的挑战”从一个浏览器传输到另一个浏览器(这也是为您解决的服务)。整个过程如下所示:

  1. 检测页面是否在“抓取”浏览器中使用reCAPTCHA(例如检查.g-recaptcha
  2. 使用相同的URL以非无头模式打开第二个浏览器
  3. 自己解决验证码
  4. 阅读来自:document.querySelector('#g-recaptcha-response').value的值
  5. 将该值放入第一个浏览器:document.querySelector('#g-recaptcha-response').value = '...'
  6. 提交表格

Further information/reading

谷歌没有太多的公开信息reCAPTCHA是如何工作的,因为这是僵尸网络创建者和谷歌检测算法之间的猫捉老鼠游戏,但有一些资源在线提供更多信息:

  • Official docs from Google:显然,他们只是解释基础知识,而不是“在后面”如何工作
  • InsideReCaptcha:这是2014年的一个项目,试图“逆向工程”reCAPTCHA。虽然这已经很老了,但页面上仍然有很多有用的信息。
  • Another question on stackoverflow:这个问题包含一些有关reCAPTCHA的有用信息,但也包含许多关于如何欺骗reCAPTCHA的推测(并且非常可能)过时的方法。

3
投票

您应该使用以下组合:

  • 如果目标网站提供API,请使用API​​。这是最合法的方式。
  • 增加抓取请求之间的等待时间,不向服务器发送批量请求。
  • 经常更改/轮换IP。
  • 更改用户代理,浏览器视口大小和指纹。
  • 使用第三方解决方案进行验证码。
  • 自己解决验证码,检查Thomas Dondorf的答案。基本上你需要等待验证码出现在另一个浏览器上,从那里解决它。第三方解决方案为您完成此任务。

免责声明:请勿使用反验证码插件/服务来滥用资源。资源很贵。


基本上,我们的想法是使用像(2captcha)这样的反验证码服务来处理持久的recaptcha。

您可以使用berstend这个名为puppeteer-extra-plugin-recaptcha的插件。

// puppeteer-extra is a drop-in replacement for puppeteer,
// it augments the installed puppeteer with plugin functionality
const puppeteer = require('puppeteer-extra')

// add recaptcha plugin and provide it your 2captcha token
// 2captcha is the builtin solution provider but others work as well.
const RecaptchaPlugin = require('puppeteer-extra-plugin-recaptcha')
puppeteer.use(
  RecaptchaPlugin({
    provider: { id: '2captcha', token: 'XXXXXXX' },
    visualFeedback: true // colorize reCAPTCHAs (violet = detected, green = solved)
  })
)

之后您可以照常运行浏览器。它将在页面上拾取任何验证码并尝试解决它。您必须找到提交按钮,如果存在,则会因站点而异。

// puppeteer usage as normal
puppeteer.launch({ headless: true }).then(async browser => {
  const page = await browser.newPage()
  await page.goto('https://www.google.com/recaptcha/api2/demo')

  // That's it, a single line of code to solve reCAPTCHAs 🎉
  await page.solveRecaptchas()

  await Promise.all([
    page.waitForNavigation(),
    page.click(`#recaptcha-demo-submit`)
  ])
  await page.screenshot({ path: 'response.png', fullPage: true })
  await browser.close()
})

PS:

  • 还有其他插件,即使我做了一个非常简单的插件,因为即使像我这样的人类,验证码也越来越难以解决。您可以阅读代码here
  • 我强烈不隶属于2Captcha或上述任何其他第三方服务。
  • 我已经创建了自己的解决方案,这与Thomas Dondorf的其他答案类似,但很快就放弃了,因为Captcha变得越来越荒谬,我没有足够的精力去解决它们。
© www.soinside.com 2019 - 2024. All rights reserved.