Use Cases

CAPTCHA Scraping con Python: Guía completa

La biblioteca requests de Python maneja HTTP de manera eficiente, pero los CAPTCHA requieren un solucionador externo. Esta guía muestra cómo integrar CaptchaAI en scripts de scraping Python; no se necesita un navegador para la mayoría de los sitios.

Requisitos

Requisito Detalles
Pitón 3.7+ con pepita
solicitudes pip install requests
hermosasopa4 pip install beautifulsoup4
Clave API CaptchaAI Desde captchaai.com

La clase auxiliar CaptchaAI

Cree una clase de resolución reutilizable para sus proyectos de Python:

import requests
import time

class CaptchaSolver:
    def __init__(self, api_key):
        self.api_key = api_key
        self.base = "https://ocr.captchaai.com"

    def _submit(self, params):
        params["key"] = self.api_key
        resp = requests.get(f"{self.base}/in.php", params=params)
        if not resp.text.startswith("OK|"):
            raise Exception(f"Submit error: {resp.text}")
        return resp.text.split("|")[1]

    def _poll(self, task_id, timeout=300):
        deadline = time.time() + timeout
        while time.time() < deadline:
            time.sleep(5)
            resp = requests.get(f"{self.base}/res.php", params={
                "key": self.api_key,
                "action": "get",
                "id": task_id
            })
            if resp.text == "CAPCHA_NOT_READY":
                continue
            if resp.text.startswith("OK|"):
                return resp.text.split("|")[1]
            raise Exception(f"Solve error: {resp.text}")
        raise TimeoutError("Solve timed out")

    def solve_recaptcha_v2(self, site_key, page_url):
        task_id = self._submit({
            "method": "userrecaptcha",
            "googlekey": site_key,
            "pageurl": page_url
        })
        return self._poll(task_id)

    def solve_recaptcha_v3(self, site_key, page_url, action="verify"):
        task_id = self._submit({
            "method": "userrecaptcha",
            "googlekey": site_key,
            "pageurl": page_url,
            "version": "v3",
            "action": action
        })
        return self._poll(task_id)

    def solve_turnstile(self, site_key, page_url):
        task_id = self._submit({
            "method": "turnstile",
            "sitekey": site_key,
            "pageurl": page_url
        })
        return self._poll(task_id)

    def solve_image(self, image_base64):
        task_id = self._submit({
            "method": "base64",
            "body": image_base64
        })
        return self._poll(task_id)

Eliminación de un formulario protegido por reCAPTCHA

from bs4 import BeautifulSoup
import requests

solver = CaptchaSolver("YOUR_API_KEY")
session = requests.Session()
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
})

# Step 1: Load the page
url = "https://example.com/search"
page = session.get(url)
soup = BeautifulSoup(page.text, "html.parser")

# Step 2: Extract the site key
recaptcha_div = soup.find("div", class_="g-recaptcha")
site_key = recaptcha_div["data-sitekey"]

# Step 3: Solve the CAPTCHA
token = solver.solve_recaptcha_v2(site_key, url)

# Step 4: Submit the form with the token
form_data = {
    "q": "search term",
    "g-recaptcha-response": token
}
result = session.post(url, data=form_data)

# Step 5: Parse the results
result_soup = BeautifulSoup(result.text, "html.parser")
items = result_soup.find_all("div", class_="result-item")
for item in items:
    print(item.text.strip())

Scraping de varias páginas

Para resultados paginados detrás de CAPTCHA:

def scrape_all_pages(base_url, site_key, max_pages=10):
    solver = CaptchaSolver("YOUR_API_KEY")
    session = requests.Session()
    session.headers.update({
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    })
    all_results = []

    for page_num in range(1, max_pages + 1):
        page_url = f"{base_url}?page={page_num}"

        # Solve CAPTCHA for each page if needed
        token = solver.solve_recaptcha_v2(site_key, page_url)

        resp = session.get(page_url, params={
            "g-recaptcha-response": token,
            "page": page_num
        })

        soup = BeautifulSoup(resp.text, "html.parser")
        items = soup.find_all("div", class_="item")

        if not items:
            break

        all_results.extend([item.text.strip() for item in items])
        print(f"Page {page_num}: {len(items)} items")

        time.sleep(2)  # Polite delay

    return all_results

Manejo de CAPTCHA de imágenes

Para sitios con CAPTCHA de texto basados en imágenes:

import base64

def scrape_with_image_captcha(url):
    solver = CaptchaSolver("YOUR_API_KEY")
    session = requests.Session()

    page = session.get(url)
    soup = BeautifulSoup(page.text, "html.parser")

    # Find the CAPTCHA image
    captcha_img = soup.find("img", {"id": "captcha-image"})
    captcha_url = captcha_img["src"]

    # Download and encode the image
    img_resp = session.get(captcha_url)
    img_base64 = base64.b64encode(img_resp.content).decode()

    # Solve
    captcha_text = solver.solve_image(img_base64)

    # Submit
    form_data = {
        "captcha": captcha_text,
        "username": "user"
    }
    result = session.post(url, data=form_data)
    return result.text

Manejo de errores y reintentos

Agrega lógica de reintento para scrapers de producción:

def solve_with_retry(solver, site_key, page_url, max_retries=3):
    for attempt in range(max_retries):
        try:
            return solver.solve_recaptcha_v2(site_key, page_url)
        except Exception as e:
            if attempt == max_retries - 1:
                raise
            print(f"Attempt {attempt + 1} failed: {e}. Retrying...")
            time.sleep(2)

Solución de problemas

Problema causa Solución
ERROR_WRONG_USER_KEY Clave API no válida Verificar clave desde el panel
ERROR_ZERO_BALANCE Sin fondos Recarga tu cuenta
El envío del formulario devuelve la página CAPTCHA nuevamente Token caducado o nombre de campo incorrecto Utilice el token inmediatamente; comprobar los nombres de los campos del formulario
ConnectionError Problema de red Agregar lógica de reintento con retroceso exponencial
Resultados vacíos después del envío El sitio requiere cookies/session Utilice requests.Session() para mantener las cookies

Preguntas frecuentes

¿Necesito Selenium para scraping de CAPTCHA en Python?

No siempre. Si el formulario del sitio funciona con peticiones HTTP POST estándar, requests + CaptchaAI es más rápido y ligero que Selenium. Usa Selenium solo cuando el sitio requiera renderizado JavaScript.

¿Puedo resolver CAPTCHA de forma asincrónica?

Sí. Utilice aiohttp con la API de CaptchaAI para flujos de trabajo asíncronos. VerIntegración aiohttp + CaptchaAI.

¿Cómo manejo la limitación de velocidad?

Agrega retrasos entre solicitudes (time.sleep(2-5)), rota los proxies y usa encabezados realistas. Ver rotación de proxies para scraping CAPTCHA.

Guías relacionadas

  • Manejo de CAPTCHA en Selenium con Python
  • CAPTCHA scraping con Node.js
  • Rotación de proxies para scraping CAPTCHA
Los comentarios están deshabilitados para este artículo.

Publicaciones relacionadas

Explainers Salida de red móvil en pruebas QA propias (editorial)
Vista editorial sobre el uso de salidas de red móviles autorizadas en pruebas QA propias y su impacto en CAPTCHA.

Vista editorial sobre el uso de salidas de red móviles autorizadas en pruebas QA propias y su impacto en CAPTC...

Apr 19, 2026