Qué es wget
wget es una utilidad de línea de comandos para descargar contenidos de la web sin depender de interfaces gráficas. Nació en el ecosistema GNU y, pese a su apariencia austera, sigue siendo la navaja suiza para descargas reproducibles, automatizables y resistentes. En mi día a día me ha salvado descargas cuando la conexión iba a tirones: reanudar sin empezar de cero es una de esas pequeñas maravillas que hacen que wget sea difícil de reemplazar.

GNU, multiplataforma y filosofía de software libre
wget es software libre y gratuito. Eso no es solo una etiqueta: significa transparencia, auditoría y control total. Aunque su hogar natural es Linux, hoy puedo usarlo también en macOS y Windows, lo que me permite estandarizar scripts en equipos mixtos sin dolores de cabeza. Me gusta su sencillez: ligero, sin adornos, perfecto para meter en cron, en contenedores y en máquinas remotas con pocos recursos.
Instalación y primeros pasos
En la mayoría de distros Linux, wget ya viene instalado. Si no, bastan estos comandos:
- Debian/Ubuntu:
sudo apt update && sudo apt install -y wget
- Fedora:
sudo dnf install -y wget
- Arch:
sudo pacman -S wget
Comprobar versión y ayuda rápida
wget --version
wget --help | less
La ayuda es clara y los ejemplos son concisos; cuando probé los flags por primera vez, me sorprendió lo coherente que es la sintaxis.
12+ recetas de wget que sí usarás
Aquí van las recetas que realmente uso (o he visto usar) y que cubren la mayoría de casos reales. Cuando necesito ser cuidadoso con la red de la oficina, limitar la velocidad y los reintentos me evita saturar la línea y quedar mal con el equipo.
Reanudar descargas inestables (-c)
Si una descarga se corta, no empieces de cero:
wget -c https://ejemplo.com/archivo.iso
-c(continue) añade al final del archivo parcial.- Útil con conexiones inestables o ficheros grandes.
Limitar ancho de banda por descarga (--limit-rate)
Para no acaparar la red:
wget --limit-rate=500k https://ejemplo.com/video.mp4
Acepta k, m y g. Lo combino con espera aleatoria cuando lanzo muchas descargas.
Descargar múltiples archivos desde una lista (-i)
Mantén un txt con URLs (una por línea):
wget -i urls.txt -P ./descargas
-Pguarda todo en el directorio indicado.- Añade
--continuey--timestampingpara reanudar y evitar descargas repetidas.
Guardar con otro nombre y directorio (-O, -P)
Renombrar destino:
wget -O ubuntu.iso https://releases.ubuntu.com/.../imagen.iso
Guardar en carpeta concreta:
wget -P ./isos https://servidor/imagen.iso
Descargas en segundo plano (-b) y logs
Cuando no quiero tener la terminal “ocupada”:
wget -b https://ejemplo.com/backup.tar.gz -o wget.log
tail -f wget.log
-b(background) +-opara log.tail -fpara monitorizar en tiempo real.
Mirror de sitios con exclusiones inteligentes (--mirror, --no-parent, --reject)
Para clonar un sitio estático sin basura innecesaria:
wget --mirror --convert-links --page-requisites \
--no-parent --reject "*.zip,*.mp4" \
-P ./mirror https://ejemplo.com/docs/
--mirrorequivale a-r -N -l inf --no-remove-listing.--no-parentevita subir a directorios superiores.--convert-linksrehace enlaces para navegar offline.
Detección de enlaces rotos (modo spider)
Comprobar si una web tiene enlaces caídos:
wget --spider -r -l 3 -nd -H -t 2 -w 1 \
-o spider.log https://ejemplo.com
grep -E "broken|404|ERROR" spider.log
Reintentos, esperas y random-wait sin saturar
Cuando lanzo lotes, juego seguro:
wget -t 5 --wait=2 --random-wait --retry-connrefused \
--timeout=30 https://ejemplo.com/datos.csv
-t 5: hasta 5 intentos.--wait+--random-wait: pausas humanas para evitar rate limits.
Descargas detrás de sesión o token:
# Básica (¡evita en texto plano si puedes!)
wget --user=usuario --password=secreta https://intranet/privado.pdf
# Header con token Bearer
wget --header="Authorization: Bearer $TOKEN" https://api/descarga
# Con cookies (previas)
wget --load-cookies cookies.txt https://sitio/archivo.zip
En mi experiencia, cargar cookies previamente exportadas del navegador resuelve muchos accesos sin pelear con SSO complejos.
Descargar por rangos o patrones
Para series numeradas:
wget https://servidor/logs/app-2025-10-{01..09}.log
Con --accept/--reject filtras por extensión al hacer descargas recursivas.
Trabajar vía FTP y FTPS
wget --ftp-user=usuario --ftp-password=clave \
ftp://ftp.ejemplo.com/backup/diario.tar.gz
Si el FTP admite TLS, usa ftps://.
Evitar descargas duplicadas (--timestamping o -N)
Solo descarga si el remoto es más nuevo:
wget -N https://servidor/dataset.csv
Esto me ahorra tiempo y ancho de banda en jobs programados.
Proxy y user-agent personalizado
https_proxy=http://proxy.local:8080 wget \
--user-agent="Mozilla/5.0 (compatible; ScriptDescargas/1.0)" \
https://ejemplo.com/archivo
Algunos servidores bloquean agentes por defecto; cambiar el UA suele bastar.
Casos avanzados y automatización
Retries, backoff y control fino por host
Cuando descargo de varios dominios, limito conexiones simultáneas:
wget -r --wait=1 --random-wait --limit-rate=300k \
--domains=ejemplo.com,cdn.ejemplo.com \
https://ejemplo.com/coleccion/
Así evito castigar un host concreto y mantengo la red “respirando”.
En entornos corporativos combino cookies con --header para adjuntar tokens transitorios. Si falla, envío --referer o --content-disposition para respetar nombres de archivo del servidor:
wget --content-disposition --trust-server-names \
--header="Authorization: Bearer $TOKEN" \
"https://api.ejemplo.com/reportes?id=123"
Programar con cron y scripts Bash
Un job de cron que corre cada madrugada y no duplica:
# /usr/local/bin/descarga_diaria.sh
#!/usr/bin/env bash
set -euo pipefail
DEST="/var/backups/datos"
mkdir -p "$DEST"
wget -N --limit-rate=400k -P "$DEST" https://servidor/datos.csv
Cron:
0 3 * * * /usr/local/bin/descarga_diaria.sh >> /var/log/descargas.log 2>&1
Cuando necesito robustez adicional, uso -t, --timeout y salidas a log con -o.
Buenas prácticas y errores comunes
- Usa
-Ny-ccon cabeza: no mezcles si el servidor no soporta rangos o Last-Modified. - Respeta robots y TOS: el modo recursivo no es carta blanca; limita la profundidad
-l. - Time-outs y DNS: ajusta
--dns-timeout,--connect-timeouty--read-timeouten redes problemáticas. - Rutas con espacios: comillas siempre.
- Certificados: si hay TLS corporativo, añade CA al trust store; evita
--no-check-certificatesalvo diagnóstico.
Wget vs curl: cuándo usar cada uno
wgetbrilla en descargas no interactivas: reintentos integrados, recursividad, mirror, control de velocidad y timestamping. Para mí, es ideal cuando quiero lanzar y olvidarme; de hecho, lo suelo poner en cron porque su comportamiento por defecto es muy “descargador”.curles excelente para interacciones HTTP complejas: APIs, verbos distintos a GET, subida de datos, form-data, pipes conjq. También descarga, pero carece de recursividad nativa y mirror.- Regla rápida personal: si voy a bajar y ya,
wget. Si voy a hablar con un servicio (autenticación avanzada, POST/PUT, depurar headers),curl.
FAQs rápidas
¿Cómo reanudo una descarga interrumpida?wget -c URL.
¿Cómo limito la velocidad?wget --limit-rate=500k URL.
¿Cómo descargo varias URLs?wget -i lista.txt.
¿Cómo hago un espejo sin subir de nivel?wget --mirror --no-parent URL.
¿Cómo evito bajar otra vez lo mismo?wget -N URL.
¿Cómo programo todo esto?
Pon el script en /usr/local/bin y crea un cron (ejemplo arriba).
Sobre Wget
wget es ese compañero silencioso que hace el trabajo: fiable, ligero y muy script-friendly. En mi caso, poder reanudar sin drama, limitar el ancho de banda y automatizar con cron me ahorra horas y evita disgustos con la red. Si vienes de gestores gráficos, prueba dos o tres recetas de aquí y verás por qué sigue siendo imprescindible.
Tabla express de flags útiles
| Flag | Para qué sirve | Nota rápida |
|---|---|---|
-c | Reanudar descargas | Evita empezar de cero |
-N | Timestamping | Solo baja si hay cambios |
-O / -P | Renombrar / Ruta destino | Control del output |
--limit-rate | Limitar velocidad | Acepta k/m/g |
-b | Segundo plano | Úsalo con -o para logs |
--mirror | Espejo de sitio | Combina recursivo + timestamp |
--spider | Verificar enlaces | Ideal para auditorías |
-t, --wait, --random-wait | Reintentos y pausas | Menos riesgo de bloqueo |
--header, --load-cookies | Acceso privado | Tokens y sesiones |
--user-agent | Cambiar agente | Evitar bloqueos por defecto |
Opinión Personal
Wget es de esas herramientas que no presumen, pero nunca fallan. Cuanto más ruido hacen los gestores de descargas con interfaces brillantes, más valoro lo esencial: una utilidad ligera, libre y transparente que hace exactamente lo que promete. Para mí, su mayor virtud es la fiabilidad en situaciones reales: conexiones inestables, servidores lentos, cortes inesperados… con -c reanudo sin dramas y sigo con mi día. Ese “set and forget” que te permite lanzar un script, limitar el ancho de banda y dejar que trabaje en segundo plano, es oro en entornos donde la red es compartida.
También me parece una lección de diseño: pocas banderas, muy potentes. --limit-rate para no saturar, -N para no descargar de nuevo lo mismo, --mirror para replicar sitios con cabeza. Sumado a que es multiplataforma, puedo estandarizar procesos en Linux, macOS o Windows sin rehacer mi enfoque. Y aunque adoro curl para hablar con APIs, cuando el objetivo es descargar bien y a la primera, sigo confiando en wget. No me distrae, no me engaña con promesas vacías y, sobre todo, me da control fino con logs, reintentos y esperas aleatorias para respetar al servidor.
¿Inconvenientes? Solo uno: subestimarlo. Mucha gente lo prueba una vez, se queda con el “wget URL y ya”, y se pierde la mitad de su poder. En cuanto incorporas un puñado de flags a tu flujo—continuar, timestamping, headers/cookies—la herramienta se convierte en un compañero silencioso que te ahorra tiempo todos los días.
Ahora te leo a ti: ¿qué te ha salvado wget últimamente?, ¿qué receta usas a diario o qué problema no has conseguido resolver aún? Déjame tus comentarios y experiencias abajo; así pulimos una guía con casos reales que de verdad te funcione.




