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:
googlekey— la clave pública del sitio incrustada en la página HTMLpageurl— 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
- Obtenga su clave API encaptchaai.com/api.php
- Extraiga la clave del sitio de la página de destino
- Utilice los ejemplos de código anteriores para resolver e inyectar
- 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