Resolución de CAPTCHA
reCaptcha
El navegador de extracción de datos de Scrapeless solo le ayuda a resolver automáticamente reCaptchaV2; las operaciones posteriores deben implementarse por su cuenta.
Cloudflare
- Cloudflare Turnstile
- Cloudflare Challenge
El navegador de extracción de datos de Scrapeless solo le ayuda a resolver automáticamente Turnstile o Challenge; las operaciones posteriores deben implementarse por su cuenta. Para prácticas detalladas sobre cómo manejar los desafíos de Cloudflare (incluida la obtención de
cf_clearance), consulte: https://www.scrapeless.com/en/blog/cloudflare-challenge-bypass
Ejemplo de solución
Cuando nos conectamos al navegador para acceder al sitio objetivo, Scrapeless resolverá automáticamente el CAPTCHA. Sin embargo, debemos asegurarnos de que el CAPTCHA se haya resuelto correctamente. Este es un ejemplo sencillo: este ejemplo accede al sitio objetivo y confirma que el CAPTCHA se ha resuelto con éxito escuchando el evento Captcha.solveFinished CDP. Finalmente, tomará una captura de pantalla de la página para su verificación.
Este ejemplo define dos métodos principales:
addCaptchaListener: utilizado para escuchar eventos de CAPTCHA en la sesión del navegadoronCaptchaFinished: utilizado para esperar a que finalice la resolución del CAPTCHA
Lista de CAPTCHA compatibles
- reCaptcha v2
- Cloudflare Turnstile
- Desafío Cloudflare de 5 segundos
- AWS Challenge
import puppeteer from "puppeteer-core";
import EventEmitter from 'events';
const emitter = new EventEmitter()
const scrapelessUrl = 'wss://browser.scrapeless.com/api/v2/browser?token=your_api_key&sessionTTL=180&proxyCountry=ANY';
export async function example(url) {
const browser = await puppeteer.connect({
browserWSEndpoint: scrapelessUrl,
defaultViewport: null
});
console.log("Verbonden met Scrapeless browser");
try {
const page = await browser.newPage();
// Listen for captcha events
console.debug("addCaptchaListener: Start listening for captcha events");
await addCaptchaListener(page);
console.log("Navigated to URL:", url);
await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 });
console.log("onCaptchaFinished: Waiting for captcha solving to finish...");
await onCaptchaFinished()
// Screenshot for debugging
console.debug("Taking screenshot of the final page...");
await page.screenshot({ path: 'screenshot.png', fullPage: true });
} catch (error) {
console.error(error);
} finally {
await browser.close();
console.log("Browser closed");
}
}
async function addCaptchaListener(page) {
const client = await page.createCDPSession();
client.on("Captcha.detected", (msg) => {
console.debug("Captcha.detected: ", msg);
});
client.on("Captcha.solveFinished", async (msg) => {
console.debug("Captcha.solveFinished: ", msg);
emitter.emit("Captcha.solveFinished", msg);
client.removeAllListeners()
});
}
async function onCaptchaFinished(timeout = 60_000) {
return Promise.race([
new Promise((resolve) => {
emitter.on("Captcha.solveFinished", (msg) => {
resolve(msg);
});
}),
new Promise((_, reject) => setTimeout(() => reject('Timeout'), timeout))
])
}Ejemplo de reCaptcha
Llame al método del código de ejemplo para verificar la resolución automática de reCaptcha.
example('https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox-explicit.php');Ejemplo de Cloudflare Turnstile
Llame al método del código de ejemplo para verificar la resolución automática de Cloudflare Turnstile.
example('https://www.scrapingcourse.com/login/cf-turnstile');La resolución exitosa de Cloudflare Turnstile puede confirmarse no solo escuchando el evento Captcha.solveFinished CDP, sino también escuchando window.turnstile.getResponse(). Este es un ejemplo completo:
import puppeteer from "puppeteer-core";
const scrapelessUrl = 'wss://browser.scrapeless.com/api/v2/browser?token=your_api_key&sessionTTL=180&proxyCountry=ANY';
export async function turnstileExample(url) {
const browser = await puppeteer.connect({
browserWSEndpoint: scrapelessUrl,
defaultViewport: null
});
console.log("Verbonden met Scrapeless browser");
try {
const page = await browser.newPage();
console.log("Navigated to URL:", url);
await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 });
console.log("onCaptchaFinished: Waiting for captcha solving to finish...");
await waitTurnstile(page)
// Screenshot for debugging
console.debug("Taking screenshot of the final page...");
await page.screenshot({ path: 'screenshot.png', fullPage: true });
} catch (error) {
console.error(error);
} finally {
await browser.close();
console.log("Browser closed");
}
}
async function waitTurnstile(page) {
await page.waitForFunction(() => {
return window.turnstile && window.turnstile.getResponse();
});
const token = await page.evaluate(() => {
return window.turnstile.getResponse();
});
console.log("Cloudflare Turnstile token:", token);
}
turnstileExample('https://www.scrapingcourse.com/login/cf-turnstile');Ejemplo de desafío de Cloudflare
El desafío de Cloudflare es especial porque a veces no activará un desafío de Cloudflare, y el método de confirmar la resolución exitosa mediante escucha de eventos CDP expirará. Por lo tanto, esperar la aparición de elementos en la página tras la resolución es un método más estable. Este es un ejemplo completo:
import puppeteer from "puppeteer-core";
const scrapelessUrl = 'wss://browser.scrapeless.com/api/v2/browser?token=your_api_key&sessionTTL=180&proxyCountry=ANY';
export async function challengeExample(url) {
const browser = await puppeteer.connect({
browserWSEndpoint: scrapelessUrl,
defaultViewport: null
});
console.log("Verbonden met Scrapeless browser");
try {
const page = await browser.newPage();
console.log("Navigated to URL:", url);
await page.goto(url, { waitUntil: "domcontentloaded", timeout: 30000 });
console.log("onCaptchaFinished: Waiting for captcha solving to finish...");
await waitChallenge(page, 'main.page-content .challenge-info')
// Screenshot for debugging
console.debug("Taking screenshot of the final page...");
await page.screenshot({ path: 'screenshot.png', fullPage: true });
} catch (error) {
console.error(error);
} finally {
await browser.close();
console.log("Browser closed");
}
}
async function waitChallenge(page, selector) {
await page.waitForSelector(selector);
console.log("Cloudflare Challenge completed");
}
challengeExample('https://www.scrapingcourse.com/cloudflare-challenge');