Il World Wide Web è co­sti­tui­to da miliardi di documenti collegati fra loro, al­tri­men­ti co­no­sciu­ti come siti web. Il codice sorgente dei siti web è scritto nel lin­guag­gio HTML (Hypertext Markup Language). Il codice sorgente HTML è un misto di in­for­ma­zio­ni leggibili dall’uomo e codici leggibili dalla macchina, i co­sid­det­ti tag. Il browser web (ad esempio Chrome, Firefox, Safari o Edge) elabora il codice sorgente, in­ter­pre­ta i tag e presenta le in­for­ma­zio­ni in esso contenute all’utente.

Al fine di estrarre dal codice sorgente solo in­for­ma­zio­ni di interesse per l’utente, viene uti­liz­za­to un software speciale. Questi programmi, noti come “web scraper”, “crawler“, “spider” o sem­pli­ce­men­te “bot”, cercano nel codice sorgente dei siti web modelli pre­de­fi­ni­ti ed estrag­go­no le in­for­ma­zio­ni in essi contenute. Le in­for­ma­zio­ni ottenute dal web scraping sono riassunte, combinate, valutate e me­mo­riz­za­te per un ulteriore utilizzo.

In questo articolo vi spie­ghia­mo perché il lin­guag­gio Python è par­ti­co­lar­men­te adatto per la creazione di web scraper e vi forniamo un’in­tro­du­zio­ne completa del suo utilizzo.

Sito web con dominio
Crea il tuo sito web per­so­na­liz­za­to

MyWebsite Now Starter è lo strumento pensato per i prin­ci­pian­ti che vogliono creare un sito web in modo intuitivo. Include dominio e indirizzo e-mail.

Perché usare Python per il web scraping?

Il popolare lin­guag­gio di pro­gram­ma­zio­ne Python è par­ti­co­lar­men­te adatto per la creazione di software di web scraping. Con l’ag­gior­na­men­to 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 par­ti­co­lar­men­te facile con Python.

Python è inoltre molto adatto per l’ela­bo­ra­zio­ne di testi e il recupero di risorse web, entrambi fon­da­men­ti tecnici per il web scraping. Python rap­pre­sen­ta anche uno standard con­so­li­da­to per l’analisi e l’ela­bo­ra­zio­ne dei dati. Oltre all’idoneità generale del lin­guag­gio, Python si distingue per con un eco­si­ste­ma di pro­gram­ma­zio­ne fiorente che include librerie, progetti open source, do­cu­men­ta­zio­ne e ri­fe­ri­men­ti lin­gui­sti­ci, nonché post di forum, se­gna­la­zio­ni di bug e articoli di blog.

Nello specifico, esistono diversi strumenti so­fi­sti­ca­ti per ef­fet­tua­re il web scraping con Python. Qui vi pre­sen­tia­mo tre strumenti ab­ba­stan­za diffusi: Scrapy, Selenium e Beau­ti­ful­Soup. Come esercizio pratico, vi pro­po­nia­mo nel nostro tutorial sul web scraping con Python un esercizio con Beau­ti­ful­Soup. In questo modo com­pren­de­re­te im­me­dia­ta­men­te il processo di scraping.

Pa­no­ra­mi­ca del web scraping

Lo schema di base del processo di web scraping è ab­ba­stan­za semplice. In primo luogo, lo svi­lup­pa­to­re del web scraper analizza il codice sorgente HTML della pagina in­te­res­sa­ta. Di solito ci sono modelli unici in base ai quali le in­for­ma­zio­ni de­si­de­ra­te possono essere estratte. Lo scraper viene pro­gram­ma­to in base a questi modelli. Il resto del lavoro viene eseguito au­to­ma­ti­ca­men­te dallo scraper:

  1. Accesso al sito web tramite l’URL.
  2. Estra­zio­ne au­to­ma­tiz­za­ta dei dati strut­tu­ra­ti secondo i modelli.
  3. Rias­su­me­re, ar­chi­via­re, valutare, combinare, ecc. le in­for­ma­zio­ni estratte.

Casi d’uso del web scraping

Il web scraping è molto versatile. Oltre all’in­di­ciz­za­zio­ne dei motori di ricerca, viene uti­liz­za­to anche per i seguenti scopi:

  • Creazione di database di contatti
  • Mo­ni­to­rag­gio e confronto dei prezzi delle offerte online
  • Com­bi­na­zio­ne di dati pro­ve­nien­ti da diverse fonti online
  • Trac­cia­tu­ra della presenza e della re­pu­ta­zio­ne online
  • Raccolta di dati fi­nan­zia­ri, me­teo­ro­lo­gi­ci e di altro tipo
  • Mo­ni­to­rag­gio del contenuto web per eventuali modifiche
  • Raccolta di dati a fini di ricerca
  • Ese­cu­zio­ne di data mining

Esempio pratico di web scraping

Im­ma­gi­na­te un sito web per la vendita di auto usate. Se si accede alla pagina nel browser, verrà vi­sua­liz­za­to un elenco di au­to­mo­bi­li. 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 ana­liz­za­re l’elenco delle auto usate di­spo­ni­bi­li online. A seconda dell’in­ten­zio­ne dello svi­lup­pa­to­re, lo scraper ricerca un modello specifico, nel nostro caso, una Volk­swa­gen Mag­gio­li­no. Nel codice sorgente, le in­for­ma­zio­ni relative alla marca e al modello dell’auto cor­ri­spon­do­no alle classi CSS 'car-make' e 'car-model'. I nomi delle classi sem­pli­fi­ca­no lo scraping delle in­for­ma­zio­ni de­si­de­ra­te. Ecco un esempio con Beau­ti­ful­Soup:

# 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 au­to­ma­tiz­za­to con un web scraper può co­sti­tui­re una vio­la­zio­ne delle con­di­zio­ni d’uso. Questo è so­prat­tut­to il caso quando la portata dello scraping è molto ampia e viene eseguito con­tem­po­ra­nea­men­te o in alta sequenza su più pagine. Una persona non può in­te­ra­gi­re con un sito in questo modo.

Il recupero, la me­mo­riz­za­zio­ne e la va­lu­ta­zio­ne au­to­ma­tiz­za­ti dei dati pub­bli­ca­ti su un sito web possono co­sti­tui­re inoltre una vio­la­zio­ne del diritto d’autore. Se le in­for­ma­zio­ni raccolte sono dati personali, le relative me­mo­riz­za­zio­ne e va­lu­ta­zio­ne senza il consenso degli in­te­res­sa­ti viola le di­spo­si­zio­ni ap­pli­ca­bi­li in materia di pro­te­zio­ne dei dati. In tal senso, non è con­sen­ti­to, ad esempio, ef­fet­tua­re lo scraping di profili Facebook per rac­co­glie­re dati personali.

N.B.
Le vio­la­zio­ni della pro­te­zio­ne dei dati e del copyright sono soggette a severe sanzioni. As­si­cu­ra­te­vi quindi di non in­fran­ge­re alcuna legge quando ef­fet­tua­te il web scraping. Le barriere tecniche esistenti non devono in nessun caso essere aggirate.

Re­stri­zio­ni tecniche del web scraping

I gestori di siti web hanno spesso interesse a limitare lo scraping au­to­ma­ti­co delle loro offerte online. Da un lato, l’accesso massiccio al sito web da parte di scraper può avere un impatto negativo sulle pre­sta­zio­ni del sito. D’altra parte, ci sono spesso aree interne di un sito web che non do­vreb­be­ro 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 de­no­mi­na­to robots.txt nella directory prin­ci­pa­le del sito. All’interno del file, voci speciali de­ter­mi­na­no 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 re­stri­zio­ne vo­lon­ta­ria. Sebbene si supponga che i bot ade­ri­sca­no alle spe­ci­fi­che, ciò non può essere tec­ni­ca­men­te imposto. Al fine di regolare ef­fi­ca­ce­men­te l’accesso tramite web scraper, gli operatori di siti web uti­liz­za­no anche tecniche più ag­gres­si­ve: 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 spe­ci­fi­che.

API come al­ter­na­ti­va 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 for­ni­sco­no i dati in un formato strut­tu­ra­to e leggibile da una macchina che sono ac­ces­si­bi­li tramite apposite in­ter­fac­ce di pro­gram­ma­zio­ne, le co­sid­det­te Ap­pli­ca­tion Pro­gram­ming In­ter­fa­ces (API).

I vantaggi dell’utilizzo di un’API sono si­gni­fi­ca­ti­vi:

  • L’API è espli­ci­ta­men­te fornita dal provider per accedere ai dati. Di con­se­guen­za, ci sono meno rischi legali e il fornitore può re­go­la­men­ta­re meglio l’accesso ai suoi dati. Per accedere ai dati è, ad esempio, possibile ri­chie­de­re una chiave API. Anche la li­mi­ta­zio­ne del traffico può essere im­ple­men­ta­ta in modo più mirato dal provider.
  • L’API fornisce i dati in un formato leggibile dalla macchina, in questo modo si elimina la laboriosa estra­zio­ne dei dati dal codice sorgente. La struttura dei dati viene, inoltre, separata dalla rap­pre­sen­ta­zio­ne visiva. Pertanto, la struttura rimane al suo posto anche quando il design del sito web viene mo­di­fi­ca­to.

Se è possibile uti­liz­za­re un’API che fornisce dati completi, rap­pre­sen­ta cer­ta­men­te il modo migliore per accedervi. Tuttavia, il web scraping può essere uti­liz­za­to, in linea di principio, per tutti i testi pre­sen­ta­ti in modo leggibile agli utenti sui siti web.

Strumenti di web scraping per Python

Nell’eco­si­ste­ma Python esistono diversi strumenti con­so­li­da­ti per im­ple­men­ta­re un progetto di web scraping:

  • Scrapy
  • Selenium
  • Beau­ti­ful­Soup

Ap­pro­fon­di­re­mo anche i vantaggi e gli svantaggi delle tre tec­no­lo­gie.

Web scraping con Scrapy

Lo strumento Python di web scraping Scrapy utilizza un parser HTML per estrarre in­for­ma­zio­ni 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 è pro­gram­ma­to per ana­liz­za­re un sito web specifico e si arrampica di pagina in pagina come un ragno. Entra in gioco una pro­gram­ma­zio­ne orientata agli oggetti: ogni spider ha la sua classe Python.

Oltre al pacchetto Python, l’in­stal­la­zio­ne di Scrapy include uno strumento da riga di comando. At­tra­ver­so questo “Scrapy Shell” si con­trol­la­no i diversi spider. Inoltre è possibile caricare gli spider esistenti sulla Scrapy Cloud, dove gli spider vengono sche­du­la­ti ed eseguiti. Questo permette di ef­fet­tua­re lo scraping di grandi siti web anche senza uti­liz­za­re il computer e la con­nes­sio­ne Internet di casa. Usando invece il software open source Scrapyd è possibile con­fi­gu­ra­re un proprio server di web scraping.

Scrapy è una piat­ta­for­ma matura per eseguire il web scraping con Python. L’ar­chi­tet­tu­ra dello strumento è orientata alle esigenze dei progetti pro­fes­sio­na­li. Scrapy contiene una pipeline integrata per l’ela­bo­ra­zio­ne dei dati raccolti. Il recupero delle pagine in Scrapy è asincrono, il che significa che consente di scaricare più pagine in parallelo. Scrapy è, quindi, par­ti­co­lar­men­te 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 au­to­ma­tiz­za­to dei software delle ap­pli­ca­zio­ni web. Pro­get­ta­to per testare siti e ap­pli­ca­zio­ni web, Selenium WebDriver può anche essere uti­liz­za­to con Python per il web scraping. Sebbene Selenium stesso non sia scritto in Python, è possibile accedere a questa funzione del software tramite il lin­guag­gio di pro­gram­ma­zio­ne.

A dif­fe­ren­za di Scrapy o Beau­ti­ful­Soup, Selenium non opera sul codice sorgente HTML della pagina. La pagina viene invece caricata in un browser senza in­ter­fac­cia utente. Il browser in­ter­pre­ta il codice sorgente della pagina e crea un Document Object Model (DOM). Questa in­ter­fac­cia stan­dar­diz­za­ta consente di testare le in­te­ra­zio­ni utente e permette, tra le altre cose, di simulare clic e compilare i moduli au­to­ma­ti­ca­men­te. Le con­se­guen­ti modifiche del sito si ri­flet­to­no 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ò ef­fet­tua­re anche lo scraping di pagine i cui contenuti sono stati generati tramite Ja­va­Script. L’accesso ai contenuti dinamici è il vantaggio prin­ci­pa­le di Selenium. Selenium può essere uti­liz­za­to anche in com­bi­na­zio­ne con Scrapy o Beau­ti­ful­Soup. Selenium fornisce il codice sorgente, mentre il secondo strumento si occupa dell’analisi e della va­lu­ta­zio­ne. In questo caso, il processo diventa:

URL → Richiesta HTTP → HTML → Selenium → DOM→ HTML → Scrapy/Beau­ti­ful­Soup

Web scraping con Beau­ti­ful­Soup

Beau­ti­ful­Soup è il più datato degli strumenti di web scraping di Python pre­sen­ta­ti. Come Scrapy, è un parser HTML. Il suo processo si presenta nel seguente modo:

URL → Richiesta HTTP → HTML → Beau­ti­ful­Soup

A dif­fe­ren­za di Scrapy, lo sviluppo dello scraper con Beau­ti­ful­Soup non richiede una pro­gram­ma­zio­ne orientata agli oggetti. Lo scraper viene invece scritto come un semplice script. Beau­ti­ful­Soup è, quindi, pro­ba­bil­men­te il modo più semplice per ricavare in­for­ma­zio­ni mirate dalla “zuppa di tag”.

Confronto degli strumenti di web scraping per Python

Ciascuno dei tre strumenti pre­sen­ta­ti offre vantaggi e svantaggi come riassunto nella tabella sot­to­stan­te:

  Scrapy Selenium Beau­ti­ful­Soup
Facile da imparare ++ + +++
Legge contenuti dinamici ++ +++ +
Realizza ap­pli­ca­zio­ni complesse +++ + ++
Re­si­sten­za agli errori HTML ++ + +++
Ot­ti­miz­za­to per il web scraping +++ + +
Eco­si­ste­ma maturo +++ + ++
In sintesi
Quale strumento scegliere per il vostro progetto? Scegliete Beau­ti­ful­Soup se il vostro obiettivo è uno sviluppo rapido o se dovete ancora fa­mi­lia­riz­za­re con Python e il web scraping. Scrapy, invece, è la soluzione adatta per rea­liz­za­re so­fi­sti­ca­te ap­pli­ca­zio­ni di web scraping in Python, pre­su­men­do che abbiate le co­no­scen­ze ne­ces­sa­rie. Infine, Selenium è la scelta migliore quando si tratta prin­ci­pal­men­te di ef­fet­tua­re lo scraping di contenuti dinamici con Python.

Web scraping con Python e Beau­ti­ful­Soup - il tutorial

Qui vi mostriamo come estrarre dati da un sito web con Beau­ti­ful­Soup. Per prima cosa è ne­ces­sa­rio in­stal­la­re Python e alcuni strumenti. Avrete bisogno di:

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

Per l’in­stal­la­zio­ne, seguite le istru­zio­ni riportate nella pagina di in­stal­la­zio­ne di Python.

Se sul sistema è in­stal­la­to il package manager gratuito Homebrew, è possibile in­stal­la­re Python con il seguente comando:

brew install python
N.B.
Le spie­ga­zio­ni seguenti e il codice mostrato si ri­fe­ri­sco­no a Python 3 in ambiente macOS. In linea di principio, il codice è ese­gui­bi­le anche su altri sistemi operativi. Potrebbe tuttavia essere ne­ces­sa­rio apportare alcune modifiche, so­prat­tut­to se si utilizza Windows.

Impostare il progetto di web scraping con Python sul proprio di­spo­si­ti­vo

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

Ef­fet­tua­re lo scraping di citazioni e autori con Python e Beau­ti­ful­Soup

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 pre­oc­cu­par­ci di violare le con­di­zio­ni d’uso.

Co­min­cia­mo. Aprite una riga di comando (Terminal.App su Mac) e avviate l’in­ter­pre­te 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 in­col­la­te­lo all’interno dell’in­ter­pre­te Python nella riga di comando. Premete Invio, più volte se ne­ces­sa­rio, 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’ese­cu­zio­ne 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))

Uti­liz­za­re i pacchetti Python per il web scraping

Ogni progetto di web scraping è diverso: in alcuni casi è suf­fi­cien­te con­trol­la­re la presenza di modifiche in una pagina, in altri è ne­ces­sa­rio eseguire va­lu­ta­zio­ni complesse. Python offre una vasta gamma di pacchetti.

  1. In­stal­la­re 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 fre­quen­te­men­te uti­liz­za­ti nei progetti di web scraping:

Pacchetto Uso
venv Gestione di ambienti virtuali per il progetto
request Vi­sua­liz­za­re siti web
lxml Uso di parser al­ter­na­ti­vi 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 pa­no­ra­mi­ca dei pacchetti Python di­spo­ni­bi­li.

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

Vai al menu prin­ci­pa­le