En el HTML de una tienda online hay un enlace que nunca aparece en la página: oculto con display: none, sin texto y apuntando a /product/special-offer-7781. Ninguna persona que navega por la página en un navegador ve ni pulsa ese enlace. Un scraper que recoge todas las etiquetas <a href> de la página y las visita por turnos, en cambio, lo encuentra y lo abre. En ese momento el sitio sabe con certeza que la visita no vino de una persona. Ese enlace es una trampa honeypot.
En este artículo explicamos qué significa el término honeypot en seguridad y en web scraping, cómo funcionan las trampas de enlaces ocultos y de formularios, qué le pasa a un scraper que cae en una y por qué caen los scrapers. El enfoque queda claro desde el principio: el objetivo no es «esquivar» los honeypots, sino no seguir rutas que el sitio no quiere que se visiten. Un crawler que sigue las reglas y mantiene un alcance acotado ya se mantiene lejos de estas trampas; mostramos cómo con un ejemplo en Playwright.
¿Qué es un honeypot?
El término «honeypot» viene de la seguridad de la información. Un honeypot usado por los equipos de seguridad es un sistema montado a propósito para atraer atacantes, sin ninguna función real: un servidor que parece desprotegido, una base de datos falsa o una cuenta de usuario que nunca se usa. Un usuario legítimo no tiene motivo para acceder a un sistema así, de modo que todo acceso es sospechoso y aporta información sobre los métodos del atacante.
Un honeypot en web scraping aplica la misma idea a la escala de una página web:
| Característica | Honeypot de seguridad | Honeypot de scraping |
|---|---|---|
| ¿A quién apunta? | Atacantes que intentan entrar en una red | Crawlers automatizados y bots de formularios |
| Forma | Servidor, servicio o cuenta falsos | Enlace oculto, campo de formulario oculto, página trampa |
| Lógica de detección | Un usuario legítimo nunca accede al sistema | Una persona nunca ve ni pulsa el enlace |
| Resultado | Seguimiento del atacante, alertas | Marcar la IP o la sesión, bloqueo, datos falsos |
| ¿Quién lo monta? | Equipos de seguridad | Propietarios de sitios, servicios de gestión de bots |
Los honeypots son una de las técnicas defensivas contra ataques automatizados como el scraping, la creación de cuentas y el spam, que OWASP clasifica en su proyecto Automated Threats to Web Applications. La fuerza de estas defensas es que son baratas: una sola línea de HTML da una detección de bots con mucha certeza.
¿Cómo funcionan las trampas de enlaces ocultos?
Una trampa de enlace oculto funciona en cuatro pasos:
- El sitio coloca un enlace en la página y lo oculta a los visitantes humanos.
- La dirección del enlace no se usa en ningún otro sitio. Normalmente también está cerrada en robots.txt, para que tampoco vayan allí los bots de buscadores que siguen las reglas.
- Un scraper que recoge todos los enlaces de la página añade esa dirección a su lista y la visita.
- El sitio registra la petición a esa dirección y marca como bot la dirección IP, la sesión o la huella del navegador que la hizo.
Formas habituales de ocultar el enlace:
display: none: el elemento no ocupa espacio en la página.visibility: hidden: el elemento ocupa espacio, pero es invisible.- Tamaño cero: ancho y alto cero, sin texto.
opacity: 0: totalmente transparente.- Posicionado fuera de la pantalla:
position: absolute; left: -9999px. - Mismo color que el fondo: texto blanco sobre fondo blanco.
- Oculto tras otro elemento: un enlace tapado con
z-index.
Como algunos de estos métodos también pueden afectar a los visitantes que usan lectores de pantalla, los sitios cuidadosos añaden a los enlaces trampa atributos como aria-hidden="true" y tabindex="-1" para que tampoco lleguen a ellos los usuarios de teclado y de tecnologías de asistencia.
Honeypots en formularios
Un honeypot de formulario es la técnica más común contra los bots de spam. Se añade un campo que las personas no pueden ver a un formulario de contacto, comentarios o registro:
<form action="/contact" method="post">
<input type="text" name="name">
<input type="email" name="email">
<!-- Las personas no ven este campo; si llega relleno, se rechaza el envío -->
<input type="text" name="website" class="hidden" tabindex="-1" autocomplete="off">
<button type="submit">Enviar</button>
</form>Una persona que rellena el formulario no ve el campo website y lo deja vacío. Un bot que rellena automáticamente todos los campos de la página escribe un valor también ahí. Cuando el campo llega relleno, el servidor rechaza el envío en silencio o marca la dirección IP que lo envió.
Algunos formularios añaden también un control de tiempo: los envíos que llegan pocos segundos después de abrir la página del formulario se consideran sospechosos, bajo la suposición de que una persona no puede leer y rellenar el formulario en ese tiempo.
Para el scraping, la conclusión es clara: un scraper que recoge datos normalmente no tiene ningún motivo para rellenar formularios. Un script que envía formularios automáticamente se comporta exactamente como un bot de spam.
Páginas trampa y laberintos
Un honeypot no siempre es un solo enlace. Algunas defensas detectan bots y a la vez malgastan sus recursos arrastrándolos a páginas infinitas:
- Rutas que generan páginas infinitas: páginas de calendario, filtros o búsqueda que producen enlaces nuevos en cada visita. Aunque no sean una trampa deliberada, meten en un bucle infinito a un crawler sin límite de profundidad.
- Laberintos de contenido generado: con la función AI Labyrinth que Cloudflare anunció en 2025, los bots que ignoran las directivas de no rastreo se envían a páginas enlazadas generadas con IA. Según el anuncio, estas páginas actúan además como un honeypot de nueva generación: ninguna persona se adentra cuatro enlaces en un laberinto de contenido sin sentido, así que un visitante que llega tan lejos es muy probablemente un bot.
- Datos falsos: en lugar de los precios reales, un bot detectado recibe valores alterados, productos que no existen o resultados vacíos. El scraper no recibe ningún error, pero los datos que recoge dejan de ser fiables.
Los datos falsos son la consecuencia más peligrosa, porque cuesta darse cuenta. Un scraper puede funcionar durante meses y producir informes con precios equivocados.
¿Qué pasa si caes en un honeypot?
El sistema de gestión de bots del sitio trata una petición a la dirección trampa como una señal fuerte. Lo que viene después varía según el sitio:
- Se bloquea la dirección IP: todas las peticiones desde la misma dirección empiezan a recibir
403. - Se marca la sesión: la cookie o el token de sesión se etiquetan como bot; la sesión se reconoce aunque cambie la IP.
- Se registra la huella: se guardan las características del navegador o del cliente, y la misma huella llegando desde otras IP también se considera sospechosa. Explicamos cómo se construyen las huellas en Browser fingerprinting.
- Pantallas de verificación: en las peticiones siguientes se muestran páginas de verificación.
- Datos falsos o respuestas vacías: el scraper sigue funcionando, pero recoge datos erróneos.
- Listas de reputación compartidas: los servicios de gestión de bots pueden tener en cuenta en los sitios de otros clientes las fuentes detectadas en un sitio.
Algunas de estas consecuencias pueden afectar no solo al scraper, sino también a otros usuarios de la misma dirección IP. Hay que tenerlo en cuenta con direcciones IP compartidas.
¿Por qué cae tu scraper en ellos?
Los honeypots apuntan a un comportamiento concreto, y ese comportamiento suele venir de un error de diseño:
- Lógica de «seguir todos los enlaces». Poner en cola todas las etiquetas
<a href>de la página sin comprobar si son visibles. - Rastreo sin alcance definido. Entrar en todas las rutas del sitio cuando solo hacen falta las páginas de producto.
- No leer robots.txt. Las direcciones trampa suelen estar cerradas en robots.txt; un crawler que sigue el archivo nunca va allí.
- Seguir enlaces
rel="nofollow". Enlaces que el sitio ha marcado explícitamente para que no se sigan. - Sin límites de profundidad ni de páginas. El crawler no se detiene en rutas que generan páginas infinitas.
- Rellenar formularios automáticamente. Escribir valores en todos los campos, incluidos los ocultos.
- Visitar una y otra vez la misma dirección con distintos parámetros. Miles de direcciones generadas con combinaciones de filtros y ordenación.
¿Cómo se mantiene lejos de los honeypots un crawler legítimo?
Las reglas siguientes no están para «esquivar» los honeypots; están para que no sigas rutas que el sitio no quiere. Diseñar un crawler así trae como efecto secundario evitar las trampas.
- Sigue robots.txt. Lee el archivo del sitio antes de rastrear y no pongas en cola las rutas cerradas. Explicamos cómo leerlo en Qué es robots.txt y cómo leerlo.
- Acota el alcance con patrones de URL. Si solo necesitas datos de producto, sigue solo las direcciones que empiezan por
/product/. - Usa el sitemap en lugar de recoger enlaces cuando sea posible.
sitemap.xmlenumera las direcciones que el sitio quiere que se rastreen. - Sigue los enlaces visibles. Si usas un navegador, no pongas en cola los enlaces que el usuario no puede ver.
- Omite los enlaces
rel="nofollow". - Fija límites de profundidad, número de páginas y repeticiones. Normaliza las variantes de parámetros de la misma ruta.
- No envíes formularios para recoger datos. Si enviar un formulario es realmente necesario (por ejemplo, iniciar sesión en tu propia cuenta), rellena solo los campos que conoces.
- Limita tu velocidad. Las trampas atrapan sobre todo a los bots que rastrean rápido y a lo ancho.
En la automatización de navegador, una comprobación de «enlaces visibles» puede ser así:
from urllib.parse import urljoin, urlsplit
from playwright.sync_api import sync_playwright
def visible_links(page, base, allowed_prefix="/product/"):
addresses = set()
for link in page.locator("a[href]").all():
href = link.get_attribute("href")
rel = (link.get_attribute("rel") or "").lower()
if not href or "nofollow" in rel or not link.is_visible():
continue
url = urljoin(base, href)
parts = urlsplit(url)
if parts.netloc != urlsplit(base).netloc or not parts.path.startswith(allowed_prefix):
continue
addresses.add(url)
return sorted(addresses)
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com/deals")
for address in visible_links(page, "https://example.com"):
print(address) # antes de poner en cola, comprobar también robots.txt
browser.close()Esta función aplica cuatro filtros: omite los enlaces nofollow, los enlaces no visibles y los que llevan a otros dominios, y solo toma los que coinciden con el prefijo de dirección permitido.
Hay que conocer los límites de la comprobación de visibilidad. El is_visible() de Playwright considera no visibles los elementos con display: none, visibility: hidden y tamaño cero. Pero los elementos ocultos con métodos como opacity: 0, el posicionamiento fuera de la pantalla o el mismo color que el fondo pueden pasar esta comprobación como visibles. Así que la comprobación de visibilidad no es por sí sola una garantía; la protección real es seguir robots.txt y limitar el rastreo a los patrones de URL que necesitas. Casi todos los enlaces trampa quedan fuera de estas dos reglas.
Un scraper que trabaja con un cliente HTTP y sin navegador no puede medir la visibilidad directamente; para él, los patrones de URL, robots.txt y las reglas del sitemap importan todavía más.
Tipos de honeypot
| Tipo | Cómo funciona | ¿A quién atrapa? | ¿Cómo se mantiene lejos un crawler legítimo? |
|---|---|---|---|
| Enlace oculto con CSS | Un enlace que las personas no ven, a menudo cerrado en robots.txt | Bots que siguen todos los enlaces | robots.txt, patrones de URL, comprobación de visibilidad |
| Campo de formulario oculto | Se rechaza si llega relleno un campo que debe quedar vacío | Bots de formularios que rellenan todos los campos | No enviar formularios al recoger datos |
| Control de tiempo | Los formularios enviados demasiado rápido se consideran sospechosos | Bots que envían al instante | No enviar formularios |
| Ruta de páginas infinitas | Páginas que generan enlaces nuevos en cada visita | Crawlers sin límite de profundidad | Límites de profundidad y páginas, normalización de parámetros |
| Laberinto de contenido generado | Páginas generadas para bots que ignoran las directivas de no rastreo | Bots que no siguen robots.txt | Seguir robots.txt |
| Datos falsos | Contenido alterado para bots detectados | IP o sesiones marcadas | No ser marcado; verificar los datos por muestreo |
Casos de uso
- Un crawler a gran escala: una caché de robots.txt por sitio, una lista de patrones de URL permitidos, un límite de profundidad y descubrimiento empezando por el sitemap. La parte del escalado está en nuestra página de solución de web crawler.
- Rastreo para protección de marca: los rastreos para detectar sitios que venden productos falsificados mantienen el alcance limitado a las páginas de producto relevantes; comportarse según las reglas es esencial para reunir pruebas sin activar las defensas del sitio rastreado. La configuración está en nuestra página de solución de protección de marca.
- Detección de bots como propietario de un sitio: un honeypot de formulario en tu propio sitio y un enlace trampa cerrado en robots.txt son formas baratas de detectar pronto la automatización maliciosa. La parte de protección de datos está en nuestra página de solución de seguridad de datos.
- Controles de calidad de datos: comprobar con regularidad y a mano en un navegador una muestra de los precios recogidos muestra si se están sirviendo datos falsos.
Errores comunes
- Tratar un honeypot como un obstáculo técnico que hay que esquivar. Una trampa es señal de una preferencia explícita del sitio; el problema real es rastrear sin alcance definido.
- Confiar solo en la comprobación de visibilidad. Los elementos transparentes o fuera de la pantalla pueden superarla.
- Leer robots.txt una sola vez al principio. En rastreos largos el archivo puede cambiar; actualízalo por sitio cada cierto tiempo.
- No contar con los datos falsos. No recibir errores no significa recibir datos correctos.
- Enviar formularios «por si acaso». La recogida de datos casi nunca necesita enviar formularios.
- Contar las variantes de parámetros como direcciones distintas. Las páginas de filtros que generan combinaciones infinitas arrastran al crawler a una trampa.
Reunimos los demás errores de velocidad, cabeceras e IP en Cómo hacer web scraping sin que te bloqueen.
Guía de decisión
| Tu situación | Recomendación |
|---|---|
| Solo hacen falta ciertos tipos de página | Lista de patrones de URL permitidos, sitemap |
| Rastreas a lo ancho | robots.txt, límite de profundidad, normalización de parámetros |
| Usas automatización de navegador | Enlaces visibles y sin nofollow + robots.txt |
| Usas un cliente HTTP | Patrones de URL y robots.txt (no se puede medir la visibilidad) |
| Hay que rellenar un formulario | Solo los campos conocidos; no enviar formularios para recoger datos |
| Dudas de la exactitud de los datos | Toma una muestra y verifícala a mano en un navegador |
| Quieres proteger tu propio sitio | Honeypot de formulario + enlace trampa cerrado en robots.txt |
Preguntas frecuentes
¿Es legal que los sitios usen honeypots?
En general, sí; que un sitio añada a su propia página un enlace o campo que sus visitantes no pueden ver es una técnica defensiva. Pero el contenido trampa no debe ser engañoso ni perjudicar la accesibilidad, y los datos personales recogidos en el proceso están sujetos a las leyes correspondientes.
¿Cómo sabe mi scraper que ha caído en un honeypot?
No lo sabe directamente; la dirección trampa puede responder como una página normal. Las señales son indirectas: respuestas 403 que empiezan poco después, pantallas de verificación, datos que cambian de repente o se vuelven incoherentes. Revisa en los registros del rastreo las peticiones enviadas a direcciones cerradas en robots.txt o que no esperabas.
¿Cambiar de IP levanta un bloqueo tras un honeypot?
Puede ayudar temporalmente cuando el bloqueo está ligado solo a la IP, pero no cambia el comportamiento de rastreo que causó el problema. No ayuda en absoluto cuando el marcado se basa en la sesión o en la huella. La solución correcta es corregir el alcance del crawler y su cumplimiento de las reglas.
¿Por qué los bots de los buscadores no caen en los honeypots?
Los bots legítimos de los buscadores siguen robots.txt y respetan señales como nofollow. Los propietarios de sitios suelen cerrar las direcciones trampa en robots.txt, así que estos bots nunca van allí. La misma lógica vale para todo crawler que sigue las reglas.
¿Qué diferencia hay entre un honeypot y un CAPTCHA?
Un CAPTCHA pide explícitamente una verificación al visitante y también afecta a los usuarios humanos. Un honeypot es invisible; los usuarios humanos no notan nada, y solo caen en la trampa quienes muestran un comportamiento automatizado concreto.
¿Debería añadir un honeypot a mi propio sitio?
La técnica del campo oculto en formularios de contacto y comentarios es una forma barata de reducir el spam y no afecta a la experiencia de usuario. Al añadir enlaces trampa ocultos, no olvides cerrar la dirección trampa en robots.txt; si no, puedes marcar por error a bots de buscadores que siguen las reglas.
En resumen
Un honeypot es una trampa construida para que los visitantes humanos no la vean, pero en la que caen los bots que procesan automáticamente cada enlace y campo de formulario: enlaces ocultos con CSS, campos de formulario que deben quedar vacíos, páginas infinitas y laberintos de contenido generado. Un scraper que cae en la trampa acaba bloqueado, se topa con pantallas de verificación o recoge datos falsos sin saberlo. La forma de protegerse de los honeypots no es intentar esquivarlos, sino diseñar un crawler que siga robots.txt, solo siga los patrones de URL que necesita, tenga límites de profundidad y no envíe formularios. Para trabajos de recogida de datos que siguen las reglas, echa un vistazo a nuestros servicios de proxy.




