在Puppeteer中进行网页抓取时如何处理验证码?

2024-03-13

我正在使用 Puppeteer 进行网页抓取,我刚刚注意到,有时,由于我通过计算机进行的访问量很大,我尝试抓取的网站会要求输入验证码。验证码形式如下所示:

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

有任何想法吗?


这是 reCAPTCHA(版本 2,请查看演示在这里 https://recaptcha-demo.appspot.com/),向您显示该信息是因为页面所有者不希望您自动抓取该页面。

您的选择如下:

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

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

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

整个行业都有人(通常在发展中国家)为其他人的机器人填写验证码。我不会链接到任何特定网站,但您可以查看其他答案阿布·塔赫尔博士 https://stackoverflow.com/a/55498953有关该主题的更多信息或搜索验证码解算器.

选项 3:自行解决验证码

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


reCAPTCHA (v2) 的工作原理

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

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

当 reCAPTCHA 代码加载时,它会添加一个responsetextarea 到没有值的表单。它看起来像这样:

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

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


如何自己解决验证码

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

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

更多信息/阅读

谷歌没有提供太多 reCAPTCHA 到底如何工作的公开信息,因为这是机器人创建者和谷歌检测算法之间的猫鼠游戏,但网上有一些资源提供了更多信息:

  • 来自 Google 的官方文档 https://developers.google.com/recaptcha/docs/display:显然,他们只是解释了基础知识,而不是“在后面”如何工作
  • 内部验证码 https://github.com/neuroradiology/InsideReCaptcha:这是 2014 年的一个项目,试图对 reCAPTCHA 进行“逆向工程”。尽管这已经很老了,但页面上仍然有很多有用的信息。
  • stackoverflow上的另一个问题 https://stackoverflow.com/q/27286232/5627599:这个问题包含一些有关 reCAPTCHA 的有用信息,但也包含许多关于如何欺骗 reCAPTCHA 的推测性(并且很可能)过时的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在Puppeteer中进行网页抓取时如何处理验证码? 的相关文章