Explainers

Cómo manejar reCAPTCHA v2 en flujos de trabajo de Web Scraping

Cuando su raspador enfrenta un desafío reCAPTCHA v2, el flujo de trabajo se detiene. La página espera a que un humano resuelva la casilla de verificación o la cuadrícula de imágenes antes de entregar los datos que necesita. La forma más rápida de reanudar el scraping es dirigir el CAPTCHA a una API de solución: extraiga la clave del sitio y la URL de la página, envíelas aCaptchaAI, reciba un token válido y vuelva a inyectarlo en la página.

Esta guía muestra el flujo completo con el código de trabajo para Python (solicitudes Selenium +) y Node.js (Puppeteer).


Cómo funciona el flujo de trabajo

Cada widget reCAPTCHA v2 tiene dos parámetros que su raspador necesita:

  1. googlekey — la clave pública del sitio incrustada en la página HTML
  2. pageurl — la URL donde aparece el CAPTCHA

Su raspador los envía a la API CaptchaAI, espera un token resuelto y vuelve a inyectar el token en el campo g-recaptcha-response de la página (o llama a la función de devolución de llamada). El backend del sitio de destino verifica el token con Google y permite pasar la solicitud.


Python: Selenio + CaptchaAI

import requests
import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# Step 1: Open the page with Selenium
driver = webdriver.Chrome()
driver.get("https://example.com/protected-page")

# Step 2: Extract the sitekey
sitekey = driver.find_element(By.CSS_SELECTOR, ".g-recaptcha").get_attribute("data-sitekey")
page_url = driver.current_url

# Step 3: Submit to CaptchaAI
response = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": sitekey,
    "pageurl": page_url,
    "json": 1
}).json()

task_id = response["request"]

# Step 4: Poll for result
token = None
for _ in range(40):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY",
        "action": "get",
        "id": task_id,
        "json": 1
    }).json()

    if result.get("status") == 1:
        token = result["request"]
        break
    if result.get("request") != "CAPCHA_NOT_READY":
        raise RuntimeError(f"Solve failed: {result['request']}")

# Step 5: Inject the token and submit
driver.execute_script(
    f'document.getElementById("g-recaptcha-response").innerHTML = "{token}";'
)

# Check for callback
callback = driver.execute_script(
    'var el = document.querySelector(".g-recaptcha"); '
    'return el ? el.getAttribute("data-callback") : null;'
)
if callback:
    driver.execute_script(f'{callback}("{token}");')
else:
    driver.find_element(By.CSS_SELECTOR, "form").submit()

# Step 6: Scrape the data
print(driver.page_source[:500])
driver.quit()

Node.js: Puppeteer + CaptchaAI

const puppeteer = require("puppeteer");

async function scrapeWithCaptcha(url) {
  const browser = await puppeteer.launch({ headless: "new" });
  const page = await browser.newPage();
  await page.goto(url, { waitUntil: "networkidle2" });

  // Extract sitekey
  const sitekey = await page.$eval(".g-recaptcha", (el) => el.dataset.sitekey);

  // Submit to CaptchaAI
  const submitRes = await fetch(
    `https://ocr.captchaai.com/in.php?${new URLSearchParams({
      key: "YOUR_API_KEY",
      method: "userrecaptcha",
      googlekey: sitekey,
      pageurl: url,
      json: 1,
    })}`
  );
  const { request: taskId } = await submitRes.json();

  // Poll for result
  let token;
  for (let i = 0; i < 40; i++) {
    await new Promise((r) => setTimeout(r, 5000));
    const res = await fetch(
      `https://ocr.captchaai.com/res.php?${new URLSearchParams({
        key: "YOUR_API_KEY",
        action: "get",
        id: taskId,
        json: 1,
      })}`
    );
    const data = await res.json();
    if (data.status === 1) {
      token = data.request;
      break;
    }
    if (data.request !== "CAPCHA_NOT_READY")
      throw new Error(`Solve failed: ${data.request}`);
  }

  // Inject token
  await page.evaluate((t) => {
    document.getElementById("g-recaptcha-response").innerHTML = t;
    const cb = document.querySelector(".g-recaptcha")?.dataset.callback;
    if (cb && window[cb]) window[cb](t);
  }, token);

  // Wait for navigation after form submit
  await page.waitForNavigation({ waitUntil: "networkidle2" });
  const content = await page.content();
  await browser.close();
  return content;
}

scrapeWithCaptcha("https://example.com/protected-page").then(console.log);

Modo sin cabeza versus modo con cabeza

Algunos sitios detectan navegadores sin cabeza y los bloquean incluso antes de que aparezca el CAPTCHA. Si te bloquean antes de ver reCAPTCHA:

  • Utilice headless: "new" en Puppeteer (modo diagnóstico controladoso más nuevo)
  • Agregue `` a las banderas de Chromium
  • Utilice una cadena de agente de usuario real
  • Considere usar la rotación de proxy con sus soluciones CaptchaAI

Enfoque solo HTTP (sin navegador)

Si el sitio de destino envía el CAPTCHA en un flujo de envío de formulario, puede omitir el navegador por completo:

import requests
import time

session = requests.Session()
session.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0"

# Load the page to get cookies
session.get("https://example.com/protected-page")

# Solve the CAPTCHA
sitekey = "6Le-wvkSAAAAAN..."  # extracted from page HTML
solve_resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY", "method": "userrecaptcha",
    "googlekey": sitekey, "pageurl": "https://example.com/protected-page",
    "json": 1
}).json()

task_id = solve_resp["request"]
time.sleep(15)

# Poll
for _ in range(30):
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY", "action": "get", "id": task_id, "json": 1
    }).json()
    if result.get("status") == 1:
        token = result["request"]
        break
    time.sleep(5)

# Submit with token
resp = session.post("https://example.com/protected-page", data={
    "g-recaptcha-response": token,
    "other_field": "value"
})
print(resp.text[:500])

Preguntas frecuentes

¿Resolver reCAPTCHA v2 ralentiza mi raspador?

Cada resolución tarda entre 15 y 60 segundos. Para raspado de gran volumen, ejecute varias soluciones en paralelo (CaptchaAI admite tareas simultáneas por subproceso).

¿Puedo almacenar en caché los tokens reCAPTCHA?

No. Cada token es de un solo uso y caduca después de aproximadamente 2 minutos. Necesita una nueva solución para cada solicitud de página protegida.

¿Necesito un navegador para manejar reCAPTCHA v2?

No siempre. Si el sitio acepta g-recaptcha-response como campo POST, puede utilizar un enfoque solo HTTP. Si el sitio requiere una inyección de token basada en JavaScript, necesita un navegador.

¿Cómo manejo los proxies rotativos con CaptchaAI?

CaptchaAI resuelve CAPTCHA en su propia infraestructura; no necesita pasar su proxy para el reCAPTCHA v2 estándar. Utilice sus servidores proxy para las solicitudes de raspado que siguen.

¿Qué pasa si el sitio utiliza Enterprise reCAPTCHA?

Agregue enterprise=1 a su solicitud CaptchaAI. VerCómo resolver reCAPTCHA v2 Enterprise usando API.


Comience a buscar en reCAPTCHA v2

  1. Obtenga su clave API encaptchaai.com/api.php
  2. Extraiga la clave del sitio de la página de destino
  3. Utilice los ejemplos de código anteriores para resolver e inyectar
  4. Escale con soluciones simultáneas para flujos de trabajo de gran volumen

Guías relacionadas

  • Cómo resolver reCAPTCHA v2 usando API
  • Manejo de Selenium CAPTCHA con Python
  • Puppeteer Captcha Resolviendo Node.js
  • Errores comunes de resolución de reCAPTCHA v2
Los comentarios están deshabilitados para este artículo.

Publicaciones relacionadas

Explainers Análisis profundo de la API de evaluación empresarial reCAPTCHA
Explicación clara sobre Análisis profundo de la API de evaluación empresarial re CAPTCHA y lo que implica para automatización, integración y tasas de éxito con...

Explicación clara sobre Análisis profundo de la API de evaluación empresarial re CAPTCHA y lo que implica para...

Apr 28, 2026
Explainers Guía de extracción de URL de reCAPTCHA Anchor y Bframe
Explicación clara sobre Guía de extracción de URL de re CAPTCHA Anchor y Bframe y lo que implica para automatización, integración y tasas de éxito con Captcha A...

Explicación clara sobre Guía de extracción de URL de re CAPTCHA Anchor y Bframe y lo que implica para automati...

Apr 28, 2026