Aclaración: somos Geonode y vendemos proxies, que son uno de los elementos necesarios para el método de rastreo que se describe al final. Lo más sensato es que el rastreo sea lo último que pruebes, no lo primero. Cinco de las ocho fuentes que se indican a continuación son gratuitas, no requieren infraestructura y, con frecuencia, ofrecen una lista más completa que la que se obtiene mediante un rastreo, ya que incluyen páginas a las que ya no enlaza ninguna otra página. Si empiezas por programar un rastreador, tendrás más trabajo y obtendrás una cobertura menor. Compra ancho de banda cuando hayas comprobado que las fuentes gratuitas tienen lagunas que necesitas cubrir, lo cual ocurre más tarde de lo que la mayoría de la gente supone.
Por qué «Todas las páginas» no tiene una respuesta completa
Cuatro razones, todas de carácter estructural.
Existen páginas huérfanas. Una página sin enlaces entrantes es inaccesible para el rastreo e invisible para los motores de búsqueda, pero existe y puede estar activa. Las páginas de destino antiguas, las URL de campañas y las secciones obsoletas entran todas en esta categoría.
El contenido detrás de formularios y procesos de autenticación no es enumerable. Los resultados de búsqueda, las vistas filtradas y cualquier elemento que requiera iniciar sesión no son accesibles mediante el rastreo.
Las URL dinámicas pueden ser infinitas. Un calendario con enlaces al mes siguiente genera un número ilimitado de URL. La navegación por facetas en un sitio de comercio electrónico produce explosiones combinatorias. «Todas las páginas» no es un conjunto finito en algunos sitios.
Los sitios mienten por omisión. Un mapa del sitio contiene lo que el propietario ha decidido incluir, que suele ser las páginas que quiere que se indexen en lugar de las páginas que realmente existen.
Por lo tanto, el objetivo realista no es la exhaustividad, sino una cobertura suficiente para tu propósito, lo que significa que las fuentes que elijas dependerán del motivo por el que estés realizando la consulta.
Empieza por el mapa del sitio
El primer paso más eficaz, y el que la gente suele saltarse.
El protocolo de mapas de sitio define un formato XML que enumera las URL de un sitio web. Un mapa de sitio «debe comenzar con una etiqueta de apertura <urlset> y terminar con una etiqueta de cierre </urlset>», y cada entrada debe incluir un elemento <loc>. Puede ir acompañado de elementos opcionales como <lastmod>, <changefreq> y <priority>, aunque el protocolo señala que su tratamiento «puede variar según los motores de búsqueda».
Estos límites influyen en los resultados que se obtienen: un único archivo de mapa del sitio tiene un límite de «50 000 URL y no debe superar los 50 MB (52 428 800 bytes)». Los sitios web más grandes utilizan un índice de mapa del sitio —un <sitemapindex> que enumera otros mapas del sitio— que está sujeto a los mismos límites, por lo que un sitio web puede tener docenas de archivos de mapa del sitio.
Dónde buscar:
https://example.com/sitemap.xml
https://example.com/sitemap_index.xml
https://example.com/sitemap.xml.gz
Se permite la compresión Gzip, «pero el archivo descomprimido debe seguir cumpliendo con las restricciones de tamaño».
Y comprueba primero robots.txt, ya que el protocolo prevé anunciar allí los mapas del sitio mediante la directiva Sitemap::
curl -s https://example.com/robots.txt | grep -i sitemap
Son los treinta segundos más valiosos de los que dispones. Muchos sitios web enumeran varios mapas del sitio cuyos nombres nunca habrías adivinado: unos para productos, otros para categorías, entradas de blog e imágenes.
Sigue el índice de forma recursiva. Un índice de mapa del sitio apunta a mapas del sitio que, a su vez, pueden apuntar a otros mapas del sitio. Recupera cada uno de ellos, extrae los valores de «<loc>» y ten en cuenta que las entradas de un índice son archivos de mapa del sitio, mientras que las entradas de un «urlset» son páginas.
El campo «<lastmod>» es la otra razón para empezar por aquí: te indica qué ha cambiado, lo que convierte un nuevo rastreo en una simple recuperación de las pocas páginas que se han movido.
Lee el archivo robots.txt para descubrir lo que revela
Más allá de la directiva del mapa del sitio, robots.txt es un listado de las rutas que el propietario ha considerado que merecen ser mencionadas.
Disallow: /admin/
Disallow: /internal/reports/
Disallow: /checkout/
Disallow: /search?
Cada línea de Disallow indica una ruta que existe. No se trata de una vía de acceso, sino de una indicación de lo que no debes rastrear, y respetarla es lo correcto y marca la diferencia entre un rastreador identificado y una molestia. Sin embargo, te revela la estructura del sitio y, con frecuencia, menciona secciones que desconocías.
Léelo como un mapa más que como una lista de objetivos. Una ruta que está prohibida debe permanecer fuera de tu lista de rastreo; saber que existe te ayuda a comprender mejor el sitio.
Operadores de motores de búsqueda
Rápido, gratuito y parcial.
site:example.com
site:example.com inurl:/products/
site:example.com -inurl:/blog/
site:example.com filetype:pdf
Lo que te ofrece: las páginas que el motor de búsqueda ha indexado, lo que constituye un subconjunto de las páginas existentes. Además, los resultados son limitados y estimados, en lugar de exhaustivos.
Para qué sirve realmente: descubrir subdominios y secciones que no conocías, y encontrar archivos de documentos a los que no se accede desde la navegación. Una búsqueda con «filetype:pdf» en una web corporativa suele sacar a la luz material que nadie esperaba que fuera público.
La limitación es que extraer los resultados de búsqueda viola directamente las condiciones de uso de la mayoría de los motores de búsqueda, y la versión manual es lenta. Si necesitas hacerlo mediante programación, utiliza una API de búsqueda oficial, si existe, en lugar de automatizar la interfaz web.
Archivos web
La fuente que la mayoría de la gente olvida, y la única que encuentra páginas que ya no existen.
La API del servidor CDX de Internet Archive consulta directamente el índice de capturas del archivo. La documentación señala que «la consulta más sencilla y el único parámetro obligatorio para el servidor CDX es el parámetro url».
curl -s "http://web.archive.org/cdx/search/cdx?url=example.com/*&output=json&fl=original&collapse=urlkey&limit=10000"
Parámetros que conviene conocer:
**matchType
** controla el ámbito: exact
coincide con una URL, prefix
devuelve todo lo que hay bajo una ruta, host
abarca un único nombre de host y domain
abarca un dominio y todos sus subdominios. Un comodín en la URL lo establece de forma implícita, por lo que example.com/*
es una coincidencia de prefijo.
**collapse=urlkey
** elimina los duplicados adyacentes, lo cual es esencial, ya que el archivo contiene muchas capturas de la misma URL.
**output=json
** es más práctico que el formato de texto CDX predeterminado, y gzip=false
desactiva la codificación gzip predeterminada si tu cliente no puede gestionarla.
Límites: la API «impone un máximo predeterminado de 150 000 resultados por consulta», ajustable mediante limit=N
, y para consultas más extensas, la documentación recomienda utilizar la API de paginación con page
y pageSize
.
Por qué esto es especialmente valioso: saca a la luz URL históricas. Páginas que se han eliminado, secciones que se han reestructurado, páginas de destino de campañas que se han desvinculado. Para comprender cómo era un sitio web anteriormente, o para encontrar contenido huérfano que sigue activo, no hay nada que se le pueda comparar —y no supone ninguna carga para el sitio de destino.
Common Crawl
Un gran corpus público de rastreo con un índice que se puede consultar, y un recurso realmente infrautilizado.
Common Crawl publica rastreos periódicos de una parte considerable de la web, junto con un índice de URL. Al realizar una consulta, se obtienen las URL que el rastreador ha detectado para un dominio, de forma masiva, sin necesidad de acceder al sitio.
Las ventajas e inconvenientes son evidentes. La cobertura es amplia, pero no completa: se trata de un rastreo, sujeto a los mismos puntos ciegos que cualquier otro. La actualidad depende del rastreo que se consulte. Además, consultar el índice a gran escala es más una tarea de procesamiento de datos que una simple solicitud.
Dónde destaca: en investigaciones a gran escala, al comparar muchos dominios y en cualquier situación en la que se desee obtener una visión de un sitio web sin generar tráfico hacia él.
Rastreo: el último recurso, hecho como es debido
Cuando las fuentes gratuitas dejan lagunas, hay que rastrear. Hazlo de forma que no genere problemas.
El bucle básico: recuperar una página, extraer enlaces, filtrar según el dominio de destino, poner los nuevos en cola y repetir hasta que la cola se vacíe. Sencillo en principio, pero lleno de detalles.
Detalles importantes:
Respeta el archivo «robots.txt». Ahora es un estándar: el RFC 9309 define la coincidencia por especificidad en lugar de por orden, exige actualizar el archivo al menos una vez al día y trata un error del servidor como una prohibición total. Utiliza una biblioteca actualizada en lugar de escribir el analizador tú mismo.
Normaliza las URL de forma exhaustiva. Las barras finales, el orden de los parámetros de consulta, las mayúsculas y minúsculas en los nombres de host, los identificadores de sesión y los parámetros de seguimiento producen duplicados. Un rastreador sin normalización visitará la misma página cientos de veces.
Limita el rastreo. Límites de profundidad, límites de número de páginas y exclusiones de patrones para calendarios y navegación por facetas. Sin ellos, algunos sitios son infinitos.
Límita tu propia frecuencia de solicitudes. Una solicitud cada segundo o dos es una práctica respetuosa y adecuada para la mayoría de las tareas. Crawl-delay en robots.txt es una solicitud que merece la pena respetar.
Identifícate. Un agente de usuario con un nombre y una URL de contacto es bloqueado con mucha menos facilidad que una automatización anónima.
Almacena en caché y utiliza solicitudes condicionales. If-Modified-Since y If-None-Match convierten un nuevo rastreo en una serie de 304 de bajo coste.
Cuándo intervienen los proxies: a gran escala, cuando se limita la tasa de una sola dirección o cuando el contenido varía según la región. No antes. El ancho de banda de los centros de datos es la opción predeterminada más sensata para esto —el nuestro empieza en 0,14 $/GB, consultado en septiembre de 2026— y solo merece la pena recurrir al residencial cuando se demuestre que el de los centros de datos falla.
Otras fuentes que conviene conocer
Cuatro fuentes más pequeñas que cubren carencias específicas.
Registros de transparencia de certificados. Cada certificado TLS emitido se registra públicamente, y los certificados indican sus nombres de host. Al consultar un agregador de registros de CT para un dominio, se revelan los subdominios, incluidos aquellos que parecen internos y que nunca se pretendió que se encontraran por otros medios. Este es, sin duda, el mejor método para descubrir subdominios y no implica ningún contacto con el objetivo.
Fuentes RSS y Atom. Siguen publicándose ampliamente y enumeran el contenido de forma estructurada con fechas. Consulta /feed, /rss, /atom.xml y las etiquetas <link rel="alternate"> en el encabezado de la página.
El propio sistema de búsqueda y navegación del sitio web. Un índice de la A a la Z, una lista de etiquetas, una página de categorías o una página de mapa del sitio en HTML: muchos sitios web publican uno de estos elementos para los visitantes humanos, y a menudo es más completo que el mapa del sitio en XML.
La API que hay detrás de la interfaz de usuario. Si el sitio es una aplicación de página única, recurre a una API para obtener su contenido, y esa API suele exponer puntos finales de listado que devuelven toda la información de forma estructurada. Echa un vistazo a la pestaña «Red» de tu navegador. Esta es, sin excepción, la vía más rápida en los sitios web modernos y, sin excepción, la que la gente encuentra en último lugar.
Combinación de fuentes
El método práctico para una enumeración rigurosa, y la razón por la que el orden es importante.
Recopila de forma independiente y fusiona. URL de mapas de sitio, URL de archivos, URL de feeds y resultados de rastreo en un único conjunto. Normaliza antes de fusionar, o contarás la misma página varias veces.
Verifica si están activas. Una URL de archivo puede dar un error 404 hoy. Una solicitud HEAD
por cada URL no supone ningún coste:
while read -r url; do
code=$(curl -sIL -o /dev/null --max-time 10 -w '%{response_code}' "$url")
echo "$code $url"
done < urls.txt
Compara las fuentes entre sí. Las URL que aparecen en el archivo pero no en el mapa del sitio son páginas eliminadas o huérfanas. Las URL que aparecen en el mapa del sitio pero que devuelven un error 404 son entradas obsoletas. Las URL encontradas mediante rastreo pero que no figuran en el mapa del sitio son páginas que el propietario no quería que se indexaran. Cada diferencia es información.
Realiza un seguimiento a lo largo del tiempo. Volver a ejecutar la tarea periódicamente y comparar los resultados te permite saber qué se ha añadido y qué se ha eliminado, lo que suele ser la verdadera pregunta que se esconde tras «encontrar todas las páginas».
Una guía práctica
Reunir las fuentes en un único dominio, en el orden que requiera menos trabajo.
Uno: busca los mapas del sitio declarados:
DOMAIN="example.com"
curl -s "https://$DOMAIN/robots.txt" | grep -i '^sitemap:' | awk '{print $2}' > sitemaps.txt
# fall back to the conventional locations if nothing is declared
[ -s sitemaps.txt ] || printf 'https://%s/sitemap.xml\nhttps://%s/sitemap_index.xml\n' "$DOMAIN" "$DOMAIN" > sitemaps.txt
Dos: expande los índices y recopila las URL. Un índice de mapa del sitio contiene valores de tipo «<loc>
» que apuntan a otros mapas del sitio, y un «urlset» contiene valores de tipo «<loc>
» que apuntan a páginas, por lo que la misma extracción funciona en ambos niveles y solo hay que repetirla:
extract() { curl -s --compressed "$1" | grep -o '<loc>[^<]*</loc>' | sed 's/<[^>]*>//g'; }
: > all_urls.txt
while read -r sm; do
extract "$sm" | while read -r u; do
case "$u" in
*.xml|*.xml.gz) extract "$u" >> all_urls.txt ;;
*) echo "$u" >> all_urls.txt ;;
esac
done
done < sitemaps.txt
sort -u all_urls.txt -o all_urls.txt
wc -l all_urls.txt
Tercero: añadir la vista del archivo:
curl -s "http://web.archive.org/cdx/search/cdx?url=${DOMAIN}/*&output=text&fl=original&collapse=urlkey&limit=50000" \
| sort -u > archive_urls.txt
wc -l archive_urls.txt
Cuarto: comparar en lugar de limitarse a combinar. Aquí es donde se encuentra el resultado interesante:
comm -13 all_urls.txt archive_urls.txt > only_in_archive.txt # orphaned or removed
comm -23 all_urls.txt archive_urls.txt > only_in_sitemap.txt # new or never archived
only_in_archive.txt
es la lista que merece la pena consultar en primer lugar. Se trata de URL que el sitio web albergaba en su día y que ya no anuncia; algunas darán error 404, y las que no lo hagan son páginas activas a las que nadie enlaza.
Cinco: comprueba que estén activas antes de fiarte de nada. Ambas listas contienen entradas obsoletas, y una solicitud HEAD
por URL consume unos pocos cientos de bytes en lugar de una página completa:
while read -r u; do
printf '%s %s\n' "$(curl -sIL -o /dev/null --max-time 10 -w '%{response_code}' "$u")" "$u"
done < only_in_archive.txt | tee liveness.txt
grep '^200 ' liveness.txt | wc -l
Fíjate en el orden deliberado: cuatro fuentes consultadas, miles de URL recopiladas y ni un solo rastreo escrito. En la mayoría de los sitios web, esto ofrece una visión más completa que la que proporcionaría un rastreador, en una fracción del tiempo, y el sitio apenas se da cuenta de que has estado allí.
Preguntas frecuentes
¿Cómo puedo encontrar todas las páginas de un sitio web?
Empieza por robots.txt para encontrar las declaraciones de mapas del sitio; a continuación, recupera los mapas del sitio y sigue los archivos de índice. Compleméntalo con la API CDX de Internet Archive para obtener URL históricas, fuentes RSS y una búsqueda en site:. Rastrea solo lo que estos no hayan detectado: es la opción más lenta y más intrusiva.
¿Dónde está el mapa del sitio de una web?
Normalmente en /sitemap.xml o /sitemap_index.xml, y la forma más fiable de encontrarlo es mediante la directiva Sitemap: en robots.txt. Los sitios web grandes utilizan un índice de mapa del sitio que apunta a varios archivos, ya que cada uno está limitado a 50 000 URL y 50 MB.
¿Puedo encontrar páginas que no estén enlazadas en ningún sitio?
A veces. Por definición, los rastreadores no pueden encontrarlas, pero los archivos web a menudo sí: la API CDX de Internet Archive devuelve URL históricas, incluidas aquellas a las que ya no se enlaza. Los registros de transparencia de certificados también revelan subdominios a los que no se enlaza desde ningún sitio.
¿Cómo puedo encontrar todos los subdominios de un sitio web?
Los registros de transparencia de certificados son la mejor fuente, ya que cada certificado TLS emitido se registra públicamente con sus nombres de host. Los operadores de motores de búsqueda y las herramientas de enumeración de DNS lo complementan. Ninguna de estas opciones requiere ponerse en contacto con el sitio en cuestión.
¿Es legal rastrear un sitio web para enumerar sus páginas?
Depende de la jurisdicción, de las condiciones de uso del sitio y de lo que se haga con el resultado. Respetar la política «robots.txt», identificar el rastreador y mantener una frecuencia moderada de rastreo te mantiene dentro de las prácticas habituales. No obstante, las condiciones de uso pueden prohibir el acceso automatizado, y ese es un aspecto contractual que conviene comprobar.
¿Cuántas URL puede contener un mapa del sitio?
50 000 por archivo, con un límite de 50 MB sin comprimir. Más allá de ese límite, los sitios utilizan un índice de mapas del sitio que enumera varios archivos de mapa del sitio, y el propio índice está sujeto a los mismos límites de 50 000 y 50 MB.
¿Qué es la API Wayback CDX?
Una interfaz para el índice de capturas de Internet Archive que devuelve las URL que ha archivado para un dominio. matchType controla el alcance, desde una sola URL hasta un dominio y todos sus subdominios; collapse=urlkey elimina las capturas duplicadas; y el límite predeterminado de resultados es de 150 000, con una API de paginación para consultas más amplias.
¿Necesito proxies para enumerar las páginas de un sitio web?
No para los métodos de mapa del sitio, archivo, feed o búsqueda: ninguno de ellos genera una carga significativa. Los necesitas para rastreos de gran envergadura en los que una sola dirección tiene una limitación de velocidad, o cuando el contenido varía según la región. Comprueba que las fuentes gratuitas tengan lagunas antes de comprar nada.
Conclusión
No existe una lista completa de las páginas de un sitio web, sino solo un conjunto de vistas parciales; y lo más útil es recopilar las vistas que requieren menos recursos antes de crear las que requieren más.
En treinta segundos en robots.txt se encuentran las declaraciones del mapa del sitio. Unos minutos siguiendo el índice del mapa del sitio te dan lo que el propietario considera que es su sitio. La API CDX de Internet Archive añade las páginas que solían existir y aquellas a las que ya nadie enlaza. Los feeds, los registros de transparencia de certificados y el propio índice HTML del sitio cubren cada uno una laguna diferente. Todo ello es gratuito y nada de ello supone una carga para el sitio de destino.
Realiza un rastreo de lo que queda, respetando la etiqueta robots.txt, normalizando las URL, limitando el rastreo y manteniendo una frecuencia moderada; además, comprueba primero si el sitio es una aplicación de una sola página que llama a una API, ya que esa vía suele ser más rápida que el rastreo y casi siempre se pasa por alto.
A continuación, compara las fuentes en lugar de limitarte a fusionarlas. Las páginas que están en el archivo pero no en el mapa del sitio, y las entradas del mapa del sitio que ahora devuelven un error 404, suelen ser lo más interesante que se obtiene de todo este proceso.
