我正在使用Puppeteer进行Web爬网,并且我刚刚注意到,有时我试图抓取的网站会要求输入验证码,原因是我在计算机上进行的访问次数很多。验证码形式如下:
因此,我将需要有关如何处理此问题的帮助。我一直在考虑将验证码表单发送到客户端,因为我使用Express和EJS来将值发送到我的索引网站,但是我不知道Puppeteer是否可以发送类似的内容。
有什么想法吗?
答案 0 :(得分:3)
您应该使用以下组合:
免责声明:请勿使用反验证码插件/服务来滥用资源。资源很昂贵。
基本上,这个想法是使用反验证码服务(例如(2captcha))来处理持久的重新验证。
您可以使用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:
答案 1 :(得分:2)
这是一个reCAPTCHA(版本2,请检出demos here),因为页面所有者不希望您自动抓取页面而显示给您。
您的选择如下:
由于页面所有者不希望您爬网该页面,因此您只需遵守该决定并停止爬网即可。也许有一个文档化的API可供您使用。
整个行业都有人(通常在发展中国家)为其他人的机器人填充验证码。我不会链接到任何特定的网站,但是您可以从 Md查看其他答案。有关该主题的更多信息,或搜索验证码求解器。
为此,让我解释一下reCAPTCHA的工作原理以及使用该页面访问页面时会发生什么情况。
每个页面都有一个ID,您可以通过查看源代码来检查ID,例如:
<div class="g-recaptcha form-field" data-sitekey="ID_OF_THE_WEBSITE_LONG_RANDOM_STRING"></div>
加载reCAPTCHA代码后,它将在表单中添加一个 response 文本区域,不带任何值。看起来像这样:
<textarea id="g-recaptcha-response" name="g-recaptcha-response" class="g-recaptcha-response" style="... display: none;"></textarea>
解决挑战后,提交表单时,reCAPTCHA会在此文本字段中添加一个很长的字符串(稍后可以由后端的server / reCAPTCHA服务检查)。
通过复制textarea
字段的值,您可以将“已解决的挑战”从一个浏览器转移到另一个浏览器(这也是为您提供的解决服务)。整个过程如下所示:
.g-recaptcha
)document.querySelector('#g-recaptcha-response').value
document.querySelector('#g-recaptcha-response').value = '...'
由于这是机器人创建者和Google检测算法之间的猫捉老鼠游戏,因此Google并没有太多公开信息说明reCAPTCHA的工作原理,但是在线上有一些资源提供了更多信息:
答案 2 :(得分:1)
可以使用代理服务器,以便目标站点不会检测到来自单个IP地址的响应负载。
(翻译成Google翻译)
答案 3 :(得分:1)
我尝试了@Thomas Dondorf 的建议,但我认为“如何自己解决验证码”部分中描述的步骤的问题在于验证码的令牌仅有效一次。 我将在下面详细解释所有内容。
我在用什么
我使用第一个浏览器(无法解决验证码的浏览器)Google Chrome,以及第二个浏览器(我解决验证码并获取令牌的浏览器)Firefox。
步骤
document.querySelector('#g-recaptcha-response').value
,但出现错误(VM22:1 Uncaught TypeError: Cannot read property 'value' of null
at :1:48),所以我只是通过在 Google Chrome 中打开 Elements 并使用 CTRL+F 搜索 g-recaptcha-response
来搜索令牌document.querySelector('#g-recaptcha-response').value = '...'
,用刚刚复制的 recaptcha 令牌替换“...”