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