Python Web Scraping nel 2026: httpx + BeautifulSoup + Playwright - Quando usare quale
La maggior parte dei tutorial "Python web scraping" del 2018 consiglia ancora "requests + BeautifulSoup". La parte "richieste" va bene, ma ora ci sono valori predefiniti migliori e metà del web moderno esegue il rendering dei contenuti in JavaScript, quindi lo stack classico restituisce silenziosamente pagine vuote.
Questa guida copre l'albero decisionale del 2026: quando "httpx + BeautifulSoup" ha ragione (ancora oltre il 90% dei siti), quando rivolgersi a "Playwright", come evitare di essere bloccato e le due regole che mantengono il tuo scraper legale ed etico.
L'albero decisionale in un'immagine
Questo è tutto. Il novanta per cento delle attività di scraping sono HTML statici: lo stack classico (rinominato) è lo strumento giusto. Il resto necessita dell'esecuzione JS e Playwright è la risposta moderna.
Passaggio 1: httpx + BeautifulSoup (il caso del 90%)
"httpx" è il sostituto drop-in di "requests". Stessa API, più supporto HTTP/2 e asincrono nativo. BeautifulSoup è rimasto invariato rispetto al 2015: la scelta del parser è importante (lxml è 5 volte più veloce dell'impostazione predefinita).
Scelte chiave:
- `headers={"User-Agent": ...}` — imposta sempre un vero UA (un indirizzo di contatto è gentile). L'UA
httpxpredefinito è spesso bloccato. - `timeout=10` — non effettuare mai una richiesta illimitata; connessioni bloccate perdono descrittori di file.
- `raise_for_status()` — rilancia su 4xx/5xx in modo che i fallimenti siano rumorosi, non silenziosi.
- `"lxml"` parser — 5 volte più veloce del
html.parserpredefinito e più tollerante con HTML malformato. - `soup.select("css-selector")` — considera lo scraping come "fai finta di utilizzare
document.querySelectorAlldi JavaScript". I selettori CSS sono solitamente ciò che desideri, non l'API di treewalking.
Passaggio 2: drammaturgo (quando JS esegue il rendering del contenuto)
Molte SPA moderne (React, Vue, Angular) forniscono un <div id="root"> vuoto e idratano tutto sul lato client. httpx.get ti dà una shell vuota: i dati che desideri vengono caricati tramite fetch dopo il caricamento della pagina.
Test: httpx.get(url).text: cerca i dati desiderati. Se non è presente, il sito necessita dell'esecuzione di JS.
Installa: pip install playwright && playwright install chromium (il download del browser è di circa 150 MB: ne vale la pena una volta, doloroso per ogni esecuzione CI senza memorizzazione nella cache).
Costo: Playwright è 10-50 volte più lento di "httpx" (caricamento della pagina + esecuzione JS + sovraccarico del browser). Raggiungetelo solo quando i dati non sono nell'HTML statico.
I quattro modi per bloccarsi
La maggior parte dei sistemi anti-raschiamento rileva queste quattro impronte digitali:
1. User-Agent mancante/evidente
2. Nessun ritardo tra le richieste
Richieste sequenziali grezze martellano un server. Aggiungi un ritardo proporzionale al tempo di risposta: se una pagina impiega 500 ms per essere pubblicata, attendi 500-2000 ms tra le richieste. "asyncio.sleep(random.uniform(0.5, 2.0))".
3. Richiesta di percorsi non consentiti /robots.txt
Alcuni siti utilizzano robots.txt per segnali di tariffa legittimi: controlla prima di eseguire lo scraping:
4. Mancata corrispondenza tra TLS e l'impronta digitale del browser
Anti-scraping avanzato (Cloudflare, DataDome) rileva l'impronta digitale dell'handshake TLS e dell'ambiente JS. "httpx" non assomiglia per niente a Chrome a livello TLS. Opzioni:
curl_cffi— una libreria basata su curl-impersonate che imita il vero browser TLS.- Drammaturgo: vero browser TLS per definizione.
- Ruotare i proxy residenziali: l'opzione nucleare.
Per il 99% dei casi d'uso (siti non ostili, volume moderato, accesso non richiesto), è sufficiente httpx + UA reale + ritardo + rispetto robots.txt. Se stai effettuando lo scraping di siti protetti da Cloudflare su larga scala, hai bisogno di browser reali o di servizi di sblocco a pagamento.
Limitazione della velocità (il semaforo + schema del sonno)
Per lo scraping di massa, combina asyncio.Semaphore (massimo simultaneo) con asyncio.sleep (ritardo per richiesta):
Il limite massimo di 5-10 simultanei + 500ms-2s di ritardo per richiesta ti mantiene ben al di sotto di ciò che attiva gli allarmi di limite di velocità sulla maggior parte dei siti.
Norme legali + etiche
1. Leggi i Termini di servizio del sito. Molti vietano completamente lo scraping: puoi comunque farlo (il ToS è diritto contrattuale, non diritto penale nella maggior parte delle giurisdizioni), ma ti assumi il rischio legale. LinkedIn v. hiQ (2022) ha stabilito che lo scraping di dati pubblicamente visibili non è una violazione del CFAA negli Stati Uniti, ma indossare una felpa con cappuccio non ti rende invisibile.
2. Non raschiare dati personali. GDPR/CCPA/tutto il resto penalizza la raccolta di informazioni personali senza consenso. Se stai creando un set di dati di "dipendenti dell'azienda X", fermati.
Aggiunte etiche che tutti dimenticano:
- Invia un indirizzo di contatto reale nel tuo UA. Se il tuo bot causa problemi, il proprietario del sito dovrebbe essere in grado di inviarti un'e-mail.
- Se metti nella cache i dati del sito, fallo in modo aggressivo: non colpire i loro server ad ogni esecuzione.
- Preferire le API pubbliche anche se a pagamento. Meno costoso del rischio legale.
Il riepilogo degli strumenti 2026
| Compito | Raggiungi |
|---|---|
| Pagine HTML statiche | httpx + BeautifulSoup(html, "lxml") |
| SPA con rendering JS | "Drammaturgo" (Chromium senza testa) |
| Cloudflare / anti-bot | curl_cffi o Drammaturgo + proxy residenziale |
| Raschiatura ad alto volume | httpx.AsyncClient + Semaforo + sleep |
| Dati API strutturati | httpx.get + .json() — non è necessaria alcuna zuppa |
Il web scraping nel 2026 è al 90% ancora "httpx + BeautifulSoup", oltre a sapere quando passare a un browser reale. Padroneggia le abitudini del "polite scraper" (UA reale, semaforo, sospensione, robots.txt) e costruirai pipeline di dati durevoli senza essere bloccato o citato in giudizio.
Passaggio successivo: il percorso di Data Science comprende 15 lezioni su scraping, ETL e panda: costruirai una vera pipeline end-to-end dal recupero HTTP a DataFrame all'esportazione CSV.