Volver al blog
Guías
Suciu Dan21 de abril de 20238 min de lectura

Descarga de páginas web y archivos sin esfuerzo con Python y wget

Descarga de páginas web y archivos sin esfuerzo con Python y wget

¿Por qué Python?

Python es un lenguaje de programación potente y muy utilizado en diversos campos, como la automatización, la ciencia de datos y el desarrollo de aplicaciones. Es fácil de aprender y cuenta con una amplia biblioteca de módulos y marcos de trabajo que amplían sus capacidades.

¿Por qué wget?

Wget es una herramienta de línea de comandos que permite descargar archivos de Internet. Está ampliamente disponible en la mayoría de los sistemas de tipo Unix, incluidos Linux y macOS. Wget es una herramienta versátil que se puede utilizar para descargar archivos individuales, varios archivos e incluso directorios completos.

Estas son algunas de las principales características de wget:

  • Descargar archivos de Internet: Wget se puede utilizar para descargar archivos de Internet, como páginas web, imágenes y otros tipos de archivos.
  • Opciones de descarga personalizables: Wget te permite especificar diversas opciones para personalizar tus descargas, como el directorio en el que guardar el archivo, el nombre del archivo y si se deben sobrescribir los archivos existentes.
  • Reanudar descargas interrumpidas: si una descarga se interrumpe, wget puede reanudarla desde donde se quedó, lo que ahorra tiempo y ancho de banda.
  • Descarga recursiva: wget permite descargar un sitio web o un directorio completo siguiendo los enlaces de forma recursiva.
  • Compatibilidad con HTTP, HTTPS y FTP: Wget admite diversos tipos de protocolos de Internet, entre ellos HTTP, HTTPS y FTP, lo que lo convierte en una herramienta versátil para descargar archivos de distintos tipos de servidores.
  • Disponible en la mayoría de los sistemas similares a Unix: Wget está ampliamente disponible en la mayoría de los sistemas similares a Unix, incluidos Linux y macOS, lo que facilita su uso en una gran variedad de plataformas.

¿Por qué utilizar wget con Python?

Python y wget se pueden combinar para automatizar el proceso de descarga de páginas web y archivos, lo que permite ahorrar tiempo y esfuerzo. Wget se puede personalizar mediante Python, y las tareas de extracción de datos web o de descarga de archivos se pueden integrar en scripts de Python ya existentes.

Hay varias razones por las que se puede optar por utilizar wget con Python:

  • Automatización: Al utilizar wget con Python, puedes automatizar el proceso de descarga de archivos de Internet. Esto te permite ahorrar tiempo y esfuerzo, sobre todo si necesitas descargar una gran cantidad de archivos o páginas web.
  • Personalización: Wget te permite especificar diversas opciones para personalizar tus descargas, como el directorio en el que guardar el archivo, el nombre del archivo y si se deben sobrescribir los archivos existentes. Al utilizar wget con Python, puedes configurar estas opciones mediante código y personalizar tus descargas según tus necesidades.
  • Facilidad de uso: Python es conocido por su sencillez y legibilidad, lo que lo convierte en un lenguaje fácil de aprender y utilizar. Al utilizar wget con Python, puedes aprovechar la potencia de Python para facilitar las tareas de extracción de datos web y descarga de archivos.
  • Escalabilidad: Python es un lenguaje escalable capaz de gestionar grandes cantidades de datos. Al utilizar wget con Python, puedes ampliar tus tareas de extracción de datos web o de descarga de archivos para gestionar conjuntos de datos más grandes.

Cómo empezar

Ahora que hemos hablado de las ventajas individuales y combinadas de Python y wget, pasemos a la parte de la programación.

Instalación de wget

Asegúrate de que wget esté instalado en tu ordenador. Si utilizas Linux como sistema operativo, ya lo tienes instalado.

  • Si eres usuario de Windows, puedes descargar el archivo binario desde esta página. Asegúrate de añadir la ruta del archivo binario a la variable de entorno PATH. Otra opción es utilizar WSL (Subsistema de Windows para Linux). Para más información, consulta aquí.
  • Si eres usuario de Mac, instala wget con brew

No olvides consultar la completa documentación de wget aquí.

Instalación de Python

Descarga la última versión de Python desde la página web oficial y sigue las instrucciones de instalación correspondientes a tu sistema operativo. Una vez instalada, puedes comprobar la versión con este comando:

python3 --version

Ejecución de comandos del sistema en Python

El módulo `subprocess` de Python te permite ejecutar comandos del sistema y capturar su salida. Es una forma potente y flexible de interactuar con el sistema operativo desde tus scripts de Python.

Para utilizar el módulo `subprocess`, primero debes importarlo a tu script de Python. A continuación, puedes utilizar la función `subprocess.run()` para ejecutar un comando del sistema y capturar su salida.

La función `run()` toma el comando que se va a ejecutar como una cadena y devuelve un objeto `CompletedProcess`, que contiene el código de salida, la salida estándar (stdout) y la salida de error (stderr) del comando.

A continuación se muestra un ejemplo del uso de la función `subprocess.run()` para ejecutar el comando ls, que muestra los archivos de un directorio:

import subprocess

result = subprocess.run(['ls', '-l'])

print(result.stdout)

Ejecuta este código con el comando «python3 main.py». El resultado debería ser similar a este.

total 4

-rw-r--r-- 1 dan dan 80 6 de enero 18:58 main.py

Ninguno

Descargar con wget

Descargar un archivo

Empecemos por descargar el logotipo de WebScrapingAPI. Sustituye la lista de argumentos por `wget` y la URL del logotipo. El comando quedará así:

resultado = subprocess.run(['wget', 'https://www.webscrapingapi.com/images/logo/logo-white.svg'])

El script mostrará el siguiente resultado:

--06/01/2023 19:06:32--  https://www.webscrapingapi.com/images/logo/logo-white.svg

Resolución de www.webscrapingapi.com (www.webscrapingapi.com)... 76.76.21.61, 76.76.21.98

Conectando con www.webscrapingapi.com (www.webscrapingapi.com)|76.76.21.61|:443... conectado.

Solicitud HTTP enviada, esperando respuesta... 200 OK

Longitud: 5391 (5,3 K) [image/svg+xml]

Guardando en: «logo-white.svg»

logo-white.svg                                                       100 %[====================================================================================================================================================================>]   5,26 K  --.- KB/s    en 0,06 s   

06/01/2023 19:06:33 (91,6 KB/s) - «logo-white.svg» guardado [5391/5391]

Ninguno

En la salida, podemos ver cómo `wget` resuelve el nombre de dominio, se conecta al dominio, recibe un código de respuesta `200 OK`, determina la longitud del archivo (5,3 k) y comienza a guardar el archivo localmente con el nombre `logo-white.svg`.

Puedes buscar el archivo `logo-white.svg` en la carpeta del proyecto.

Descargar en un directorio

Puedes descargar el archivo en un directorio personalizado utilizando el parámetro `-P`. Actualicemos el script y ejecutémoslo para ver los resultados:

resultado = subprocess.run(['wget', '-P', 'images', 'https://www.webscrapingapi.com/images/logo/logo-white.svg'])

El resultado es prácticamente el mismo, con la única diferencia de que el archivo se guarda en el directorio `./images/`.

Configuración del nombre del archivo descargado

Con el parámetro `-O`, puedes especificar un nuevo nombre para el archivo descargado. Probémoslo:

resultado = subprocess.run(['wget', '-O', 'named-logo.svg', 'https://www.webscrapingapi.com/images/logo/logo-white.svg'])

Busca el archivo `named-logo.svg` en la carpeta del proyecto.

Descargar el archivo si la versión remota es más reciente

Puedes utilizar el parámetro `-N` para descargar el archivo remoto solo si su versión es más reciente que la del archivo local. El comando tendrá este aspecto:

resultado = subprocess.run(['wget', '-N', 'https://www.webscrapingapi.com/images/logo/logo-white.svg'])

Reanudar descargas interrumpidas

Si se interrumpe una descarga, `wget` puede reanudarla desde donde se quedó, lo que ahorra tiempo y ancho de banda. Para ello, debes utilizar el parámetro `-c`, que indica a `wget` que continúe con una descarga interrumpida.

El comando tendrá este aspecto:

resultado = subprocess.run(['wget', '-c', 'https://www.webscrapingapi.com/images/logo/logo-white.svg'])

Si la descarga del archivo se ha completado, verás el siguiente mensaje en la pantalla:

Solicitud HTTP enviada, a la espera de respuesta... 416: El rango solicitado no se puede satisfacer

El archivo ya se ha descargado por completo; no hay nada más que hacer.

Descarga recursiva

Wget se puede utilizar para descargar un sitio web o un directorio completo siguiendo los enlaces de forma recursiva. Para ello, debes utilizar los parámetros `-r` y `-l`: el parámetro `-r` indica a la herramienta que siga los enlaces de forma recursiva y el parámetro `-l` especifica la profundidad máxima de la recursión.

result = subprocess.run(['wget', '-r', '-l', '2', 'https://www.webscrapingapi.com'])

Este comando descargará el sitio web«https://www.webscrapingapi.com» y seguirá los enlaces a otras páginas del mismo sitio web hasta una profundidad máxima de 2.

¿Cuándo no es wget la solución?

Hay varias situaciones en las que podría ser más adecuado utilizar curl, Beautiful Soup o Selenium en lugar de wget:

  • Cuando necesites configurar encabezados HTTP o cookies: Curl te permite configurar encabezados HTTP y cookies, lo cual puede resultar útil al interactuar con API o al acceder a sitios web protegidos. `wget` no cuenta con esta capacidad.
  • Cuando necesites analizar y extraer datos de HTML: Beautiful Soup es una biblioteca de Python que facilita el análisis y la extracción de datos de documentos HTML. wget no está diseñado para analizar y extraer datos de páginas web.
  • Cuando necesitas interactuar con un sitio web como usuario: Selenium es una herramienta que te permite automatizar el proceso de interactuar con un sitio web como usuario. Se puede utilizar para rellenar formularios, hacer clic en botones y realizar otras acciones que no son posibles con wget.

Conclusiones

Python y wget son potentes herramientas para automatizar el proceso de descarga de archivos y páginas web. Al utilizar wget con Python, puedes personalizar tus descargas, integrar tareas de extracción de datos web o de descarga de archivos en tus scripts de Python existentes, y ahorrar tiempo y esfuerzo.

Sin embargo, es importante respetar las condiciones de uso de los sitios web de los que descargas y evitar sobrecargar los servidores.

Si buscas una alternativa a wget para el scraping web, te recomendamos que pruebes WebScrapingAPI. WebScrapingAPI es un servicio profesional de scraping web que te permite extraer datos de sitios web fácilmente sin necesidad de crear ni mantener tu propio programa de scraping.

Es una solución rápida, fiable y rentable, adecuada para empresas de todos los tamaños.

¡Pruébalo hoy mismo!

Acerca del autor
Suciu Dan, cofundador de WebScrapingAPI
Suciu DanCofundador

Suciu Dan es cofundador de WebScrapingAPI y escribe guías prácticas dirigidas a desarrolladores sobre el scraping web con Python, el scraping web con Ruby y las infraestructuras de proxy.

Empieza a crear

¿Estás listo para ampliar tu recopilación de datos?

Únete a más de 2000 empresas que utilizan WebScrapingAPI para extraer datos de la web a escala empresarial sin ningún gasto de infraestructura.