Nuestra postura, clara y rotunda: somos Geonode y vendemos proxies, que casi nunca son necesarios para esto. Hacer un mirror de un sitio para el que tienes permiso es una tarea de una sola fuente y volumen moderado que funciona perfectamente desde tu propia conexión. Si estás pensando en utilizar proxies para ello, eso suele significar que estás creando un espejo a un ritmo que el sitio web no acepta, y la solución correcta es reducir la velocidad en lugar de distribuirlo. Hay una excepción real —la creación de un espejo de contenido específico de una región— y se indica más abajo. Todo lo demás que se explica en este artículo funciona desde un portátil sin necesidad de infraestructura alguna.
Qué hacen realmente estas herramientas
Cuatro pasos, en todas las herramientas de la categoría.
Recuperar una página. Descargar el código HTML. Buscar los recursos. Analizar la página en busca de imágenes, hojas de estilo, scripts y fuentes, y rastrearlos también. Seguir los enlaces. Descubrir más páginas dentro del ámbito que hayas definido. Reescribir las referencias. Cambiar las URL absolutas por rutas relativas para que la copia funcione desde tu sistema de archivos.
Ese cuarto paso es lo que distingue a un «ripper» de un «crawler». Un «crawler» recopila datos; un «ripper» genera una copia local navegable, y la reescritura de enlaces marca la diferencia.
Los usos legítimos son bastante comunes: archivar un sitio web antes de que deje de estar disponible, descargar documentación para llevarla de viaje o para una red con restricciones, migrar entre plataformas, mantener un registro de cumplimiento normativo y conservar tu propio trabajo cuando un proveedor de alojamiento cierra.
wget: la opción por defecto
Ya está presente en la mayoría de los sistemas Unix y resulta adecuada para una gran parte de las tareas.
wget --mirror --convert-links --adjust-extension --page-requisites \
--no-parent --wait=1 --random-wait \
https://example.com/docs/
Cada opción tiene su razón de ser, y el manual de wget las describe con precisión.
**--mirror
** «activa opciones adecuadas para la creación de réplicas. Esta opción activa la recursividad y el sellado de tiempo, establece una profundidad de recursividad infinita y conserva los listados de directorios FTP. Actualmente es equivalente a -r -N -l inf --no-remove-listing
».
**--page-requisites
** «hace que Wget descargue todos los archivos necesarios para mostrar correctamente una página HTML determinada. Esto incluye elementos como imágenes incrustadas, sonidos y hojas de estilo a las que se hace referencia». Sin ella, se obtiene un código HTML sin estilo y sin imágenes.
**--convert-links
** reescribe las referencias «una vez completada la descarga... para que sean aptas para su visualización local», lo que afecta «no solo a los hipervínculos visibles, sino a cualquier parte del documento que enlace a contenido externo».
**--adjust-extension
** añade .html
a las páginas servidas como HTML sin extensión HTML; el manual pone como ejemplo «la creación de un sitio espejo de un sitio remoto que utiliza páginas .asp, pero en el que se desea que las páginas del sitio espejo se puedan visualizar en un servidor Apache estándar».
**--no-parent
** garantiza «que solo se descarguen los archivos situados por debajo de una determinada jerarquía», lo que limita la tarea a /docs/
en lugar de a todo el sitio.
**--wait=1
** es la opción de cortesía, y el manual la recomienda explícitamente: «Se recomienda el uso de esta opción, ya que aligera la carga del servidor al reducir la frecuencia de las solicitudes».» Combínala con --random-wait
, que, según señala el manual, se «inspiró en esta recomendación poco acertada de bloquear el acceso a un sitio web a muchos usuarios ajenos al asunto debido a las acciones de uno solo».
Hay otras dos opciones que conviene conocer. -Q
establece un límite de descarga para que un espejo ilimitado no llene tu disco. Y -l
establece una profundidad de recursión si «infinito» resulta demasiado generoso.
Las limitaciones de wget son reales: no ejecuta JavaScript, su reescritura de enlaces es buena pero no perfecta en sitios web complejos, y carece de interfaz gráfica. Para un sitio de documentación o un blog estático, nada de eso importa.
HTTrack: el clásico con interfaz gráfica
HTTrack es la herramienta especializada más conocida de su categoría, de código abierto, multiplataforma y con interfaz gráfica y línea de comandos. El proyecto sigue activo.
Ventajas respecto a wget: una interfaz auténtica para quienes no se pasan el día en la terminal, mejor gestión de estructuras de enlaces complejas, proyectos reanudables y un modo de actualización que solo vuelve a copiar lo que ha cambiado.
En qué se queda corto: la misma limitación fundamental —no ejecuta JavaScript—, además de una sintaxis de filtrado que requiere cierto aprendizaje y una reputación entre los administradores de sitios web que hace que algunos lo bloqueen por agente de usuario.
Para un usuario sin conocimientos técnicos que necesite una copia navegable de un sitio web estático, esta es la recomendación. Para cualquiera que se sienta cómodo con un shell, wget hace el mismo trabajo con menos sorpresas.
Herramientas de una sola página
Un enfoque diferente del problema y, a menudo, el más adecuado.
Si lo que quieres es una página completa en lugar de un sitio web entero, las herramientas que integran todo en un único archivo HTML autónomo resultan más útiles que un sitio espejo. Incrustan las imágenes como URI de datos, integran el CSS y generan un único archivo que puedes enviar por correo electrónico, archivar o abrir en cualquier lugar sin dependencias.
Las extensiones de navegador de este tipo son la opción más práctica para la mayoría de las personas, y tienen una ventaja decisiva sobre todas las herramientas de línea de comandos aquí mencionadas: capturan la página tal y como se muestra, una vez que se ha ejecutado el JavaScript. Para una aplicación moderna, esa es la diferencia entre una copia funcional y un caparazón vacío.
La contrapartida es que son manuales: una página cada vez, con un clic del usuario. Para unas pocas páginas está bien; para mil, no lo está.
ArchiveBox y herramientas de conservación
ArchiveBox es la opción más destacada cuando el objetivo es la conservación, más que la navegación sin conexión. A partir de unas URL, genera varios formatos de archivo a la vez: HTML, una captura de pantalla, un PDF, texto extraído y un archivo WARC.
Vale la pena conocer el formato WARC, ya que es el que utilizan los archivos web. Almacena las propias transacciones HTTP en lugar de una aproximación del sistema de archivos, lo que significa que se conservan los encabezados, los códigos de estado y los bytes exactos. Para cualquier ámbito en el que la fidelidad sea importante —asuntos legales, cumplimiento normativo, investigación—, se trata de un registro sustancialmente mejor que un directorio de HTML reescrito.
ArchiveBox se aloja en el propio servidor, mantiene un índice y gestiona JavaScript mediante un navegador sin interfaz gráfica. Es más pesado que wget, pero genera un resultado más duradero.
Por qué todos tienen dificultades con los sitios web modernos
La única explicación que subyace a la mayor parte de la decepción en esta categoría.
Representación de JavaScript. wget y HTTrack descargan el HTML y lo analizan. Una aplicación de página única devuelve un documento casi vacío más un paquete de scripts, y el contenido se ensambla en el navegador. Lo que se duplica es la estructura.
Contenido basado en API. Incluso cuando el HTML inicial tiene contenido, la navegación posterior puede recuperar datos JSON de una API. Esas solicitudes se realizan mediante código, no a través de enlaces en el marcado, por lo que una copia que siga los enlaces nunca las detectará.
Desplazamiento infinito y carga diferida. El contenido que aparece al interactuar no está en el código de marcado en absoluto.
Enrutamiento del lado del cliente. URL que nunca llegan al servidor. Un sitio espejo no puede recuperar lo que nunca se ha solicitado.
Autenticación y personalización. Cualquier cosa que requiera iniciar sesión y cualquier elemento que varíe según el usuario.
Las soluciones alternativas, ordenadas por nivel de esfuerzo:
Busca una exportación estática. Los sitios de documentación suelen ofrecer un PDF o un paquete descargable. Pregunta antes de crear el espejo.
Busca una API. Si el contenido procede de una, recuperarlo directamente es más fácil y ofrece una visión más completa que crear un espejo del front-end.
Utiliza una herramienta basada en el navegador para las páginas que realmente necesitan ser renderizadas. Playwright puede navegar, esperar a que se cargue el contenido y guardar el HTML renderizado, lo que supone una réplica con soporte para JavaScript a cambio de tener que escribir un script y utilizar un ancho de banda considerablemente mayor.
Acepta una réplica parcial. Para muchos fines, las partes estáticas de un sitio web son, de todos modos, lo que buscabas.
Cópia de un sitio web en JavaScript con Playwright
La solución práctica cuando las herramientas clásicas devuelven una estructura vacía. No es un extractor de uso general, pero basta para capturar un conjunto definido de páginas tal y como se muestran.
import { chromium } from 'playwright';
import { writeFile, mkdir } from 'fs/promises';
import { dirname } from 'path';
const urls = [/* the pages you want */];
const browser = await chromium.launch();
const ctx = await browser.newContext();
const page = await ctx.newPage();
for (const url of urls) {
await page.goto(url, { waitUntil: 'domcontentloaded' });
await page.waitForSelector('main', { timeout: 15000 }).catch(() => {});
const html = await page.content(); // rendered DOM, not source
const path = 'mirror' + new URL(url).pathname.replace(/\/$/, '/index') + '.html';
await mkdir(dirname(path), { recursive: true });
await writeFile(path, html);
await page.waitForTimeout(1000 + Math.random() * 1000);
}
await browser.close();
Hay cuatro aspectos importantes en este código.
**page.content()
devuelve el DOM renderizado**, no el código HTML fuente. Esa es precisamente la razón por la que este enfoque funciona donde wget no lo hace: se obtiene el marcado tal y como queda después de que JavaScript lo haya construido.
Esperar a un selector, no a que la red esté inactiva. Las páginas con balizas de análisis o websockets nunca quedan inactivas, por lo que waitUntil: 'networkidle'
simplemente agotará el tiempo de espera en muchos sitios web modernos. Esperar a un elemento que sabes que debe estar presente es más rápido y más fiable.
La pausa deliberada entre páginas. La misma cortesía que --wait
en wget, e igual de necesaria.
Sin reescritura de enlaces. Esta es la limitación real: se obtiene el HTML renderizado con referencias absolutas, por lo que la copia necesita una conexión a Internet para mostrarse correctamente. Añadir la reescritura implica analizar cada documento, descargar todos los recursos y reescribir las referencias —lo que equivale a reimplementar wget—, y en ese punto resulta más sencillo combinar ambas herramientas: utiliza Playwright para renderizar y guardar, y luego ejecuta wget sobre los archivos guardados para recopilar los recursos.
Y ten en cuenta el coste de ancho de banda. Un navegador descarga todas las imágenes, fuentes, scripts y vídeos en precarga, por lo que esto consume aproximadamente un orden de magnitud más de tráfico que un espejo de wget de las mismas páginas. Bloquear las solicitudes de fuentes y archivos multimedia con page.route()
lo reduce sustancialmente cuando estos no forman parte de lo que estás conservando.
Elección de una herramienta
| Necesidad | Herramienta |
|---|---|
| Página web estática, te sientes cómodo con la terminal | wget |
| Página web estática, prefieres una interfaz gráfica (GUI) | HTTrack |
| Una sola página, completa e independiente | Extensión del navegador de un solo archivo |
| Conservación fiel | ArchiveBox / WARC |
| Sitio con mucho JavaScript | Script de Playwright |
| Tu propio sitio antes de la migración | Exportación de tu plataforma |
Merece la pena destacar la última fila por separado, ya que es el caso que la gente suele resolver de la forma más complicada. Si eres el propietario del sitio web, utiliza la función de exportación de la plataforma. Un volcado de la base de datos, una compilación del sitio estático o una copia de seguridad del proveedor de alojamiento son completos, incluyen lo que la duplicación no puede ver y solo tardan unos minutos. Duplicar tu propio sitio web es hacer la versión difícil de una tarea fácil.
Las reglas que se aplican en todos los casos
Independientemente de la herramienta.
** El archivo «robots.txt» te afecta.** wget lo respeta por defecto. HTTrack lo respeta por defecto. A ambos se les puede indicar que no lo hagan, y hacerlo es una decisión deliberada que conlleva consecuencias. Ahora es un estándar — RFC 9309 — y ya hemos explicado cómo leerlo en cómo leer un archivo robots.txt.
La limitación de velocidad no es opcional. Un servidor espejo sin --wait envía solicitudes tan rápido como lo permita la conexión, lo cual es indistinguible de un ataque desde el punto de vista del servidor. Una solicitud por segundo es un mínimo razonable.
Los derechos de autor no desaparecen. Descargar una copia para leerla personalmente sin conexión es una cosa; volver a publicarla es otra muy distinta. El contenido sigue siendo propiedad del titular.
Las condiciones de uso pueden prohibirlo rotundamente, independientemente de la viabilidad técnica.
El ancho de banda le cuesta dinero al sitio web. Un sitio espejo de un sitio web grande puede transferir muchos gigabytes, y alguien tiene que pagar por ello.
Pregunta. Para cualquier cosa importante, un correo electrónico es más rápido que buscar una solución alternativa. Los propietarios de los sitios web suelen dar el visto bueno y, a veces, ofrecen un paquete que te ahorra todo el trabajo.
Para qué sirven los proxies, en pocas palabras
Dado que se trata de nuestro producto, la respuesta sincera es breve.
No los necesitas para crear un sitio espejo de una página web para la que tengas permiso, siempre que lo hagas a un ritmo razonable desde una única ubicación. Ese es el caso de la inmensa mayoría de los usos legítimos, y una sola conexión es suficiente para ello.
Podrías necesitarlos si el sitio ofrece contenido diferente según la región y quieres las versiones regionales —un sitio de documentación con páginas localizadas o un catálogo con existencias específicas para cada país—. En este caso, la geografía es el factor clave, y se trata de un caso de uso legítimo.
No las necesitas para ir más rápido, y recurrir a ellas por ese motivo significa que estás creando un sitio espejo a un ritmo que el sitio original consideraría inaceptable. La respuesta correcta a eso es --wait, no la distribución.
Si se da el caso regional, el ancho de banda del centro de datos es la opción sensata —el nuestro empieza en 0,14 $/GB, según se comprobó en septiembre de 2026 en nuestra página de precios— y ten en cuenta que una réplica completa se mide en gigabytes, por lo que las cuentas importan.
Preguntas frecuentes
¿Qué es un «website ripper»?
Es una herramienta que descarga las páginas y los recursos de un sitio web a un almacenamiento local y reescribe los enlaces para que la copia funcione sin conexión. La reescritura de enlaces es lo que la distingue de un rastreador, que recopila datos en lugar de crear un sitio espejo navegable.
¿Cómo descargo una página web completa?
wget --mirror --convert-links --adjust-extension --page-requisites --no-parent --wait=1 URL cubre la mayoría de las páginas estáticas. Si buscas una alternativa gráfica, HTTrack hace el mismo trabajo. Para una página con mucho JavaScript, ninguna de las dos opciones funcionará bien y necesitarás un método basado en el navegador.
¿Por qué mi sitio web descargado parece estar dañado?
Normalmente se debe a que falta --page-requisites, por lo que no se han descargado las hojas de estilo ni las imágenes, o a --convert-links, por lo que las referencias siguen apuntando al sitio en línea. Si las páginas están vacías en lugar de carecer de estilo, el sitio muestra el contenido mediante JavaScript y una herramienta que no lo renderiza no puede capturarlo.
¿Es legal descargar una página web?
Descargar para uso personal sin conexión no suele ser un problema; la republicación es otra cuestión, ya que los derechos de autor siguen siendo de aplicación. Las condiciones de uso pueden prohibir directamente la descarga automatizada, independientemente de los medios técnicos utilizados. Esto varía según la jurisdicción y no constituye asesoramiento jurídico.
¿Puedo descargar un sitio web que utilice JavaScript?
No con wget ni con HTTrack, que recogen y analizan el HTML sin ejecutar scripts. Necesitas un método basado en el navegador: una extensión de un solo archivo para páginas individuales o un script de Playwright que navegue, espere a que se cargue el contenido y guarde el resultado renderizado.
¿Cuál es el mejor programa gratuito para descargar páginas web?
wget, si te sientes cómodo con la línea de comandos, ya que viene preinstalado y es totalmente adecuado para sitios estáticos. HTTrack, si prefieres una interfaz gráfica. ArchiveBox, si el objetivo es la conservación más que la navegación, ya que genera archivos WARC además de HTML.
¿Cómo descargo una página web sin que me bloqueen?
Establece un retraso de al menos un segundo entre solicitudes, respeta el «robots.txt», identifícate de forma veraz y limita el alcance con «--no-parent» y un límite de profundidad. La mayoría de los bloqueos de este tipo se deben a la creación de réplicas a toda velocidad, lo que, desde la perspectiva del servidor, resulta idéntico a un ataque.
¿Debería utilizar un proxy para descargar una página web?
Solo si necesitas versiones del contenido específicas de una región. Para una descarga normal a una velocidad razonable, basta con una conexión. Recurrir a proxies para ir más rápido significa que estás transfiriendo a una velocidad que el sitio no acepta, y la solución para eso es un indicador de retardo.
Conclusión
En el caso de un sitio web estático, este problema ya está resuelto y la herramienta ya está instalada en tu ordenador. Un comando «wget» con cinco parámetros genera una copia local que se puede explorar, y el único parámetro que la gente suele olvidar es el que hace que sea «educado».
En el caso de una aplicación moderna, ninguna de las herramientas clásicas funciona, y el motivo no es una deficiencia que se pueda solucionar mediante la configuración. Estas herramientas descargan y analizan el HTML; el contenido lo ensambla JavaScript tras la descarga. Las opciones realistas son una captura basada en el navegador para las páginas que importan, una API si existe, o una exportación si eres el propietario del sitio —y esta última es la que, con mayor frecuencia, se resuelve por el camino más difícil.
Utilices lo que utilices, hay tres cosas que se aplican independientemente de la herramienta. Limita la velocidad, porque un mirror a toda velocidad es indistinguible de un ataque. Respeta robots.txt, porque es un estándar e ignorarlo es una elección. Y para cualquier cosa importante, pregunta: un correo electrónico lleva un minuto y, muy a menudo, genera un paquete que hace que todo el proceso resulte innecesario.
