Tutorial Paso a Paso: Cómo raspar imágenes usando Python

Guías, Guías, Raspado, Sep-05-20245 minutos de lectura

En esta entrada de blog, te guiaremos a través del proceso de scraping de imágenes de sitios web utilizando Python. Aprenderás cómo empezar con las librerías más populares, cómo manejar los posibles escollos e incluso explorarás técnicas avanzadas para llevar tus habilidades de scraping web al siguiente nivel.

Aspectos básicos del scraping de imágenes con Python

Para empezar a scrapear imágenes con Python, necesitarás familiarizarte con algunas librerías clave que facilitan esta tarea. Las más populares son BeautifulSoup, Scrapy y Requests.

BeautifulSoup para extraer URL de imágenes

BeautifulSoup es una biblioteca de Python que se utiliza para analizar documentos HTML y XML. Crea un árbol de análisis a partir de los códigos fuente de las páginas que puede utilizarse para extraer datos fácilmente.

He aquí un ejemplo sencillo de cómo extraer URLs de imágenes utilizando BeautifulSoup:

Paso 1: Instala BeautifulSoup y Requests:

 pip install  solicitudesbs4 

Paso 2: Extraer las URL de las imágenes:

 importar peticiones
 from bs4 import BeautifulSoup

 url = 'https://books.toscrape.com/'

 response = requests.get(url)

 soup = BeautifulSoup(response.text, 'html.parser')
 imágenes = soup.find_all('img')

This code fetches the HTML content of the specified URL, parses it with BeautifulSoup, and then finds all the `<img>` tags, printing out their `src` attributes.

Descarga de imágenes con Python

Una vez extraídas las URL de las imágenes, el siguiente paso es descargarlas. La biblioteca Requests es perfecta para esta tarea por su sencillez y facilidad de uso.

Uso de solicitudes para descargar imágenes

A continuación te explicamos cómo descargar imágenes utilizando Requests:

Descargar imagen desde URL:

for ind, img in enumerate(images):
   img_data = requests.get(url+img['src']).content
   with open(f'image_{ind+1}.jpg', 'wb') as handler:
       handler.write(img_data)

Este script envía una petición GET a la URL de la imagen y escribe el contenido binario de la imagen en un archivo.

Tratamiento de errores y excepciones

Es importante gestionar los errores y las excepciones para garantizar que el script se ejecuta sin problemas incluso cuando surgen problemas. Aquí tienes una versión mejorada del script anterior:

Tratamiento de errores:

for ind, img in enumerate(images):
   try:
       img_data = requests.get(url+img['src']).content
       with open(f'image_{ind+1}.jpg', 'wb') as handler:
           handler.write(img_data)
   except Exception as e:
       print(f"An error occurred during the extraction of image \n Image Url: {img['src']} \n Error: {e}")

Este fragmento de código incluye un bloque try-except para detectar cualquier error que pueda producirse durante el proceso de descarga.

Técnicas avanzadas de scraping de imágenes

Para tareas de scraping más complejas, como el scraping de múltiples páginas o sitios web completos, Scrapy es una potente biblioteca que puede manejar estos escenarios de manera eficiente.

Uso de Scrapy para tareas complejas

Scrapy es un framework de rastreo web colaborativo y de código abierto para Python. Está diseñado para ser rápido y eficiente, por lo que es ideal para proyectos de scraping a gran escala.

Paso 1: Instale Scrapy:

 pip install scrapy

Paso 2: Crear un proyecto Scrapy:

 scrapy startproject rascador_de_imagen
 cd rascador_imagen

Paso 3: Definir una araña:

Crea un fichero araña (`spiders/image_spider.py`) con el siguiente contenido:

import scrapy
class ImageSpider(scrapy.Spider):
   name = 'imagespider'
   start_urls = ['https://books.toscrape.com/']
   def parse(self, response):
       # Extract image URLs and convert them to absolute if necessary
       for img in response.css('img::attr(src)').getall():
           abs_img_url = response.urljoin(img)
           yield {'image_url': abs_img_url}
      
       # Find the link to the next page and create a request for it
       next_page = response.css('a.next::attr(href)').get()
       if next_page is not None:
           next_page_url = response.urljoin(next_page)
           yield response.follow(next_page_url, self.parse)

Esta sencilla araña Scrapy comienza en la URL dada, extrae todas las URL de las imágenes y sigue los enlaces de la página siguiente para continuar el scraping.

Mejora de tus proyectos de Image Scraping

Para mejorar aún más sus proyectos de scraping, considere la posibilidad de utilizar API para acceder a imágenes de alta calidad y automatizar sus tareas en aras de la eficacia.

Uso de API para el scraping de imágenes

Las API ofrecen una forma fiable y legal de acceder a las imágenes. Muchos sitios web ofrecen API que permiten buscar y descargar imágenes mediante programación. Uno de estos sitios web es Unsplash API.

Ejemplo con la API de Unsplash:

import requests
# Replace 'YOUR_ACCESS_KEY' with your actual Unsplash Access Key
api_url = "https://api.unsplash.com/photos/random"
headers = {"Authorization": "Client-ID YOUR_ACCESS_KEY"}
params = {"query": "nature"}
try:
   response = requests.get(api_url, headers=headers, params=params)
   response.raise_for_status()  # This will raise an exception for HTTP errors
   data = response.json()
   image_url = data['urls']['full']
   print(image_url)
except requests.exceptions.HTTPError as err:
   print(f"HTTP error occurred: {err}")
except Exception as err:
   print(f"An error occurred: {err}")

Este script utiliza la API de Unsplash para obtener una imagen aleatoria de la naturaleza.

Automatización de tareas de Image Scraping

La automatización ahorra tiempo y garantiza que las tareas de scraping se ejecuten sin problemas y sin intervención manual. Herramientas como cron jobs en sistemas Unix o Task Scheduler en Windows pueden programar tus scripts para que se ejecuten a intervalos regulares.

Cron jobs en sistemas Unix - Crontab:

Crontab es una potente utilidad de los sistemas operativos tipo Unix que permite programar tareas, conocidas como"cron jobs", para que se ejecuten automáticamente a determinadas horas. Veamos cómo programar una tarea con Crontab.

Comprender la sintaxis de Crontab:

Un archivo crontab consta de líneas de comandos, donde cada línea representa un trabajo independiente. La sintaxis es la siguiente:

MIN HORA DOM MON DOW CMD
  • MIN: Campo de minutos (0 a 59)
  • HORA: Campo de hora (0 a 23)
  • DOM: Día del mes (1 a 31)
  • MON: Campo del mes (1 a 12)
  • DOW: Día de la semana (de 0 a 7, donde 0 y 7 representan el domingo)
  • CMD: El comando a ejecutar (en este caso será el ejecutable de tu script python)

He aquí un ejemplo de ejecución de un script python diariamente a las 8:00PM

0 20 * * * /usr/bin/python3/ruta/a/Image_Scraper.py

Uso del Programador de Tareas (Windows):

  • Abra el Programador de tareas (utilice la barra de búsqueda de Windows y busque "Programador de tareas").
  • Haga clic en"Crear tarea básica".
  • Introduzca un nombre y una descripción y haga clic en"Siguiente".
  • Seleccione la granularidad o el intervalo que necesita para ejecutar esta tarea y haga clic en"Siguiente".
  • Asegúrate de que la opción"Iniciar un programa" está marcada y haz clic en"Siguiente".
  • Proporcione la ruta a su script python haciendo clic en"Examinar". Opcionalmente, si tiene que proporcionar argumentos para su script python, puede hacerlo añadiéndolos en el campo"Añadir argumentos" y pulsar"Siguiente".
  • Como último paso, simplemente haga clic en"Finalizar" y así de fácil, esta tarea estará lista para ejecutarse en el intervalo especificado.

Conclusión

En esta entrada del blog, hemos explorado cómo raspar imágenes de sitios web utilizando Python. Hemos cubierto los conceptos básicos con BeautifulSoup y Requests, técnicas avanzadas con Scrapy y prácticas éticas de scraping. Además, hemos discutido cómo mejorar tus proyectos de scraping utilizando APIs y herramientas de automatización como el Programador de Tareas de Windows.

El scraping de imágenes es una poderosa habilidad que puede mejorar tus capacidades de adquisición de datos y abrir nuevas posibilidades para tus proyectos.

¡Feliz scraping!