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.
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 è 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:
pip installare le richiestebs4
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.
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.
Ecco come scaricare le immagini utilizzando 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)
Questo script invia una richiesta GET all'URL dell'immagine e scrive il contenuto binario dell'immagine in un file.
È 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:
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.
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.
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.
pip installare scrapy
scrapy startproject image_scraper
cd image_scraper
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.
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.
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.
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.
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.
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.
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
Ecco un esempio di esecuzione di uno script python ogni giorno alle 20:00
0 20 * * * /usr/bin/python3/path/to/Image_Scraper.py
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!