Scraping BrowserCaracterísticasPrivacidad avanzada y anti-detecciónResolución de Captcha

CAPTCHAs Soportados

reCaptcha

El navegador rastreador Scrapeless solo te ayuda a resolver automáticamente reCaptchaV2; las operaciones subsiguientes deben ser implementadas por ti mismo.

Cloudflare

  • Cloudflare Turnstile
  • Cloudflare Challenge

El navegador rastreador Scrapeless solo te ayuda a resolver automáticamente Turnstile o Challenge; las operaciones subsiguientes deben ser implementadas por ti mismo. Para prácticas detalladas sobre cómo manejar los desafíos de Cloudflare (incluida la obtención de cf_clearance), consulta: 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 simple: Este ejemplo accede al sitio objetivo y confirma que el CAPTCHA se ha resuelto correctamente escuchando el evento CDP Captcha.solveFinished. Finalmente, tomará una captura de pantalla de la página para su verificación.

Este ejemplo define dos métodos principales:

  • addCaptchaListener: Se usa para escuchar eventos de CAPTCHA en la sesión del navegador
  • onCaptchaFinished: Se usa para esperar a que se complete la resolución del CAPTCHA

Lista de CAPTCHA Soportados

  • reCaptcha v2
  • Cloudflare Turnstile
  • Cloudflare 5s Challenge
  • AWS Challenge
import puppeteer from "puppeteer-core";
import EventEmitter from 'events';
const emitter = new EventEmitter()
const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=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 reCaptcha

Llama 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 Cloudflare Turnstile

Llama 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 se puede confirmar no solo escuchando el evento CDP Captcha.solveFinished, sino también escuchando window.turnstile.getResponse(). Este es un ejemplo completo:

import puppeteer from "puppeteer-core";
const scrapelessUrl = 'wss://browser.scrapeless.com/browser?token=your_api_key&session_ttl=180&proxy_country=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 Cloudflare Challenge

Cloudflare Challenge es especial porque a veces no activará un Cloudflare Challenge, y el método de confirmar la resolución exitosa escuchando eventos CDP se agotará el tiempo de espera. Por lo tanto, esperar la aparición de elementos en la página después de 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/browser?token=your_api_key&session_ttl=180&proxy_country=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');