Si añades /robots.txt al final de la dirección de cualquier sitio y lo abres, normalmente verás un archivo de texto plano de unas pocas líneas. En este archivo el sitio dice a buscadores, crawlers y scrapers: «no rastreen estas rutas». Para un especialista SEO es un ajuste que influye en cómo aparece el sitio en los buscadores; para un desarrollador que recoge datos, es el primer documento que hay que leer antes de empezar.
En este artículo explicamos qué es robots.txt, dónde está y cómo se leen sus reglas, junto con User-agent, Disallow, Allow, los comodines y la regla de la coincidencia más larga. Después vemos las líneas Crawl-delay y Sitemap, si el archivo es jurídicamente vinculante, cómo debe leer robots.txt un scraper con Python (y cuándo se equivoca el parser de la librería estándar), los errores SEO habituales y las líneas escritas para bots de IA.
¿Qué es robots.txt?
robots.txt es el archivo del Robots Exclusion Protocol, que se usa desde 1994 y se extendió durante años sin un estándar escrito. El protocolo pasó a ser estándar oficial en 2022 con RFC 9309. El estándar define el formato del archivo, cómo se comparan las reglas y qué hacer cuando no se puede acceder al archivo.
La función del archivo es sencilla: el propietario del sitio indica de qué rutas deben mantenerse alejados los visitantes automatizados. Motivos habituales:
- Carga del servidor: rutas como las páginas de búsqueda y filtros, que consultan la base de datos en cada petición.
- Contenido de poco valor o duplicado: miles de páginas idénticas generadas por parámetros de ordenación, páginas de carrito y de cuenta.
- Presupuesto de rastreo: dirigir el tiempo de los bots de los buscadores hacia las páginas importantes.
- Preferencia de uso del contenido: impedir que ciertos bots, como los que recogen datos para entrenar IA, rastreen el sitio.
robots.txt no es un mecanismo de seguridad. El archivo es público, y cerrar una ruta con Disallow también anuncia que esa ruta existe. Las páginas que deben permanecer privadas se protegen con contraseñas, control de acceso o métodos como noindex.
¿Dónde está robots.txt?
El archivo está siempre en el directorio raíz del sitio y se llama robots.txt, en minúsculas:
https://example.com/robots.txtes válido.https://example.com/folder/robots.txtno lo lee ningún bot.
Las reglas se aplican por protocolo, host y puerto. https://example.com/robots.txt solo se aplica a https://example.com; el subdominio https://shop.example.com necesita su propio archivo. Las versiones http:// y https:// también son técnicamente archivos distintos.
RFC 9309 define qué ocurre cuando no se puede acceder al archivo:
- Una respuesta
4xx(el archivo no existe): el crawler puede suponer que el sitio no tiene restricciones. - Una respuesta
5xxo un error de red (el archivo es inaccesible): el crawler debe suponer que todo el sitio está cerrado.
El estándar también dice que los crawlers pueden guardar el archivo en caché, pero en general no deberían usar una versión en caché durante más de 24 horas. Así que un cambio en el archivo puede tardar hasta un día en llegar a los bots.
¿Cómo se leen las reglas?
A continuación hay un archivo de ejemplo realista para una tienda online:
User-agent: *
Disallow: /cart
Disallow: /account/
Disallow: /search
Allow: /search/popular
Disallow: /*?sort=
Disallow: /*.pdf$
Crawl-delay: 5
User-agent: ExamplePriceBot
Disallow: /account/
Allow: /
User-agent: GPTBot
Disallow: /
Sitemap: https://example.com/sitemap.xml| Línea | Significado |
|---|---|
User-agent: * | Las reglas de este grupo se aplican a todo bot que no tenga su propio grupo |
Disallow: /cart | Toda ruta que empiece por /cart: /cart, /cart/add, incluso /cartoon |
Disallow: /account/ | La carpeta /account/ y todo lo que contiene; /account (sin barra final) no coincide |
Disallow: /search | /search, /search?q=phone, /search/popular |
Allow: /search/popular | Una excepción a la prohibición anterior; es más larga, así que esta ruta se puede rastrear |
Disallow: /*?sort= | * es cualquier secuencia de caracteres: toda dirección con un parámetro ?sort= |
Disallow: /*.pdf$ | $ marca el final de la dirección: direcciones que terminan en .pdf; /catalog.pdf?v=2 no coincide |
Crawl-delay: 5 | Una petición de esperar 5 segundos entre peticiones (no estándar, se explica más abajo) |
User-agent: ExamplePriceBot | Un grupo solo para este bot; este bot no lee en absoluto el grupo * de arriba |
Allow: / | Para este bot, todo está abierto excepto las páginas de cuenta |
User-agent: GPTBot + Disallow: / | GPTBot no debe rastrear nada del sitio |
Sitemap: | La dirección del sitemap; independiente de los grupos |
Grupos User-agent
El archivo se compone de grupos. Cada grupo empieza con una o varias líneas User-agent, y las reglas que siguen pertenecen a ese grupo. Cuando un bot lee el archivo:
- Busca un grupo que coincida con su propio nombre. La comparación se hace con el token de producto del bot (por ejemplo
GPTBot), sin distinguir mayúsculas y minúsculas, no con la cadena User-Agent completa del navegador. - Si encuentra un grupo propio, aplica solo las reglas de ese grupo. Las reglas del grupo
*no se suman para ese bot. - Si no hay grupo propio, aplica el grupo
*. - Si no hay ningún grupo, supone que el sitio no tiene restricciones.
El punto 2 se pasa por alto a menudo. En el ejemplo anterior, como ExamplePriceBot tiene su propio grupo, a ese bot no le afectan ni las prohibiciones de /cart y /search ni la petición de Crawl-delay.
Disallow, Allow y la regla de la coincidencia más larga
Las reglas coinciden como prefijos de ruta: Disallow: /cart abarca toda ruta que empiece por /cart. Cuando varias reglas coinciden con una dirección, según RFC 9309 gana la regla coincidente más larga. La dirección /search/popular coincide tanto con Disallow: /search (7 caracteres) como con Allow: /search/popular (15 caracteres); gana el Allow, que es más largo, y la página se puede rastrear.
Si dos reglas tienen la misma longitud y una es Allow y la otra Disallow, el estándar recomienda preferir Allow. El orden de las reglas en el archivo no cambia el resultado. Como veremos más abajo, algunos parsers no aplican bien este punto.
Comodines
*coincide con cero o más caracteres:Disallow: /*?session=cierra toda dirección que lleve un parámetro de sesión.$marca el final de la dirección:Disallow: /*.pdf$cierra solo las direcciones que terminan en.pdf.
Si el valor de una línea Disallow: se deja vacío (Disallow:), no se cierra ninguna ruta. Disallow: / cierra todo el sitio. La diferencia de un carácter entre estas dos líneas puede causar uno de los errores SEO más caros.
Las líneas Crawl-delay y Sitemap
Crawl-delay es una petición que indica a un bot cuántos segundos esperar entre peticiones consecutivas al mismo sitio. No forma parte de RFC 9309, pero muchos crawlers y scrapers la leen. Google no admite la línea Crawl-delay; la velocidad de rastreo de Google la fijan sus propios sistemas. Algunos otros buscadores sí la tienen en cuenta.
Para un scraper, el valor de Crawl-delay es una preferencia de velocidad que el propietario del sitio ha expresado explícitamente, y aunque no sea estándar, es una señal que conviene seguir. Otras formas de respetar los límites de velocidad se tratan en Cómo hacer web scraping sin que te bloqueen.
La línea Sitemap da la dirección completa del archivo sitemap. Es independiente de los grupos, puede aparecer en cualquier parte del archivo y escribirse más de una vez. Tanto para buscadores como para scrapers, es la forma de ir directamente a la lista de páginas en lugar de rastrear todo el sitio enlace a enlace.
¿Es robots.txt jurídicamente vinculante?
Técnicamente, robots.txt es una petición, no una barrera de acceso. Que una ruta esté cerrada en el archivo no impide físicamente acceder a ella. Por eso la respuesta a «¿tengo que seguir robots.txt?» es más jurídica y ética que técnica.
Lo que debes saber en la práctica:
- Todo crawler legítimo lo sigue. Los buscadores, los servicios de archivo y los crawlers corporativos leen y aplican robots.txt.
- Se valora junto con las condiciones del sitio. Las condiciones de uso de muchos sitios regulan el acceso automatizado con referencia a robots.txt. Las condiciones de servicio de Google, por ejemplo, incluyen entre los ejemplos de abuso el acceso automatizado que infringe instrucciones legibles por máquina como robots.txt.
- Puede ser una señal decisiva en disputas. Un scraper que rastrea rutas que un sitio ha cerrado explícitamente se considera que ha ignorado a sabiendas la preferencia del sitio.
- Seguir robots.txt no lo hace todo legal. Recoger datos personales de una ruta abierta no exime de las obligaciones de leyes como el RGPD.
Tratamos el marco legal de la recogida de datos en ¿Es legal el web scraping?. Este artículo no es asesoramiento jurídico; te recomendamos consultar a un abogado para tu caso concreto.
¿Cómo debe leer robots.txt un scraper?
La librería estándar de Python incluye el módulo urllib.robotparser, y su documentación oficial describe el uso básico. Pero cuando probamos el módulo con el archivo de ejemplo anterior, se apartó de RFC 9309 en cuatro puntos:
| Caso | RFC 9309 | urllib.robotparser |
|---|---|---|
Primero Disallow: /search, después Allow: /search/popular | /search/popular se puede rastrear (regla más larga) | No se puede rastrear; aplica la primera regla que coincide |
| Las mismas dos reglas en orden inverso | Se puede rastrear | Se puede rastrear |
Disallow: /*?sort= | /category?sort=price está cerrada | Abierta; no admite * |
Disallow: /*.pdf$ | /catalog.pdf está cerrada | Abierta; no admite $ |
Además hay dos diferencias de comportamiento:
- Si se le da como nombre de bot la cadena User-Agent completa (
Mozilla/5.0 (compatible; GPTBot/1.2; ...)), el módulo no encontró el grupo propio del bot y aplicó el grupo*. Hay que pasar a la función solo el token de producto (GPTBot). - Cuando el archivo responde con
401o403, el módulo considera cerrado todo el sitio. RFC 9309 trata las respuestas4xxcomo «el archivo no existe». Como la funciónread()del módulo descarga el archivo con el User-Agent predeterminado de Python y sin timeout, puedes obtener por error «todo cerrado» en un sitio que bloquea ese valor.
Por eso es más seguro descargar el archivo con tu propio cliente, pasarlo a parse() y usar un parser más completo para archivos con comodines:
from urllib.parse import urlsplit
from urllib.robotparser import RobotFileParser
import requests
BOT_NAME = "ExamplePriceBot"
USER_AGENT = f"{BOT_NAME}/1.0 (+https://example.com/about-our-bot)"
def robots_for(site, session):
"""Descarga robots.txt y aplica el comportamiento 4xx y 5xx de RFC 9309."""
parser = RobotFileParser()
try:
response = session.get(f"{site}/robots.txt", timeout=10)
except requests.RequestException:
parser.parse(["User-agent: *", "Disallow: /"]) # inaccesible: todo cerrado
return parser
if response.status_code >= 500:
parser.parse(["User-agent: *", "Disallow: /"])
elif response.status_code >= 400:
parser.parse([]) # sin archivo: sin restricciones
else:
parser.parse(response.text.splitlines())
return parser
session = requests.Session()
session.headers["User-Agent"] = USER_AGENT
url = "https://example.com/product/123"
site = "{0.scheme}://{0.netloc}".format(urlsplit(url))
robots = robots_for(site, session)
if robots.can_fetch(BOT_NAME, url):
delay = robots.crawl_delay(BOT_NAME) or 2
print(f"Se puede rastrear, se esperarán {delay} s entre peticiones")
else:
print("robots.txt cierra esta dirección, se omite")
print("Sitemaps:", robots.site_maps())Hay dos detalles importantes en el ejemplo: a can_fetch se le pasa solo el nombre del bot, no la cadena User-Agent completa; y el archivo se descarga una vez por sitio y se guarda en memoria, no se descarga de nuevo para cada página.
Si te importan los comodines y la regla de la coincidencia más larga, la librería protego, que usa Scrapy, aplica estas reglas de forma más fiel al RFC. Uses el parser que uses, verifica los resultados comprobando a mano unas cuantas direcciones contra el archivo del sitio de destino.
Errores SEO habituales
Como robots.txt influye directamente en la visibilidad en los buscadores, también se configura mal a menudo en el lado SEO:
- Olvidar la línea
Disallow: /al pasar a producción. La línea que cerraba el sitio en el entorno de pruebas llega al sitio en producción, y el sitio desaparece de los buscadores. - Intentar sacar una página del índice con robots.txt.
Disallowimpide que la página se rastree, no que se indexe. Una página cerrada que recibe enlaces de otros sitios puede aparecer en los resultados solo con su dirección, sin que se haya leído su contenido. Para sacarla del índice, la página debe poder rastrearse y llevarnoindex. - Cerrar archivos CSS y JavaScript. El buscador no puede renderizar bien la página, y se resienten la evaluación de la adaptación a móviles y del contenido.
- Confundir las barras finales.
Disallow: /blogcierra tanto la carpeta/blog/como una página/blogger-guide. - Pasar por alto las mayúsculas. La comparación de rutas distingue mayúsculas y minúsculas:
Disallow: /Searchno cierra/search. - No poner un archivo en el subdominio.
shop.example.comnecesita su propio robots.txt. - Esperar que los cambios se apliquen al instante. Los bots leen el archivo desde la caché; un cambio puede tardar hasta un día en surtir efecto.
La documentación de Google Search Central explica en detalle cómo interpreta Google robots.txt, incluido su límite de tamaño de archivo y su comportamiento ante códigos de error. Para comprobar resultados de búsqueda en distintos países, consulta nuestra página de solución de proxy SEO.
Líneas para bots de IA
En los últimos años, las líneas que más se añaden a los archivos robots.txt están dirigidas a los crawlers de empresas de IA. Algunos de estos bots recogen datos para entrenar modelos; otros obtienen una página al momento en respuesta a la pregunta de un usuario. Tokens de producto habituales:
GPTBot(OpenAI)ClaudeBot(Anthropic)CCBot(Common Crawl)Google-Extended: no es un crawler aparte, sino un token que controla si el contenido recogido por los bots existentes de Google se usa en los modelos Gemini; no afecta a la visibilidad en la Búsqueda de Google.
Por ejemplo, un sitio que quiere cerrar el rastreo con fines de entrenamiento y seguir abierto a los buscadores puede añadir estas líneas:
User-agent: GPTBot
Disallow: /
User-agent: CCBot
Disallow: /
User-agent: Google-Extended
Disallow: /Las empresas añaden nuevos nombres de bot o separan las funciones de los bots existentes de vez en cuando. Al escribir estas líneas, o al configurar un scraper en torno a ellas, consulta la documentación actual de la empresa correspondiente. Para un ejemplo de las medidas que toman los sitios en otras capas contra los bots que no siguen robots.txt, consulta Cloudflare Precursor. Para un ejemplo de cómo usan los modelos de IA los datos web, consulta Web scraping con GPT-6 Astra.
Si construyes tu propio agente de IA o scraper, dale un token de producto definido y lee robots.txt con ese nombre. Así el propietario del sitio puede escribir un grupo solo para ti y transmitirte directamente sus preferencias de rastreo.
Casos de uso
- Un crawler a gran escala: descarga robots.txt una vez por dominio, lo guarda en caché y comprueba cada dirección antes de ponerla en cola. La parte del escalado está en nuestra página de solución de web crawler.
- Un script de seguimiento de precios: toma las direcciones de producto del sitemap, nunca visita las páginas de búsqueda y filtros cerradas por robots.txt y respeta
Crawl-delay. La configuración general está en nuestra página de solución de extracción de datos. - Una auditoría SEO: antes de pasar a producción, comprueba que robots.txt no cierra páginas importantes y que la línea del sitemap es correcta.
- Definir una política para bots de IA: el propietario del contenido decide qué bots pueden rastrear el sitio y con qué fin, y añade las líneas correspondientes.
Algunos sitios también colocan enlaces ocultos para atraer a los bots hacia rutas cerradas por robots.txt; un crawler que sigue robots.txt se mantiene lejos de estas trampas de forma natural. Explicamos el mecanismo en Trampas honeypot.
Errores comunes (lado del scraper)
- No leer nunca robots.txt. Empezar a rastrear sin conocer una preferencia que el sitio ha expresado explícitamente.
- Confiar a ciegas en
urllib.robotparser. Puede dar resultados erróneos con el orden de las reglas y los comodines. - Pasar a
can_fetchla cadena User-Agent completa. No se encuentra el grupo propio del bot. - Suponer que el grupo propio del bot se combina con el grupo
*. Si hay un grupo propio, solo se aplica ese. - Descargar el archivo de nuevo en cada petición. Carga innecesariamente el sitio; descárgalo una vez por sitio y guárdalo en caché.
- Seguir rastreando ante una respuesta
5xx. El estándar dice que, si el archivo es inaccesible, hay que tratar todo el sitio como cerrado. - Ignorar
Crawl-delayporque no es estándar. Es una petición de velocidad explícita del propietario del sitio.
Guía de decisión
| Tu situación | Recomendación |
|---|---|
La dirección está cerrada con Disallow | No la rastrees |
La dirección está abierta y hay un Crawl-delay | Espera al menos ese tiempo entre peticiones |
robots.txt devuelve 404 | Trátalo como sin restricciones, pero revisa igualmente las condiciones del sitio |
robots.txt devuelve 5xx o es inaccesible | Trata el sitio como cerrado y vuelve a intentarlo más tarde |
El archivo usa los comodines * o $ | Usa un parser conforme al RFC |
| Hay un grupo para tu bot | Aplica solo ese grupo |
| Hay una línea de sitemap | Toma las direcciones del sitemap |
| Quieres sacar una página de los buscadores | No con robots.txt, sino con noindex |
Preguntas frecuentes
¿Se puede rastrear un sitio sin robots.txt?
Si no hay robots.txt, se supone que el sitio no tiene restricciones de rastreo. Eso no significa que no se apliquen las condiciones de uso del sitio, los límites de velocidad ni las leyes de datos personales.
¿Qué diferencia hay entre Disallow y noindex?
Disallow impide que un bot rastree la página, es decir, que descargue su contenido. noindex pide que la página no se muestre en los resultados de búsqueda y requiere que el bot pueda leer la página. Si cierras una página con Disallow y además añades noindex, el bot nunca ve la etiqueta noindex.
¿Google lee la línea Crawl-delay?
No. Google no admite la línea y fija su velocidad de rastreo con sus propios sistemas. Algunos otros buscadores y muchos crawlers sí la tienen en cuenta.
¿Qué tamaño puede tener un archivo robots.txt?
RFC 9309 exige que los crawlers puedan procesar un archivo de al menos 500 kibibytes; las reglas que superen ese límite pueden ignorarse. En la práctica, los archivos robots.txt están muy por debajo, y mantenerlos cortos reduce el riesgo de errores.
¿Puedo bloquear los bots de IA con robots.txt?
Sí, en el caso de los bots que siguen robots.txt: abre un grupo con el token de producto correspondiente y escribe Disallow: /. Para los bots que no siguen robots.txt, necesitas medidas adicionales en el lado del servidor o de la CDN.
¿Qué nombre de User-agent debería usar mi scraper?
Un valor con un token de producto corto que identifique a tu bot y una dirección de contacto: ExamplePriceBot/1.0 (+https://example.com/about-our-bot). Al comprobar robots.txt, usa solo la parte ExamplePriceBot.
En resumen
robots.txt es el archivo del directorio raíz de un sitio que indica a los bots qué rutas no rastrear. Las reglas se dividen en grupos User-agent; si un bot tiene su propio grupo, solo se aplica ese, cuando las reglas chocan gana la coincidencia más larga, y * y $ se usan como comodines. Crawl-delay no es estándar y Google no lo admite, pero para los scrapers es una petición de velocidad explícita. El urllib.robotparser de Python se aparta del RFC en el orden de las reglas y en los comodines; descarga el archivo con tu propio cliente y verifica los resultados. Para trabajos de recogida de datos que siguen las reglas, echa un vistazo a nuestros servicios de proxy.




