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.
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 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:
pip install solicitudesbs4
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.
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.
A continuación te explicamos cómo descargar imágenes utilizando Requests:
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.
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:
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.
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.
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.
pip install scrapy
scrapy startproject rascador_de_imagen
cd rascador_imagen
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.
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.
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.
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.
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.
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.
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
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
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!