Descargar Imágenes con Python y Requests

Descargar Imágenes con Python y Requests

Lo primero que se necesita es la o las url de las imágenes que se quieren bajar. Los siguiente es importar los módulos "requests" y "os", si no tienes instalado el módulo Requests ejecute el siguiente comando en su Shell:

$ python -m pip install requests

Una vez finalizada la instalación ya tiene disponible el módulo Requests de Python en su sistema ya viene siendo hora de empezar con nuestro código.

Importamos lo módulos que necesitaremos

import requests
import os  

requests: este nos permitirá hacer la petición para traer nuestras imágenes.

os: nos permite interactuar con el sistema operativo y manipular archivos.

Digamos que deseamos descargar las siguientes dos imágenes, las cuales guardamos de una lista de Python (obviamente estas no existen por favor para practicar cambie las imágenes de ejemplo por unas que si existan).

imgs = ['https://example.com/imagen-1.png', 'https://example.com/imagen-2.png']

Ya tenemos nuestras imágenes preparadas es hora de preparar la función que nos ayudara a bajar las imágenes. Llamémosla bajar_img pasemos a su creación.

def bajar_img(url):
    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0'}
    nombre_imagen = os.path.basename(url)

    try:
        img_obtenida = requests.get(url, headers=header,stream=True)
        with open(nombre_imagen, 'wb') as f:
            for ch in img_obtenida: 
                f.write(ch)

        print('Descargada: ' + nombre_imagen)
    except: 
        print('Error: ' + nombre_imagen)

La función bajar_img recibe una "url" como parámetro seguidamente se prepara el header que se enviara con la petición, la variable header es un diccionario en el que se pueden agregar cuantas cabeceras como se desee, pero en este caso solo se necesita User-Agent esta porque algunos servers rechazan la petición que hace nuestro script, el script simula ser un navegador en esta ocasión Firefox, así el server no rechaza la petición.

En la próxima línea está la variable nombre_imagen, aquí con la ayuda del modulo os obtenemos el nombre de la imagen que se va a descargar. os.path.basename(ruta) devuelve el ultimo componente de una ruta, en este caso dándonos el nombre de la imagen y este nombre lo utilizaremos para guardarlo en nuestro computador.

Luego no encontramos con un bloque Try Except esto para que el código no se detenga en caso de que una imagen de un error, el tipo de excepción por atrapar puede ser especificado, para ver dónde y porque falla de forma más precisa. Yo no lo hago porque no quiero, pero es bueno que lo hagan busque sobre los tipos de excepciones en (https://docs.python.org/3/library/exceptions.html)

El código dentro del try es el que hace la magia. Cuando se hace la petición esta es guardada dentro de la variable img_obtenida luego creamos el archivo con ayuda de open el cual se crea y abre con permiso de escritura y como binario 'wb' después se itera sobre img_obtenida que a su vez vamos escribiendo sobre el archivo.

Al final el código queda de la siguiente forma:

import requests
import os  

imgs = ['https://example.com/imagen-1.png', 'https://example.com/imagen-2.png']

def bajar_img(url):
    header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0'}
    nombre_imagen = os.path.basename(url)

    try:
        img_obtenida = requests.get(url, headers=header,stream=True)
        with open(nombre_imagen, 'wb') as f:
            for ch in img_obtenida: 
                f.write(ch)

        print('Descargada: ' + nombre_imagen)
    except: 
        print('Error: ' + nombre_imagen)

for url_img in imgs:
    bajar_img(url_img)

El for para iterar sobre imgs para bajar todas las que se tengan