Web scraping con Python: introduzione e tutorial

Il World Wide Web è costituito da miliardi di documenti collegati fra loro, altrimenti conosciuti come siti web. Il codice sorgente dei siti web è scritto nel linguaggio HTML (Hypertext Markup Language). Il codice sorgente HTML è un misto di informazioni leggibili dall’uomo e codici leggibili dalla macchina, i cosiddetti tag. Il browser web (ad esempio Chrome, Firefox, Safari o Edge) elabora il codice sorgente, interpreta i tag e presenta le informazioni in esso contenute all’utente.

Al fine di estrarre dal codice sorgente solo informazioni di interesse per l’utente, viene utilizzato un software speciale. Questi programmi, noti come “web scraper”, “crawler“, “spider” o semplicemente “bot”, cercano nel codice sorgente dei siti web modelli predefiniti ed estraggono le informazioni in essi contenute. Le informazioni ottenute dal web scraping sono riassunte, combinate, valutate e memorizzate per un ulteriore utilizzo.

In questo articolo vi spieghiamo perché il linguaggio Python è particolarmente adatto per la creazione di web scraper e vi forniamo un’introduzione completa del suo utilizzo.

Crea il tuo sito web personalizzato

MyWebsite Now è il nostro strumento per creare siti web in modo semplice e intuitivo, pensato per chi vuole essere presente online in poco tempo.

Installazione facile
E-mail
Senza pubblicità

Perché usare Python per il web scraping?

Il popolare linguaggio di programmazione Python è particolarmente adatto per la creazione di software di web scraping. Con l’aggiornamento costante dei siti Internet cambiano anche i contenuti web. Può cambiare, ad esempio, il design o il contenuto delle pagine. Un web scraper viene scritto per la struttura specifica di una pagina. Se la struttura della pagina cambia, il web scraper deve essere adattato, un compito particolarmente facile con Python.

Python è inoltre molto adatto per l’elaborazione di testi e il recupero di risorse web, entrambi fondamenti tecnici per il web scraping. Python rappresenta anche uno standard consolidato per l’analisi e l’elaborazione dei dati. Oltre all’idoneità generale del linguaggio, Python si distingue per con un ecosistema di programmazione fiorente che include librerie, progetti open source, documentazione e riferimenti linguistici, nonché post di forum, segnalazioni di bug e articoli di blog.

Nello specifico, esistono diversi strumenti sofisticati per effettuare il web scraping con Python. Qui vi presentiamo tre strumenti abbastanza diffusi: Scrapy, Selenium e BeautifulSoup. Come esercizio pratico, vi proponiamo nel nostro tutorial sul web scraping con Python un esercizio con BeautifulSoup. In questo modo comprenderete immediatamente il processo di scraping.

Panoramica del web scraping

Lo schema di base del processo di web scraping è abbastanza semplice. In primo luogo, lo sviluppatore del web scraper analizza il codice sorgente HTML della pagina interessata. Di solito ci sono modelli unici in base ai quali le informazioni desiderate possono essere estratte. Lo scraper viene programmato in base a questi modelli. Il resto del lavoro viene eseguito automaticamente dallo scraper:

  1. Accesso al sito web tramite l’URL.
  2. Estrazione automatizzata dei dati strutturati secondo i modelli.
  3. Riassumere, archiviare, valutare, combinare, ecc. le informazioni estratte.

Casi d’uso del web scraping

Il web scraping è molto versatile. Oltre all’indicizzazione dei motori di ricerca, viene utilizzato anche per i seguenti scopi:

  • Creazione di database di contatti
  • Monitoraggio e confronto dei prezzi delle offerte online
  • Combinazione di dati provenienti da diverse fonti online
  • Tracciatura della presenza e della reputazione online
  • Raccolta di dati finanziari, meteorologici e di altro tipo
  • Monitoraggio del contenuto web per eventuali modifiche
  • Raccolta di dati a fini di ricerca
  • Esecuzione di data mining

Esempio pratico di web scraping

Immaginate un sito web per la vendita di auto usate. Se si accede alla pagina nel browser, verrà visualizzato un elenco di automobili. Guardiamo, ad esempio, il codice sorgente per l’annuncio di un’auto:

raw_html = """
<h1>Auto usate in vendita</h1>
<ul class="cars-listing">
    <li class="car-listing">
        <div class="car-title">
            Volkswagen Maggiolino
        </div>
        <div class="car-description">
            <span class="car-make">Volkswagen</span>
            <span class="car-model">Maggiolino</span>
            <span class="car-build">1973</span>
        </div>
        <div class="sales-price">
            € <span class="car-price">14.998,—</span>
        </div>
    </li>    
</ul>    
 """

Un web scraper è in grado di analizzare l’elenco delle auto usate disponibili online. A seconda dell’intenzione dello sviluppatore, lo scraper ricerca un modello specifico, nel nostro caso, una Volkswagen Maggiolino. Nel codice sorgente, le informazioni relative alla marca e al modello dell’auto corrispondono alle classi CSS 'car-make' e 'car-model'. I nomi delle classi semplificano lo scraping delle informazioni desiderate. Ecco un esempio con BeautifulSoup:

# Analizzare il testo sorgente HTML memorizzato in raw_html
html = BeautifulSoup(raw_html, 'html.parser')
# Estrarre il contenuto del tag con classe 'car-title'
car_title = html.find(class_ = 'car-title').text.strip()
# Se si tratta di una Volkswagen Maggiolino
if (car_title == 'Volkswagen Maggiolino'):
    # Risalire dal titolo dell’auto al tag <li></li>
    html.find_parent('li')
    
    # Determinare il prezzo dell’auto
    car_price = html.find(class_ = 'sales-price').text.strip()
    
    # Visualizzare il prezzo dell’auto
    print(car_price)

Rischi legali del web scraping

Per quanto pratico sia il web scraping, esso comporta anche dei rischi legali. Poiché il gestore del sito web fornisce il suo sito web per uso umano, il recupero automatizzato con un web scraper può costituire una violazione delle condizioni d’uso. Questo è soprattutto il caso quando la portata dello scraping è molto ampia e viene eseguito contemporaneamente o in alta sequenza su più pagine. Una persona non può interagire con un sito in questo modo.

Il recupero, la memorizzazione e la valutazione automatizzati dei dati pubblicati su un sito web possono costituire inoltre una violazione del diritto d’autore. Se le informazioni raccolte sono dati personali, le relative memorizzazione e valutazione senza il consenso degli interessati viola le disposizioni applicabili in materia di protezione dei dati. In tal senso, non è consentito, ad esempio, effettuare lo scraping di profili Facebook per raccogliere dati personali.

N.B.

Le violazioni della protezione dei dati e del copyright sono soggette a severe sanzioni. Assicuratevi quindi di non infrangere alcuna legge quando effettuate il web scraping. Le barriere tecniche esistenti non devono in nessun caso essere aggirate.

Restrizioni tecniche del web scraping

I gestori di siti web hanno spesso interesse a limitare lo scraping automatico delle loro offerte online. Da un lato, l’accesso massiccio al sito web da parte di scraper può avere un impatto negativo sulle prestazioni del sito. D’altra parte, ci sono spesso aree interne di un sito web che non dovrebbero apparire nei risultati di ricerca.

Lo standard robots.txt ha l’obiettivo di limitare l’accesso da parte di scraper: l’operatore del sito memorizza un file di testo denominato robots.txt nella directory principale del sito. All’interno del file, voci speciali determinano gli scraper o bot ammessi e le aree del sito web cui possono accedere. Le voci del file robots.txt si applicano sempre a un intero dominio.

Ecco un esempio di file robots.txt che vieta lo scraping da parte di qualsiasi bot sull’intero sito:

# Qualsiasi bot
User Agent: *
# Escludere l’intera directory principale
Disallow: /

Robots.txt è una restrizione volontaria. Sebbene si supponga che i bot aderiscano alle specifiche, ciò non può essere tecnicamente imposto. Al fine di regolare efficacemente l’accesso tramite web scraper, gli operatori di siti web utilizzano anche tecniche più aggressive: da un lato, l’accesso da parte degli scraper può essere ridotto limitando il traffico; dall’altro, l’indirizzo IP dello scraper può essere bloccato in caso di accesso ripetuto contrario alle specifiche.

API come alternativa al web scraping

Anche se il web scraping è utile, non è l’approccio preferito per ottenere dati dai siti web. Spesso c’è un modo migliore: molti gestori di siti web forniscono i dati in un formato strutturato e leggibile da una macchina che sono accessibili tramite apposite interfacce di programmazione, le cosiddette Application Programming Interfaces (API).

I vantaggi dell’utilizzo di un’API sono significativi:

  • L’API è esplicitamente fornita dal provider per accedere ai dati. Di conseguenza, ci sono meno rischi legali e il fornitore può regolamentare meglio l’accesso ai suoi dati. Per accedere ai dati è, ad esempio, possibile richiedere una chiave API. Anche la limitazione del traffico può essere implementata in modo più mirato dal provider.
  • L’API fornisce i dati in un formato leggibile dalla macchina, in questo modo si elimina la laboriosa estrazione dei dati dal codice sorgente. La struttura dei dati viene, inoltre, separata dalla rappresentazione visiva. Pertanto, la struttura rimane al suo posto anche quando il design del sito web viene modificato.

Se è possibile utilizzare un’API che fornisce dati completi, rappresenta certamente il modo migliore per accedervi. Tuttavia, il web scraping può essere utilizzato, in linea di principio, per tutti i testi presentati in modo leggibile agli utenti sui siti web.

Strumenti di web scraping per Python

Nell’ecosistema Python esistono diversi strumenti consolidati per implementare un progetto di web scraping:

  • Scrapy
  • Selenium
  • BeautifulSoup

Approfondiremo anche i vantaggi e gli svantaggi delle tre tecnologie.

Web scraping con Scrapy

Lo strumento Python di web scraping Scrapy utilizza un parser HTML per estrarre informazioni dal codice sorgente HTML della pagina. Il web scraping con Scrapy avviene dunque nel modo seguente:

URL → Richiesta HTTP → HTML → Scrapy

Il concetto di base dello sviluppo di scraper con Scrapy sono gli scraper chiamati “web spider”. Si tratta di piccoli programmi basati su Scrapy. Ogni spider è programmato per analizzare un sito web specifico e si arrampica di pagina in pagina come un ragno. Entra in gioco una programmazione orientata agli oggetti: ogni spider ha la sua classe Python.

Oltre al pacchetto Python, l’installazione di Scrapy include uno strumento da riga di comando. Attraverso questo “Scrapy Shell” si controllano i diversi spider. Inoltre è possibile caricare gli spider esistenti sulla Scrapy Cloud, dove gli spider vengono schedulati ed eseguiti. Questo permette di effettuare lo scraping di grandi siti web anche senza utilizzare il computer e la connessione Internet di casa. Usando invece il software open source Scrapyd è possibile configurare un proprio server di web scraping.

Scrapy è una piattaforma matura per eseguire il web scraping con Python. L’architettura dello strumento è orientata alle esigenze dei progetti professionali. Scrapy contiene una pipeline integrata per l’elaborazione dei dati raccolti. Il recupero delle pagine in Scrapy è asincrono, il che significa che consente di scaricare più pagine in parallelo. Scrapy è, quindi, particolarmente indicato per quei progetti di web scraping che prevedono un elevato volume di pagine da elaborare.

Web scraping con Selenium

Il software libero Selenium è un framework per il test automatizzato dei software delle applicazioni web. Progettato per testare siti e applicazioni web, Selenium WebDriver può anche essere utilizzato con Python per il web scraping. Sebbene Selenium stesso non sia scritto in Python, è possibile accedere a questa funzione del software tramite il linguaggio di programmazione.

A differenza di Scrapy o BeautifulSoup, Selenium non opera sul codice sorgente HTML della pagina. La pagina viene invece caricata in un browser senza interfaccia utente. Il browser interpreta il codice sorgente della pagina e crea un Document Object Model (DOM). Questa interfaccia standardizzata consente di testare le interazioni utente e permette, tra le altre cose, di simulare clic e compilare i moduli automaticamente. Le conseguenti modifiche del sito si riflettono nel DOM. Il web scraping con Selenium avviene quindi in questo modo:

URL → Richiesta HTTP → HTML → Selenium → DOM

Poiché il DOM viene generato in modo dinamico, Selenium può effettuare anche lo scraping di pagine i cui contenuti sono stati generati tramite JavaScript. L’accesso ai contenuti dinamici è il vantaggio principale di Selenium. Selenium può essere utilizzato anche in combinazione con Scrapy o BeautifulSoup. Selenium fornisce il codice sorgente, mentre il secondo strumento si occupa dell’analisi e della valutazione. In questo caso, il processo diventa:

URL → Richiesta HTTP → HTML → Selenium → DOM→ HTML → Scrapy/BeautifulSoup

Web scraping con BeautifulSoup

BeautifulSoup è il più datato degli strumenti di web scraping di Python presentati. Come Scrapy, è un parser HTML. Il suo processo si presenta nel seguente modo:

URL → Richiesta HTTP → HTML → BeautifulSoup

A differenza di Scrapy, lo sviluppo dello scraper con BeautifulSoup non richiede una programmazione orientata agli oggetti. Lo scraper viene invece scritto come un semplice script. BeautifulSoup è, quindi, probabilmente il modo più semplice per ricavare informazioni mirate dalla “zuppa di tag”.

Confronto degli strumenti di web scraping per Python

Ciascuno dei tre strumenti presentati offre vantaggi e svantaggi come riassunto nella tabella sottostante:

  Scrapy Selenium BeautifulSoup
Facile da imparare ++ + +++
Legge contenuti dinamici ++ +++ +
Realizza applicazioni complesse +++ + ++
Resistenza agli errori HTML ++ + +++
Ottimizzato per il web scraping +++ + +
Ecosistema maturo +++ + ++
In sintesi

Quale strumento scegliere per il vostro progetto? Scegliete BeautifulSoup se il vostro obiettivo è uno sviluppo rapido o se dovete ancora familiarizzare con Python e il web scraping. Scrapy, invece, è la soluzione adatta per realizzare sofisticate applicazioni di web scraping in Python, presumendo che abbiate le conoscenze necessarie. Infine, Selenium è la scelta migliore quando si tratta principalmente di effettuare lo scraping di contenuti dinamici con Python.

Web scraping con Python e BeautifulSoup - il tutorial

Qui vi mostriamo come estrarre dati da un sito web con BeautifulSoup. Per prima cosa è necessario installare Python e alcuni strumenti. Avrete bisogno di:

  • Python, dalla versione 3.4
  • Il package manager pip per Python
  • Il modulo venv

Per l’installazione, seguite le istruzioni riportate nella pagina di installazione di Python.

Se sul sistema è installato il package manager gratuito Homebrew, è possibile installare Python con il seguente comando:

brew install python
N.B.

Le spiegazioni seguenti e il codice mostrato si riferiscono a Python 3 in ambiente macOS. In linea di principio, il codice è eseguibile anche su altri sistemi operativi. Potrebbe tuttavia essere necessario apportare alcune modifiche, soprattutto se si utilizza Windows.

Impostare il progetto di web scraping con Python sul proprio dispositivo

Creiamo sul desktop la cartella del progetto web scraper per il tutorial Python. Aprite una riga di comando (Terminal.App su Mac), copiate ed eseguite le seguenti righe di codice nel terminale:

# Passare alla cartella del desktop
cd ~/desktop/
# Creare directory progetto
mkdir ./web scraper/ && cd ./web scraper/
# Creare ambiente virtuale
# Assicurarsi che in seguito venga utilizzato pip3
python3 -m venv ./env
# Abilitare ambiente virtuale
source ./env/bin/activate
# Installare pacchetti
pip install requests
pip install beautifulsoup4

Effettuare lo scraping di citazioni e autori con Python e BeautifulSoup

Il sito web Quotes to Scrape fornisce una raccolta di citazioni. Si tratta di una raccolta specifica per eseguire test di web scraping, quindi non dobbiamo preoccuparci di violare le condizioni d’uso.

Cominciamo. Aprite una riga di comando (Terminal.App su Mac) e avviate l’interprete Python dalla cartella di progetto web scraper. A tale scopo, copiate ed eseguite le seguenti righe di codice nel terminale:

# Passare alla directory del progetto
cd ~/desktop/web scraper/
# Abilitare ambiente virtuale
source ./env/bin/activate
# Avviare interprete Python
# Dato che ci troviamo nell’ambiente virtuale, viene utilizzato python3
python

Copiate ora il codice seguente e incollatelo all’interno dell’interprete Python nella riga di comando. Premete Invio, più volte se necessario, per eseguire il codice. È possibile anche salvare il codice come file scrape_quotes.py nella cartella del progetto web scraper. In questo caso, eseguite lo script Python con il comando python scrape_quotes.py.

Come risultato finale dell’esecuzione del codice, dovreste trovare nella cartella del progetto Python web scraper un file citazioni.csv, ovvero una tabella di citazioni e autori. Aprite il file con un programma di fogli di calcolo a scelta.

# Importare moduli
import requests
import csv
from bs4 import BeautifulSoup
# Indirizzo sito web
url = "http://quotes.toscrape.com/"
# Eseguire richiesta GET
response = requests.get(url)
# Analizzare documento HTML del codice sorgente con BeautifulSoup
html = BeautifulSoup(response.text, 'html.parser')
# Estrarre tutte le citazioni e gli autori dal documento HTML
quotes_html = html.find_all('span', class_="text")
authors_html = html.find_all('small', class_="author")
# Raccogliere le citazioni in un elenco
quotes = list()
for quote in quotes_html:
    quotes.append(quote.text)
# Raccogliere gli autori in un elenco
authors = list()
for author in authors_html:
    authors.append(author.text) 
# Per eseguire il test, combinare e visualizzare le voci di entrambi gli elenchi
for t in zip(quotes, authors):
print(t)
# Salvare le citazioni e gli autori in un file CSV nella directory corrente
# Aprire il file con Excel / LibreOffice, ecc.
with open('./citazioni.csv', 'w') as csv_file:
    csv_writer = csv.writer(csv_file, dialect='excel')
    csv_writer.writerows(zip(quotes, authors))

Utilizzare i pacchetti Python per il web scraping

Ogni progetto di web scraping è diverso: in alcuni casi è sufficiente controllare la presenza di modifiche in una pagina, in altri è necessario eseguire valutazioni complesse. Python offre una vasta gamma di pacchetti.

  1. Installare i pacchetti tramite la riga di comando con pip3.
pip3 install <package></package>
  1. Includere i moduli nello script Python con import.
from <package> import <module></module></package>

Ecco alcuni pacchetti frequentemente utilizzati nei progetti di web scraping:

Pacchetto Uso
venv Gestione di ambienti virtuali per il progetto
request Visualizzare siti web
lxml Uso di parser alternativi per HTML e XML
csv Lettura e scrittura di dati tabulari in formato CSV
pandas Elaborare e valutare i dati
scrapy Uso di Scrapy
selenium Uso di Selenium WebDriver
Consiglio

Nel Python Package Index (PyPI) trovate una panoramica dei pacchetti Python disponibili.

Vi preghiamo di osservare la nota legale relativa a questo articolo.

Per offrirti una migliore esperienza di navigazione online questo sito web usa dei cookie, propri e di terze parti. Continuando a navigare sul sito acconsenti all’utilizzo dei cookie. Scopri di più sull’uso dei cookie e sulla possibilità di modificarne le impostazioni o negare il consenso.