Cos'è il web scraping
Il web scraping è il processo automatizzato di estrazione di dati da pagine web. Un programma (detto spider o crawler) visita le pagine, analizza il codice HTML e ne estrae le informazioni desiderate: testi, prezzi, link, immagini o qualsiasi dato strutturato presente nel DOM.
A differenza delle API, che forniscono dati in formato strutturato e con il consenso esplicito del provider, lo scraping opera sul contenuto visibile della pagina. Questo solleva questioni etiche e legali che ogni sviluppatore deve conoscere prima di scrivere una sola riga di codice.
"Il web scraping è uno strumento potente. Come ogni strumento potente, la differenza tra uso legittimo e abuso sta nella responsabilità di chi lo utilizza."
Strumenti Python
Python è il linguaggio più utilizzato per il web scraping grazie a un ecosistema di librerie mature e ben documentate.
BeautifulSoup
Libreria leggera per il parsing di HTML e XML. Ideale per progetti semplici e pagine statiche. Si combina con requests per scaricare le pagine.
import requests
from bs4 import BeautifulSoup
response = requests.get("https://esempio.it/prodotti")
soup = BeautifulSoup(response.text, "html.parser")
for prodotto in soup.select(".product-card"):
nome = prodotto.select_one("h2").text
prezzo = prodotto.select_one(".price").text
print(f"{nome}: {prezzo}")
Scrapy
Framework completo per scraping su larga scala. Gestisce automaticamente concorrenza, retry, pipeline di dati, middleware e rispetto del robots.txt. È la scelta migliore per progetti professionali con migliaia di pagine.
import scrapy
class ProdottiSpider(scrapy.Spider):
name = "prodotti"
start_urls = ["https://esempio.it/prodotti"]
def parse(self, response):
for card in response.css(".product-card"):
yield {
"nome": card.css("h2::text").get(),
"prezzo": card.css(".price::text").get(),
}
Selenium e Playwright
Per siti con contenuti generati da JavaScript (SPA, React, Vue), BeautifulSoup non basta. Selenium e Playwright controllano un browser reale, eseguono il JavaScript e permettono di estrarre il DOM renderizzato. Playwright è più veloce e moderno, con supporto nativo per async.
Rispettare il robots.txt
Il file robots.txt, posizionato nella root di ogni sito (es. https://esempio.it/robots.txt), definisce le regole di accesso per i crawler. Rispettarlo è il primo requisito dello scraping etico.
- User-agent: specifica a quale crawler si applicano le regole.
- Disallow: indica i percorsi che non devono essere scansionati.
- Crawl-delay: suggerisce l'intervallo minimo tra le richieste.
- Sitemap: indica la posizione della sitemap XML.
RobotsTxtMiddleware.
Rate limiting etico
Anche quando il robots.txt non specifica un Crawl-delay, è fondamentale limitare la frequenza delle richieste per non sovraccaricare il server del sito target.
- Intervallo tra le richieste: attendere almeno 1-2 secondi tra una richiesta e l'altra. Per siti piccoli, 3-5 secondi sono più appropriati.
- Concorrenza limitata: non aprire più di 2-4 connessioni simultanee verso lo stesso dominio.
- Header User-Agent: identificarsi con un User-Agent descrittivo che includa un contatto email, così il proprietario del sito può contattarti.
- Orari off-peak: se possibile, eseguire lo scraping durante le ore di minor traffico del sito (notte, weekend).
- Caching locale: salvare le risposte in locale per evitare di richiedere più volte la stessa pagina.
In Scrapy, queste impostazioni si configurano nel file settings.py con le direttive DOWNLOAD_DELAY, CONCURRENT_REQUESTS_PER_DOMAIN e AUTOTHROTTLE_ENABLED.
Legge e GDPR
Il web scraping si muove in un'area grigia dal punto di vista legale. La legalità dipende da cosa si raccoglie, come si usa e in quale giurisdizione si opera.
- GDPR (Europa): se i dati estratti contengono informazioni personali (nomi, email, indirizzi), si applicano tutte le norme del Regolamento Europeo sulla protezione dei dati. Serve una base giuridica legittima per il trattamento.
- Termini di servizio: molti siti vietano esplicitamente lo scraping nei loro ToS. Violare i termini di servizio può costituire un illecito contrattuale.
- Copyright: i contenuti scrappati (testi, immagini) sono protetti dal diritto d'autore. Estrarre e ripubblicare contenuti altrui senza autorizzazione è violazione di copyright.
- Database Rights (UE): la Direttiva europea 96/9/CE protegge i database originali. L'estrazione sistematica di una parte sostanziale di un database può violare questi diritti.
Casi d'uso legittimi
Il web scraping, se condotto eticamente, ha numerose applicazioni legittime:
- Price monitoring: monitorare i prezzi dei concorrenti per adeguare la propria strategia commerciale. Molto usato nell'e-commerce e nel travel.
- Ricerca accademica: raccogliere dataset per analisi linguistiche, studi sociologici o ricerca in ambito intelligenza artificiale. Molte università hanno policy specifiche per lo scraping a fini di ricerca.
- Aggregazione news: raccogliere titoli e link da più fonti per creare servizi di rassegna stampa o monitoraggio media.
- SEO e analisi competitiva: analizzare la struttura, i meta tag e i contenuti dei siti concorrenti per migliorare la propria strategia SEO.
- Monitoraggio brand: verificare dove e come il proprio brand viene menzionato online.
- Lead generation: estrarre informazioni di contatto da directory pubbliche (attenzione al GDPR).
Alternative: API ufficiali
Prima di implementare uno scraper, verifica sempre se il sito offre un'API ufficiale. Le API sono sempre preferibili perché:
| Criterio | Web Scraping | API ufficiale |
|---|---|---|
| Stabilità | Si rompe ad ogni cambio di layout | Versionata e documentata |
| Formato dati | HTML da parsare | JSON/XML strutturato |
| Legalità | Area grigia | Uso autorizzato |
| Rate limiting | Da gestire manualmente | Definito e documentato |
| Manutenzione | Alta (fragile) | Bassa (contratto stabile) |
Piattaforme come Google, Twitter/X, Amazon, GitHub e molte altre offrono API gratuite o a pagamento. Servizi come RapidAPI aggregano migliaia di API in un unico marketplace.
Storage e pulizia dati
I dati grezzi estratti dallo scraping richiedono sempre una fase di pulizia e strutturazione prima di essere utilizzabili.
- Pulizia HTML: rimuovere tag residui, entità HTML, spazi multipli e caratteri speciali. In Python,
bleache le funzioni di stringa native sono utili. - Deduplicazione: eliminare i record duplicati confrontando campi chiave o usando hash.
- Normalizzazione: uniformare formati (date, valute, unità di misura) e codifiche (UTF-8).
- Validazione: verificare che i dati estratti siano completi e coerenti con lo schema atteso.
Per lo storage, le opzioni più comuni sono:
- CSV/JSON: per dataset piccoli e analisi una tantum.
- Database SQL (PostgreSQL, MySQL): per dati strutturati con relazioni, query complesse e integrità referenziale.
- Database NoSQL (MongoDB): per dati semi-strutturati o con schema variabile, tipico dei dati scrappati da fonti diverse.
- Data lake (S3, GCS): per grandi volumi di dati grezzi da elaborare successivamente.
Gestire il codice dello scraper con Git è essenziale: i selettori CSS e XPath cambiano frequentemente e avere una cronologia delle modifiche facilita il debug e il rollback.