Tutorial passo-passo: Come raschiare le immagini con Python

Guide, Come fare, Scraping, 05-settembre-20245 minuti di lettura

In questo blog post vi guideremo attraverso il processo di scraping di immagini da siti web utilizzando Python. Imparerete come iniziare con le librerie più diffuse, come gestire le potenziali insidie e come esplorare tecniche avanzate per portare le vostre capacità di scraping del web al livello successivo.

Le basi dello scraping di immagini con Python

Per iniziare a fare scraping di immagini con Python, è necessario familiarizzare con alcune librerie chiave che facilitano questo compito. Le più popolari sono BeautifulSoup, Scrapy e Requests.

BeautifulSoup per estrarre gli URL delle immagini

BeautifulSoup è una libreria Python utilizzata per l'analisi di documenti HTML e XML. Crea un albero di parsing dai codici sorgente delle pagine che può essere utilizzato per estrarre facilmente i dati.

Ecco un semplice esempio di come estrarre gli URL delle immagini usando BeautifulSoup:

Passo 1: Installare BeautifulSoup e Requests:

 pip installare  le richiestebs4 

Fase 2: Estrazione degli URL delle immagini:

 importare le richieste
 da bs4 importa BeautifulSoup

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

 response = requests.get(url)

 soup = BeautifulSoup(response.text, 'html.parser')
 immagini = 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.

Scaricare immagini con Python

Una volta estratti gli URL delle immagini, il passo successivo è quello di scaricarle. La libreria Requests è perfetta per questo compito, grazie alla sua semplicità e facilità d'uso.

Utilizzo delle richieste per scaricare le immagini

Ecco come scaricare le immagini utilizzando Requests:

Scaricare l'immagine dall'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)

Questo script invia una richiesta GET all'URL dell'immagine e scrive il contenuto binario dell'immagine in un file.

Gestione di errori ed eccezioni

È importante gestire gli errori e le eccezioni per garantire che lo script funzioni senza problemi anche quando si verificano dei problemi. Ecco una versione migliorata dello script precedente:

Gestione degli errori:

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}")

Questo frammento di codice include un blocco try-except per catturare eventuali errori che potrebbero verificarsi durante il processo di download.

Tecniche avanzate per lo scraping di immagini

Per le attività di scraping più complesse, come lo scraping di più pagine o di interi siti web, Scrapy è una libreria potente che può gestire questi scenari in modo efficiente.

Usare Scrapy per operazioni complesse

Scrapy è un framework open-source e collaborativo per il web crawling in Python. È stato progettato per garantire velocità ed efficienza, il che lo rende ideale per progetti di scraping su larga scala.

Passo 1: installare Scrapy:

 pip installare scrapy

Passo 2: creare un progetto Scrapy:

 scrapy startproject image_scraper
 cd image_scraper

Fase 3: Definire un ragno:

Creare un file spider (`spiders/image_spider.py`) con il seguente contenuto:

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)

Questo semplice spider Scrapy parte dall'URL indicato, estrae tutti gli URL delle immagini e segue i link della pagina successiva per continuare lo scraping.

Migliorare i progetti di scraping di immagini

Per migliorare ulteriormente i vostri progetti di scraping, prendete in considerazione l'utilizzo di API per accedere a immagini di alta qualità e l'automazione delle attività per una maggiore efficienza.

Utilizzo delle API per lo scraping di immagini

Le API rappresentano un modo affidabile e legale per accedere alle immagini. Molti siti web offrono API che consentono di cercare e scaricare immagini in modo programmatico. Uno di questi siti è Unsplash API.

Esempio con l'API di 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}")

Questo script utilizza l'API di Unsplash per recuperare un'immagine naturale casuale.

Automatizzare le attività di scraping delle immagini

L'automazione fa risparmiare tempo e garantisce che le attività di scraping si svolgano senza interventi manuali. Strumenti come cron job sui sistemi Unix o Task Scheduler su Windows possono programmare l'esecuzione degli script a intervalli regolari.

Cron job su sistemi Unix - Crontab:

Crontab è una potente utility dei sistemi operativi Unix per pianificare attività, note come"cron job", da eseguire automaticamente a orari specifici. Vediamo come pianificare un'attività utilizzando Crontab.

Comprendere la sintassi di Crontab:

Un file crontab è composto da righe di comando, dove ogni riga rappresenta un lavoro separato. La sintassi è la seguente:

MIN ORA DOM LUN DOW CMD
  • MIN: campo dei minuti (da 0 a 59)
  • ORA: campo orario (da 0 a 23)
  • DOM: Giorno del mese (da 1 a 31)
  • MON: campo del mese (da 1 a 12)
  • DOW: giorno della settimana (da 0 a 7, dove 0 e 7 rappresentano la domenica)
  • CMD: il comando da eseguire (in questo caso sarà l'eseguibile del vostro script python)

Ecco un esempio di esecuzione di uno script python ogni giorno alle 20:00

0 20 * * * /usr/bin/python3/path/to/Image_Scraper.py

Utilizzo di Task Scheduler (Windows):

  • Aprite l'Utilità di pianificazione (utilizzate la barra di ricerca di Windows e cercate "Utilità di pianificazione").
  • Fate clic su"Crea attività di base".
  • Fornire un nome e una descrizione e fare clic su"Avanti".
  • Selezionate la granularità o l'intervallo di tempo necessario per eseguire questa attività e fate clic su"Avanti".
  • Assicuratevi che"Avvia un programma" sia selezionato e fate clic su"Avanti".
  • Indicare il percorso dello script python facendo clic su"Sfoglia". Se si devono fornire argomenti per lo script python, è possibile aggiungerli nei campi"Aggiungi argomenti" e fare clic su"Avanti".
  • Come ultimo passo, basta fare clic su"Fine" e l'attività è pronta per essere eseguita nell'intervallo specificato.

Conclusione

In questo post abbiamo analizzato come effettuare lo scraping di immagini da siti web utilizzando Python. Abbiamo trattato le basi con BeautifulSoup e Requests, le tecniche avanzate con Scrapy e le pratiche etiche di scraping. Inoltre, abbiamo discusso come migliorare i vostri progetti di scraping utilizzando API e strumenti di automazione come Windows Task Scheduler.

Lo scraping di immagini è un'abilità potente che può migliorare le capacità di acquisizione dei dati e aprire nuove possibilità per i vostri progetti.

Buon scraping!