CAPTCHAs de Mantener Pulsado: Por Qué Aparecen y Cómo Gestionarlos
Envías una petición normal, recibes un 200 y, en lugar de la página que querías, aparece una caja gris con un botón que dice “Mantén pulsado”. Sin cuadrícula de imágenes, sin “selecciona los semáforos”, solo un botón que tienes que mantener presionado durante un par de segundos. Tu scraper no sabe qué hacer con eso, así que se queda bloqueado o devuelve una página vacía.
Este tipo de reto se ha extendido rápido por sitios de comercio electrónico, viajes y contenidos. Parece más simple que los antiguos CAPTCHAs de imágenes, y esa es la idea. No comprueba si sabes reconocer un paso de peatones. Comprueba si lo que pulsa el botón se comporta como una mano humana sobre un dispositivo real. Esta guía explica qué mide realmente el reto, por qué se dispara y cómo gestionarlo desde el lado del cliente con herramientas de código abierto.
Qué Es Realmente un CAPTCHA de Mantener Pulsado
Un CAPTCHA de mantener pulsado es un reto de JavaScript que se sirve en una página de bloqueo. Cuando un sistema antibot decide que tu sesión parece arriesgada, deja de servir el contenido real y sirve este intersticial en su lugar. El botón no es la prueba. El botón es el mecanismo que entrega la prueba.
Mientras mantienes pulsado el botón, un script en la página recoge un flujo de telemetría:
- Coordenadas del puntero a lo largo del tiempo, y cómo se desplaza mientras mantienes.
- Presión y tiempos en los eventos de pulsar y soltar.
- Micromovimientos, temblor y curvas de aceleración.
- Señales de dispositivo y navegador recogidas en segundo plano (pantalla, zona horaria, WebGL, fuentes y más).
Al final de la pulsación, el script empaqueta todo eso en una carga cifrada y la envía para su evaluación. Si el perfil parece humano, obtienes un token de autorización y la página carga. Si no, vuelves a ver el mismo muro, o un bloqueo total.
Así que no hay una “solución” en el sentido clásico. Hay una huella de comportamiento que pasa o no pasa.
Por Qué Salta el Reto en Primer Lugar
La mayoría intenta derrotar el gesto de mantener pulsado. Ese es el extremo equivocado del problema. El gesto es el último paso. El reto apareció porque algo anterior en tu sesión ya había bajado tu puntuación de confianza.
Los sistemas antibot modernos asignan a cada petición una puntuación de riesgo en tiempo real, basada en muchas señales a la vez. Las sesiones de alto riesgo reciben un reto o un bloqueo. Las de bajo riesgo pasan sin problemas y nunca ven el botón. La forma fiable de lidiar con un CAPTCHA de mantener pulsado es dejar de provocarlo.
Señales Que Bajan Tu Puntuación
Estas son las razones habituales por las que una sesión queda marcada antes de que se exija ningún gesto:
- Direcciones IP de centro de datos. El tráfico de rangos de nube (AWS, GCP, proveedores de VPS comunes) es trivial de identificar y muy poco fiable a sus ojos.
- Incoherencias en la huella. Un user-agent que dice ser Chrome en Windows mientras el handshake TLS o las propiedades de navigator dicen Linux headless es una delación clara. Las capas tienen que coincidir.
- Falta de profundidad de navegador. Los clientes HTTP en crudo no ejecutan JavaScript, no tienen canvas ni WebGL y no pueden responder a los sondeos en segundo plano. Esa ausencia es en sí misma una señal.
- Ritmo antinatural. Cincuenta peticiones por segundo desde una dirección, intervalos perfectamente uniformes, sin tiempo de reflexión. Los humanos son más ruidosos que eso.
- Señales reutilizadas o caducadas. La misma huella martilleando un endpoint, o cookies que no coinciden con el dispositivo que las presenta.
Corrige esto y el botón a menudo deja de aparecer. Eso es un resultado mucho mejor que volverse experto en mantenerlo pulsado.
Qué Ocurre Después de “Pasar”
Supongamos que consigues un token de autorización. Merece la pena saber dos cosas.
Primero, el token suele estar ligado al contexto. La autorización está atada a la dirección IP y a menudo a la huella que la obtuvo. No puedes resolver el reto en un lugar y reutilizar el token desde otro. Si delegas la resolución a un servicio de terceros que corre en una IP distinta, el token que recibes llega muerto para tu scraper. La resolución tiene que ocurrir en el mismo punto de salida que hará las peticiones siguientes.
Segundo, pasar una vez no significa que se confíe en ti para siempre. Muchos sistemas ejecutan comprobaciones de comportamiento continuas después del reto. Si el cursor empieza de repente a moverse en líneas rectas y robóticas, o el ritmo de las peticiones se vuelve mecánico, la sesión se derriba a mitad de camino. Pasar la puerta no es lo mismo que caminar por el edificio sin vigilancia.
Cómo Gestionarlo Desde el Lado del Cliente
Aquí tienes un orden práctico de operaciones, de lo más barato y de mayor impacto en adelante.
1. Usa un Navegador Real, No un Cliente en Crudo
Un reto de mantener pulsado requiere ejecución de JavaScript, gestión de eventos y un DOM real. requests y curl no pueden participar. Controla un navegador real con Playwright, Selenium o Puppeteer. Solo esto ya te permite responder a los sondeos en segundo plano que un cliente sin navegador falla por defecto.
2. Arregla la Huella Antes Que el Comportamiento
Un navegador headless por defecto delata que es headless de docenas de formas pequeñas. Antes de preocuparte por las curvas del ratón, haz que el navegador parezca uno normal:
- Ejecútalo con interfaz (headful), o usa una versión orientada al sigilo que parchee los delatores obvios como
navigator.webdrivery las señales de headless. - Mantén el user-agent, la plataforma, la zona horaria, el idioma y el viewport coherentes entre sí.
- No mezcles un user-agent móvil con un tamaño de pantalla de escritorio, ni una configuración regional de EE. UU. con una zona horaria europea.
La coherencia importa más que cualquier valor concreto. Un perfil de escritorio creíble y aburrido gana a uno exótico con una contradicción dentro.
3. Ve Más Despacio y Muévete Como una Persona
Si automatizas el gesto, no teletransportes el cursor al botón y lo mantengas exactamente 2000 milisegundos cada vez. Añade una ruta de aproximación corta, una duración de pulsación con algo de aleatoriedad y pausas naturales entre acciones. Los clasificadores de comportamiento buscan justamente la versión perfecta de máquina de esta acción.
4. Mantén Juntos la Resolución y las Peticiones
Como la autorización está ligada a la IP, ejecuta el navegador que resuelve el reto a través del mismo punto de salida de proxy que usarás para las peticiones posteriores. Las IPs residenciales o móviles despiertan mucha menos sospecha que los rangos de centro de datos, lo que reduce la frecuencia con la que salta el reto. Si rotas IPs, rota el contexto entero junto, no el token entre contextos.
5. Sé Consciente de Cuándo Dejar de Hacerlo a Mano
Aquí hay un techo real. Los retos interactivos se reajustan constantemente, y los modelos de comportamiento se actualizan con tráfico nuevo todo el tiempo. Una configuración sigilosa que funciona esta semana puede fallar la siguiente. Si gastas más tiempo de ingeniería manteniendo la evasión que construyendo tu producto real, esa es la señal para delegar el desbloqueo en un servicio y volver a los datos.
Un Ejemplo Mínimo con Playwright
Esto muestra la forma de una pulsación automatizada. Es deliberadamente genérico. Lo importante es la aproximación y la duración aleatorizadas, no un bypass mágico.
import random
import time
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
page = browser.new_page()
page.goto("https://example.com/protected")
button = page.query_selector("#challenge-button")
if button:
box = button.bounding_box()
# Aproxímate al botón en vez de saltar a él.
page.mouse.move(box["x"] - 40, box["y"] - 25, steps=12)
page.mouse.move(
box["x"] + box["width"] / 2,
box["y"] + box["height"] / 2,
steps=8,
)
page.mouse.down()
time.sleep(random.uniform(2.4, 3.6)) # varía la pulsación
page.mouse.up()
page.wait_for_load_state("networkidle")
print(page.title())
browser.close()
Si el reto sigue fallando tras esto, el problema casi nunca es la pulsación. Es la IP o la huella, marcadas antes de que el gesto siquiera se ejecute.
Preguntas Frecuentes
¿Es un CAPTCHA de mantener pulsado más difícil que uno de imágenes? Es más difícil de falsificar con un script, porque puntúa comportamiento y señales de dispositivo en vez de reconocimiento de imágenes. A menudo es más fácil de evitar por completo, porque salta cuando hay poca confianza, y tú puedes subir tu puntuación.
¿Puedo usar un servicio de resolución de CAPTCHAs para esto? A veces, pero cuidado con la limitación: el token de autorización está ligado a la IP que lo resolvió. Un servicio que resuelve en sus propios servidores te entrega un token que tu scraper no puede usar. Resuelve en el mismo punto de salida desde el que haces scraping.
¿Por qué recibo el reto en algunas páginas y en otras no? Las páginas de detalle, los endpoints de búsqueda y los flujos de inicio de sesión suelen estar protegidos de forma más agresiva que las páginas de listado estáticas. El mismo sitio puede tratar dos URLs de manera completamente distinta según lo valiosa y lo abusada que sea cada una.
¿Ayuda rotar mi user-agent? Por sí solo, no. En 2026, un user-agent rotatorio sobre una IP de centro de datos con una huella headless falla casi de inmediato. Las señales tienen que ser coherentes y la IP tiene que parecer residencial. Un campo aislado no mueve la puntuación.
Reflexiones Finales
Los CAPTCHAs de mantener pulsado parecen un muro que hay que escalar, pero en realidad son un síntoma. El muro se levantó porque tu sesión parecía automatizada antes de que tocaras el botón. Dedica tu esfuerzo a un perfil de navegador limpio y coherente, a un ritmo humano y a IPs de confianza, y el reto aparecerá mucho menos. Y cuando aparezca, recuerda que la autorización está ligada al contexto, así que resuelve y haz scraping desde el mismo sitio.
Si seguir el ritmo de los retos reajustados se está comiendo tu hoja de ruta, ese es un buen momento para delegar el trabajo. ScrapeUnblocker gestiona el navegador, la huella y los retos interactivos por ti, y devuelve la página renderizada para que te centres en el parseo en vez de en mantener botones. Puedes ver cómo encaja en una petición en la documentación para desarrolladores, y consultar los precios si quieres compararlo con el coste de mantener tu propia pila de evasión.
Prueba ScrapeUnblocker gratis
Tasa de éxito del 95%+ · desde 0,55 € por cada 1000 llamadas · 500 solicitudes gratis al registrarte.