Scraping

Web scraping su larga scala: quando e perché utilizzare proxy pubblici

5 min read Published Updated 993 words

La rotazione dei proxy è un espediente, non una soluzione. La maggior parte delle operazioni di scraping fallisce perché tratta gli indirizzi IP come l'unico segnale misurato dai sistemi anti-bot. La realtà è che i moderni bot manager — Akamai Bot Manager, Cloudflare Turnstile, Datadome — rilevano molto più del tuo IP di origine. Un pool rotante di proxy pubblici gratuiti non ti dà quasi alcun vantaggio contro questi sistemi, e spesso peggiora la situazione.

L'illusione della rotazione IP

Quando ruoti gli IP a ogni richiesta, ti riveli come scraper. I pattern di navigazione umana mostrano sessioni sticky — un singolo IP per minuti o ore, impronte digitali del browser coerenti e intervalli di richiesta prevedibili. Strumenti come requests con un oggetto Session e una lista di proxy rotanti rompono tutti questi segnali. L'intestazione X-Akamai-Device-Fingerprint di Akamai e la correlazione cf-request-id di Cloudflare possono collegare richieste provenienti da IP diversi quando i parametri TLS, le impostazioni HTTP/2 e i tempi rimangono identici. La sfida JavaScript di Datadome verifica la presenza di artefatti headless che sopravvivono ai cambi di proxy. Ruotare gli IP senza ruotare l'intera impronta digitale del client è come cambiare la targa ma guidare la stessa macchina — i telecamere di pedaggio ti segnalano comunque.

Per scraping a basso tasso e basso volume su siti che usano solo limitazioni di rate basate sull'IP (ad esempio un limite di 10 richieste al minuto senza sfide JavaScript), un singolo IP residenziale è spesso sufficiente. Ho eseguito scraper per anni su portali di dati governativi e API pubbliche usando un IP statico e un cortese time.sleep(2). Nessun proxy necessario. La regola è semplice: se il sito non mostra una pagina di sfida o un CAPTCHA dopo 50 richieste, non hai bisogno di rotazione.

Oltre l'indirizzo IP: fingerprinting

I sistemi anti-bot ora raccolgono dozzine di segnali per richiesta. La stringa User-Agent è banale da falsificare, ma Accept-Language, Sec-CH-UA, Connection e l'ordine di Accept-Encoding non lo sono. Ancora più critico è il fingerprinting TLS — standardizzato nell'hash JA3 (vedi JA3) — che identifica la libreria client in base all'ordine delle suite di cifratura e all'elenco delle estensioni TLS. La libreria requests di Python (tramite urllib3) produce un hash JA3 distinto da quello di Chrome 124. Cloudflare Turnstile e Datadome controllano entrambi JA3. Ruotare gli IP mantenendo lo stesso stack TLS fa sì che ogni richiesta appaia come lo stesso client automatizzato, semplicemente saltando tra nodi di uscita. I proxy gratuiti aggravano la situazione perché spesso eseguono versioni obsolete di OpenSSL o usano configurazioni TLS simili a bot già inserite in blacklist.

Il fingerprinting HTTP/2 va oltre. Il frame SETTINGS, i valori di aggiornamento della finestra e i parametri di concorrenza dei flussi formano un'impronta digitale "HTTP/2" unica che Akamai Bot Manager traccia tra le sessioni. Un pool di proxy rotanti che non ruota anche l'implementazione HTTP/2 è banale da raggruppare. L'unico modo per eludere questi controlli è usare un motore browser reale (Puppeteer, Playwright) o uno stack TLS/HTTP accuratamente costruito che imiti una versione specifica del browser — e anche in quel caso, devi mantenere la stessa impronta digitale per tutte le richieste di una data sessione.

L'economia dei pool di proxy pubblici gratuiti

Le liste di proxy pubblici gratuiti hanno un tasso di fallimento del 60–80% nei miei test. La maggior parte dei proxy è morta all'arrivo, limitata dall'host o già segnalata dai principali bot manager. La durata media di un proxy SOCKS5 gratuito estratto da una directory pubblica è inferiore a 15 minuti. Mantenere un pool rotante di 500 proxy significa consumare migliaia di IP all'ora, e l'80% delle tue richieste va in timeout o restituisce un 403. La larghezza di banda è inaffidabile, i picchi di latenza sono comuni e molti proxy gratuiti iniettano annunci o modificano il corpo delle risposte. Le reti di proxy residenziali a pagamento (ad esempio Bright Data, Oxylabs) offrono tassi di successo superiori al 95% e opzioni di sessioni sticky, ma a un costo di $10–$20 per GB. Su larga scala, la matematica favorisce i proxy residenziali solo quando devi bypassare blocchi basati su IP su target di alto valore. Per tutto il resto, un singolo IP pulito con una corretta cadenza delle richieste supera un pool gratuito caotico.

Quando la rotazione funziona davvero

La rotazione dei proxy è efficace contro una minaccia specifica: i limiti di rate basati su IP che si azzerano per IP. Se un sito utilizza un semplice controllo X-Forwarded-For o un token bucket per IP, ruotare dopo ogni richiesta bypassa il limite. Questo è comune su siti di e-commerce più piccoli e API legacy che non hanno mai aggiornato il loro rilevamento bot. In questi casi, anche un pool di proxy gratuiti funziona — ma solo se implementi una logica di retry che scarta i proxy falliti e ne cicla rapidamente di nuovi.

Ecco un esempio Python minimale che usa requests e un ciclo di retry con rotazione. Presuppone una lista di URL proxy in proxy_list e un target url:

import requests
from itertools import cycle

proxy_pool = cycle(proxy_list)
max_retries = 5

for attempt in range(max_retries):
    proxy = next(proxy_pool)
    try:
        resp = requests.get(
            url,
            proxies={"http": proxy, "https": proxy},
            timeout=10,
            headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ..."}
        )
        if resp.status_code == 200:
            break
    except (requests.ConnectionError, requests.Timeout):
        continue
else:
    raise RuntimeError("All proxies failed")

Questo pattern funziona solo quando il rilevamento del sito è puramente basato su IP. Aggiungi un time.sleep(random.uniform(1,3)) tra le richieste per imitare i tempi umani. Per siti che eseguono Turnstile o Datadome, questo codice fallirà sempre — la pagina di sfida restituirà un 403 o un CAPTCHA indipendentemente dal proxy. In questi casi, hai bisogno di un browser headless con un'impronta digitale reale, non di una lista di IP rotanti.

Le sessioni sticky — mantenere lo stesso IP per un insieme di richieste correlate — sono spesso più efficaci della rotazione per richiesta. Molti siti di e-commerce si aspettano un singolo IP per una sessione di navigazione (ad esempio, aggiungere articoli al carrello, completare l'acquisto). Ruotare a metà sessione attiva i flag antifrode. Usa un pool di proxy ma assegna un IP per sessione, non per richiesta. I proxy gratuiti raramente supportano sessioni sticky perché lo stesso IP viene riutilizzato da più utenti; vedrai contaminazione incrociata dei dati di sessione. I proxy residenziali a pagamento offrono durate di sessione sticky (5–30 minuti) che si allineano al comportamento di navigazione naturale.

Scegli la rotazione solo quando comprendi lo stack di rilevamento del target. Testa prima con un singolo IP. Aggiungi la rotazione solo se incontri un limite di rate. E non affidarti mai a proxy gratuiti per la produzione — il loro tasso di fallimento ti costerà più tempo di sviluppo e dati persi di un piano residenziale economico.