Guía completa sobre cómo descargar archivos usando cURL

Comentarios: 0

cURL o Client URL es una herramienta desarrollada para obtener archivos, interactuar con APIs e incluso para probar recursos web. También está disponible para los sistemas operativos Windows, Mac y Linux lo que facilita a cualquier usuario de cURL la descarga de archivos. Client URL es apropiado tanto para la simple descarga de archivos como para tareas más avanzadas que impliquen la manipulación de datos e incluso para la incrustación de scripts.

En este artículo, cubriremos cómo descargar archivos usando cURL, cubriendo algunos comandos cURL útiles para descargar, especificar nombres, carpeta, y tratar con redirecciones, aceleradores de velocidad, y mucho más. También cubriremos comandos específicos para cURL en sistemas Windows, Linux y Mac.

Client URL.jpg

Gestión de nombres de archivo

Es esencial elegir el nombre de archivo correcto al guardar el documento descargado. cURL no guarda los datos, sino que los muestra en el terminal. Por lo tanto, si el usuario no selecciona una ubicación para guardar el archivo, éste no se encontrará en el sistema de archivos.

Todos los comandos con cURL se realizan en la línea de comandos: utilizando Windows - cmd o PowerShell y Linux o macOS - terminal.

Para nombrar archivos manualmente, el usuario debe utilizar el comando "-o" o alternativamente para su formato verboso "-output".

Considere el siguiente ejemplo:


curl -o test.html https://example.com

Este comando buscará la página en ejemplo.com y la guardará como prueba.html en el directorio de trabajo actual.

cURL, por defecto, guardará el archivo en el mismo directorio que contiene el archivo ejecutable a menos que se especifique lo contrario.

Cómo se guarda un archivo utilizando cURL junto con la especificación del directorio en el que se guardará el archivo:


curl -o ~/Downloads/test.html https://example.com

Esta opción colocará el archivo en la subcarpeta Descargas del directorio personal del usuario.

En esta configuración, si ya existe un archivo, el nuevo archivo sustituirá al antiguo sin advertencias. Para evitar esto, cURL -O para que el archivo se pueda guardar con el nombre proporcionado en la URL:


curl -O https://example.com/file.txt

Si file.txt es lo que se indica en la URL, se almacenará automáticamente con ese nombre. Si dicho archivo ya existe, será reemplazado.

Para garantizar que no haya pérdida de datos, se puede establecer un aviso de verificación antes de la descarga:


if [ -f file.txt ]; then
    echo "File already exists!"  
else  
    curl -O https://example.com/file.txt  
fi

This script first scans to see if the file is already present, only downloading the file if it is not.

Gestión de redireccionamientos

Algunos archivos no se guardan en ubicaciones específicas, sino que se obtienen a través de una redirección. Por ejemplo, un usuario de cURL que intente descargar un archivo grande puede descubrir que el navegador le dirige a otra página antes de iniciar la descarga. cURL no sigue las redirecciones por defecto a, pero esto puede cambiarse.

Para que cURL siga automáticamente las redirecciones, añada el indicador -L:


curl -L -o test.zip https://example.com/download

Si el servidor redirige inicialmente al usuario, cURL realizará primero la nueva petición y sólo entonces se descargará el archivo de la URL.

Por qué es importante:

  • Evitar la necesidad de pasar por páginas intermedias. Algunas páginas implementan redireccionamientos por motivos como descargas limitadas, autenticación o publicidad.
  • Utilizar URL acortadas. Por ejemplo, Bit.ly o TinyURL, y otros, simplemente redirigen al usuario a la URL real, sin -L el cURL obtendrá una página HTML con la redirección en lugar del archivo real.
  • Soporte de reenvío HTTPS. Un número de sitios reenviará primero todas las peticiones http:// a https://. Si no se utiliza -L, la descarga de archivos no funcionará.

El método de cURL procesa cada redirección en orden, siguiendo cada enlace que lleva a otra URL en secuencia hasta llegar al enlace de destino. En el caso de que el servidor se quede atascado en un bucle interminable de redirecciones, el servidor se verá atrapado. cURL tiene un comando que se puede utilizar para gestionar el número de redirecciones, que es '--max-redirs'.


curl -L --max-redirs 5 -o file.zip https://example.com/download

Este parámetro impone una restricción a cURL, de modo que detiene el proceso de descarga si se procesan demasiadas redirecciones y se supera el límite especificado.

Un ejemplo que da cURL cuando se sobrepasan los límites de redirección es el siguiente:


curl: (47) Maximum redirection limit reached

Descarga de varios archivos

Con cURL puedes descargar varios archivos simultáneamente, y algunos comandos funcionan en varios sistemas operativos, mientras que otros son específicos de Windows o Linux/macOS.

Formas comunes a todos los SO

  • Si un servidor contiene varios archivos, bastará con añadir tantos comandos -O como sean necesarios:
    
    curl -O https://example.com/file1.zip -O https://example.com/file2.zip
    
    
  • Si los archivos están numerados secuencialmente como file1.zip, file2.zip, file3.zip, entonces puedes poner el nombre del archivo entre paréntesis:
    
    curl -O https://example.com/file{1,2,3}.zip
    
    

Para Windows

  • Para Windows cURL, si un usuario tiene un documento de texto que contiene las URLs como urls.txt, puede descargar el archivo usando la línea de comandos:
    
    Get-Content urls.txt | ForEach-Object { curl -O $_ }
    
    
  • Si los ficheros están numerados, puede utilizar un bucle:
    
    For ($i=1; $i -le 3; $i++) { curl -O "https://example.com/file$i.zip" }
    
    

Para Linux y MacOS

  • Descarga desde una lista.

    Para empezar, cree un archivo urls.txt que contenga una lista de enlaces:

    
    https://example.com/file1.zip 
    https://example.com/file2.zip 
    https://example.com/file3.zip
    
    

    A continuación, ejecuta el comando:

    
    xargs -n 1 curl -O < urls.txt
    
    
  • Descarga en bucle (Bash).

    En el caso de que los ficheros estén numerados, es conveniente utilizar para:

    
    for i in {1..5}; do 
     curl -O https://example.com/file$i.zip 
    done
    
    

Limitación de velocidad

Cuando se necesita descargar un archivo grande utilizando cURL y se espera un tráfico de bajo ancho de banda, está disponible la opción --limit-rate, que ayuda a establecer un límite en la velocidad de descarga en (k) kilobytes por segundo, (m) megabytes por segundo, o (g) gigabytes por segundo.

Para los usuarios de cURL, la estructura de comandos es la misma en todos los sistemas operativos:


curl --limit-rate 500k -O https://example.com/archive.zip

En este caso, 500k significa que la velocidad de descarga no debe superar los 500 KB/s.

Otras notas:

  • --limit-rate 2m - límite de 2 MB/s;
  • --limit-rate 100k - límite de 100 KB/s.

A continuación se muestra un script de ejemplo para descargar archive1.zip, archive2.zip y archive3.zip a una velocidad de descarga de 500 KB/s.

Windows (PowerShell):


1..3 | ForEach-Object { curl --limit-rate 500k -O https://example.com/archive$_.zip }

Linux/macOS (Bash):


for i in {1..3}; do 
 curl --limit-rate 500k -O https://example.com/archive$i.zip 
done

La opción --limit-rate es eficaz en condiciones de conexión de red sostenida, ya que reduce las posibilidades de interrupción de la red. Esto es útil cuando se están descargando varios archivos a la vez, o si se están realizando otras actividades en la red. Además, --limit-rate ayuda a mitigar las posibilidades de ser bloqueado por un servidor que tenga restricciones para las descargas. Cuando la descarga se realiza a través de un proxy, el parámetro ayuda a reducir la carga y minimizar las posibilidades de quedarse bloqueado. Este comando también ayuda a gestionar el tráfico cuando se trabaja con Internet móvil o tarifas con una cantidad limitada de datos.

Descargas silenciosas

En cURL, el progreso de una descarga, junto con su velocidad, se muestra por defecto en una ventana de terminal. Esto es útil para algunos usuarios de cURL, sin embargo, puede suprimirse para scripts o procesos automatizados. En estos casos, se puede activar la bandera -s o --silent.

Ejemplo de cómo utilizar la línea de comandos cURL en modo "silencioso" para descargar archivos:


curl -s -O https://example.com/file.zip

Como sugiere el comando, todos los archivos se descargarán con cURL sin mostrar información en pantalla. En caso de que sea necesario mostrar sólo los errores, y poner todos los demás mensajes en silencio, se puede utilizar -S (--show-error) y combinarlo con los argumentos antes mencionados:


curl -s -S -O https://example.com/file.zip

Autenticación

La descarga de algunos archivos y el uso de algunas API requieren autorización. cURL tiene una arquitectura que admite un buen número de procedimientos de autenticación, como los que utilizan un nombre de usuario y una contraseña, o incluso tokens de acceso.

En caso de que el acceso requiera un nombre de usuario y una contraseña, éstos pueden enviarse como un único argumento con la bandera -u:


curl -u username:password -O https://example.com/protected-file.zip

Si la contraseña lleva componentes especiales como, por ejemplo, @, #, &, etc., es aconsejable entrecomillarla:


curl -u username:"your@password#123" -O https://example.com/protected-file.zip

En caso de que sólo se envíe el nombre de usuario, cURL solicita la contraseña.

Otro método de autenticación en un sistema emisor puede realizarse utilizando un token de acceso, en este caso, el token se incluye en la cabecera de la solicitud con el como se muestra a continuación:


curl -H "Authorization: Bearer your_token_here" -O https://api.example.com/data.json

Algunos servicios pueden requerir que el token se incluya directamente en la URL. Entonces el comando tendrá el siguiente aspecto:


curl -O https://api.example.com/data.json?access_token=your_token_here

En cualquier caso, poner el token en la URL puede ser problemático porque el nombre de la ruta del usuario podría almacenarse en el historial del navegador o en los registros del servidor.

Estos métodos de autenticación funcionan bien cuando uno necesita obtener datos de los archivos de un servidor protegido, solicitar datos de API o acceder a datos desde un entorno corporativo.

Descarga a través de proxy

Los proxies son especialmente útiles para cURL y su uso común es en el acceso remoto a archivos ya que cURL soporta la transmisión de datos a través de la mayoría de los protocolos.

La configuración de un proxy se realiza con -x (o -proxy).

La forma general del comando es la siguiente:


curl -x [scheme://]proxy-server[:port] -o output.file URL

Ejemplo: descarga de un archivo a través de un proxy HTTP:


curl -x http://proxy.testnet.com:80 -o file.zip https://example.com/archive.zip

Where:

  • -x http://proxy.testnet.com:80 - designa el proxy HTTP requerido y el puerto que utilizará;
  • -o archive.zip - indica el nombre del archivo bajo el que se almacenará;
  • https://example.com/archive.zip - la ubicación del archivo que se está descargando.

Cuando se requiere un nombre de usuario y una contraseña para los servidores proxy, se pueden utilizar así:


curl -x http://proxy.example.com:80 -U user:password -o archive.zip https://example.com/archive.zip

Un enfoque diferente - pasar la autenticación a través de la URL:


curl -x http://user:password@proxy.example.com:80 -o archive.zip https://example.com/archive.zip

Para trabajar con SOCKS5 o SOCKS4, establezca el parámetro --proxy con el tipo, por ejemplo:


curl --proxy socks5h://proxy.example.com:1080 -o archive.zip https://example.com/archive.zip

Matiz importante:

  • socks5h:// - permite pasar consultas DNS a través del proxy de forma más anónima;
  • socks5:// - transmite las consultas DNS directamente (menos seguro).

El proxy proporcionará anonimato, ya que la dirección IP original no estará disponible para los sitios que visite el usuario. Además, los bloqueos de recursos de determinadas regiones pueden eludirse si se accede desde otro país. Al utilizar un proxy para descargar archivos, los usuarios de redes corporativas pueden acceder a recursos cerrados y mejorar la velocidad de carga como resultado de la restricción del proveedor o del almacenamiento de datos en caché.

Seguimiento del progreso

Es aconsejable permanecer alerta para supervisar adecuadamente el proceso de descarga de archivos utilizando cURL, particularmente con archivos de gran tamaño. Esto se puede lograr mediante la utilización de capacidades incorporadas que incluyen pantallas de progreso como una barra de descarga interactiva, así como detallada.

El indicador -# o --progress-bar sustituye el indicador básico de porcentaje de descarga por una barra móvil. Esto es útil si se requiere medir el rendimiento del sistema de una forma más compacta y gráfica.


curl -# -o file.zip https://example.com/file.zip

Una barra con indicador de llenado se mueve de izquierda a derecha:

1.jpg

Este método es conveniente si uno desea seguir la operación con un límite en la cantidad de información mostrada.

Para observar con mayor detalle la velocidad, el tiempo y la cantidad de datos que se están descargando, se pueden utilizar las opciones -v y -w conjuntamente.

  • Ejemplo con -v (Algunos detalles añadidos en la salida):
    
    curl -v -o file.zip https://example.com/file.zip
    
    
  • Para mostrar los indicadores principales una vez finalizada la descarga, debe configurar un formulario concreto con -w:
    
    curl -o file.zip -w "Download speed: %{speed_download} bits per second\n" https://example.com/file.zip
    
    

Esto permite monitorizar la velocidad de descarga durante todo el proceso.

Para los casos en los que la conexión es inestable, la velocidad de descarga se puede juzgar de cerca. Si hay obstrucciones, se producirá una caída repentina de la velocidad del proceso o una disminución total. Cuando la conexión es estable, se puede controlar la velocidad y el rendimiento general de la red.

Información de solicitud/respuesta

El comando cURL permite recuperar multitud de información que puede ayudar a identificar problemas como desconexiones, ratificaciones o incluso parámetros de códigos de respuesta HTTP que pueden ser cruciales en el diagnóstico de errores. Para ello, se utilizará la bandera -v que activa el modo de salida expandida.

Ejemplo:


curl -v -o file.zip https://example.com/archive.zip

La salida tendrá un aspecto similar al siguiente durante la ejecución del comando.

2.jpg

Observará los siguientes datos clave:

  • dirección IP del servidor y establecimiento de la conexión;
  • solicitud HTTP original;
  • estado de la respuesta del servidor;
  • cabeceras de respuesta que incluyen Content-Type, fecha y algunos parámetros de caché.

Los detalles de las peticiones y respuestas del servidor se pueden ver con cURL incluyendo la bandera -v. Esto proporciona información sobre cómo el cliente se comunica con el servidor. Por ejemplo, en el caso de una redirección, si el servidor cambia la ubicación a una nueva URL, "-v" indicará el uso de los comandos "status 301 Moved Permanently" o "302 Found".

También se puede utilizar para comprobar errores, como "403 Forbidden" o "404 Not Found", que hacen referencia a accesos restringidos y ausencia de archivos. Además, también se pueden comprobar las cabeceras de respuesta para analizar diferentes parámetros del archivo antes del proceso de descarga.

cURL frente a Wget

cURL y Wget son las dos herramientas más destacadas para la descarga de archivos en interfaces de línea de comandos y cURL y Wget se utilizan ampliamente para ese fin, aunque difieren en sus funcionalidades.

Además, veamos las principales distinciones entre ellos.

Función cURL Wget
Soporte para descargas paralelas Requiere comandos adicionales Incorporado
Reanudación automática de las descargas Requiere el indicador -C Incorporado
Funciona con API (envío de solicitudes POST, PUT y cabeceras) Por defecto Limitado
Evitar redireccionamientos Con el indicador -L Incorporado
Soporte proxy Por defecto Por defecto
Barra de progreso integrada Necesita -# bandera Ausente
Operación de fondo No se admite Necesita la bandera -b
Integración en guiones Sí (devuelve un código de respuesta) Limitado

Wget y cURL también tienen diferencias en la sintaxis de los comandos:

  • En cURL, es necesario indicar banderas al utilizar comandos de forma explícita: establezca -O, al guardar un archivo, -C - al continuar una descarga y -L al seguir redireccionamientos. Si no se especifica ninguna opción para guardar en un archivo, cURL imprime por defecto el contenido del archivo en la pantalla del terminal.
  • En Wget, los comandos son sencillos; el archivo se descarga automáticamente sin necesidad de especificar banderas adicionales, la reanudación se realiza con -c y las redirecciones son automáticas.

Wget parece haber sido creado principalmente para descargar archivos mientras que cURL fue hecho para interactuar con peticiones HTTP y APIs.

En términos de protocolos soportados, Wget está en desventaja frente a cURL en muchos aspectos.

curl-i-wget.png

Conclusión

De hecho, cURL es admirable por su compatibilidad con multitud de protocolos, convenciones de nomenclatura de archivos, uso de proxy y capacidad para reanudar descargas interrumpidas.

cURL es apto no sólo para descargas sencillas integrándose con APIs o para realizar búsquedas masivas de datos. Sin embargo, su capacidad para redirigir, establecer límites de velocidad, autenticar y realizar un seguimiento de la interacción con el servidor, permitir el diagnóstico de la conexión con el servidor y la comprobación de recursos web lo convierten en una gran herramienta multiuso. Y con las flexibles personalizaciones de parámetros que ofrece, cURL puede adaptarse a todas y cada una de las tareas.

Comentarios:

0 Comentarios