Le classiche combinazioni di Selenium e Puppeteer si scontrano sempre più spesso con i sistemi anti-bot di livello Cloudflare, DataDome e PerimeterX. Nuovi framework come Scrapling, Botasaurus e nodriver sono stati progettati fin dall'inizio per bypassare la rilevazione. Ma anche il framework più avanzato è inutile senza proxy configurati correttamente. In questo articolo esamineremo come collegare i proxy in ciascuno dei tre strumenti, quali errori compromettono l'efficacia e come scegliere il tipo di IP per un compito specifico di scraping.
Cosa distingue Scrapling, Botasaurus e nodriver da Selenium
Tutti e tre i framework sono nati come risposta al fatto che Selenium e il normale Puppeteer sono diventati troppo facilmente rilevabili. I sistemi anti-bot controllano decine di parametri: protocollo CDP, navigator.webdriver, rendering del canvas, tempistiche degli eventi — e i driver classici lasciano tracce caratteristiche in quasi tutti questi aspetti.
Scrapling è una libreria Python che combina il parsing adattivo dell'HTML con la possibilità di emulare un browser tramite StealthyFetcher basato su Camoufox (un fork di Firefox con fingerprint patchato). È utile per compiti, dove è necessario un parsing veloce con un consumo minimo di risorse, ma nel contempo la protezione del sito verifica attivamente il TLS-fingerprint.
Botasaurus è un framework basato su Chromium modificato (undetected-chromedriver sotto il cofano), progettato per lo scraping massivo e parallelo con gestione automatica dei profili del browser e supporto integrato per la risoluzione dei captcha tramite servizi di terze parti.
nodriver è il successore di undetected-chromedriver dello stesso autore, che ha abbandonato completamente Selenium WebDriver e lavora direttamente tramite CDP (Chrome DevTools Protocol), eliminando una parte significativa degli artefatti di automazione rilevabili.
Una caratteristica comune a tutti e tre è che riducono la rilevazione a livello di fingerprint del browser, ma non risolvono il problema della reputazione IP. Se le richieste provengono da un IP di data center già segnalato nelle blacklist di DataDome o Cloudflare, nessuna patch del browser salverà da un captcha o da un errore 403.
Configurazione del proxy in Scrapling
Scrapling supporta i proxy sia in modalità HTTP veloce (Fetcher) che in modalità browser (StealthyFetcher). Per il parsing statico senza rendering JS, il proxy viene passato direttamente nei parametri della richiesta:
from scrapling.fetchers import Fetcher
response = Fetcher.get(
"https://example.com",
proxy="http://user:[email protected]:9000"
)
print(response.status)
Per la modalità con browser completo (StealthyFetcher su Camoufox) il proxy viene passato tramite un dizionario con campi separati per server, nome utente e password — questo è importante, perché Camoufox gestisce l'autenticazione del proxy in modo diverso rispetto al normale Chromium:
from scrapling.fetchers import StealthyFetcher
response = StealthyFetcher.fetch(
"https://example.com",
proxy={
"server": "gate.proxycove.com:9000",
"username": "user",
"password": "pass"
},
headless=True
)
print(response.status)
Un errore comune è passare il proxy come stringa intera nella modalità browser, come nelle richieste HTTP. In questo caso, Camoufox ignora l'autenticazione o va in timeout durante la connessione al server proxy. Se vedi l'errore ERR_NO_SUPPORTED_PROXIES — controlla il formato del dizionario con campi separati.
Configurazione del proxy in Botasaurus
Botasaurus utilizza il decoratore @browser
per configurare il driver, e il proxy viene passato come parametro di questo decoratore o direttamente nella funzione di avvio:
from botasaurus.browser import browser, Driver
@browser(
proxy="http://user:[email protected]:9000"
)
def scrape_data(driver: Driver, data):
driver.get("https://example.com")
return driver.page_html
scrape_data()
Se è necessario collegare diversi proxy per ciascun compito parallelo (cosa critica durante lo scraping massivo tramite Botasaurus), è meglio passare i proxy dinamicamente tramite un elenco di dati, piuttosto che codificarli nel decoratore:
from botasaurus.browser import browser, Driver
@browser
def scrape_with_proxy(driver: Driver, data):
driver.config.proxy = data["proxy"]
driver.get(data["url"])
return driver.page_html
tasks = [
{"url": "https://example.com/page1", "proxy": "http://user:pass@ip1:port"},
{"url": "https://example.com/page2", "proxy": "http://user:pass@ip2:port"},
]
scrape_with_proxy(tasks)
Botasaurus gestisce bene i compiti in parallelo tramite multiprocessing, quindi durante lo scraping massivo è importante utilizzare proxy con un pool di IP sufficiente — altrimenti, più thread si scontreranno contro lo stesso indirizzo, il che rivela immediatamente l'automazione al sistema anti-bot a causa del pattern di frequenza delle richieste.
Configurazione del proxy in nodriver
nodriver funziona tramite connessione diretta a CDP senza il layer di Selenium, quindi il proxy qui viene configurato tramite argomenti di avvio del browser, e non tramite un API separata. Per i proxy senza autenticazione è tutto semplice:
import nodriver as uc
import asyncio
async def main():
browser = await uc.start(
browser_args=["--proxy-server=http://gate.proxycove.com:9000"]
)
page = await browser.get("https://example.com")
await asyncio.sleep(3)
browser.stop()
asyncio.run(main())
Il problema è che Chromium non supporta login/password nei proxy tramite --proxy-server direttamente.
Per i proxy autenticati in nodriver è necessario o sollevare un tunnel proxy locale senza autenticazione
(ad esempio, tramite px o 3proxy), oppure gestire l'evento CDP Fetch.authRequired:
import nodriver as uc
import asyncio
async def main():
browser = await uc.start(
browser_args=["--proxy-server=http://gate.proxycove.com:9000"]
)
page = await browser.get("https://example.com")
async def auth_handler(event):
await page.send(uc.cdp.fetch.continue_with_auth(
request_id=event.request_id,
auth_challenge_response=uc.cdp.fetch.AuthChallengeResponse(
response="ProvideCredentials",
username="user",
password="pass"
)
))
page.add_handler(uc.cdp.fetch.AuthRequired, auth_handler)
await asyncio.sleep(5)
browser.stop()
asyncio.run(main())
Questo è il punto meno ovvio tra tutti e tre i framework — molti sviluppatori trascorrono ore cercando di capire perché l'autenticazione non funziona, senza sapere del dominio Fetch in CDP.
Rotazione dei proxy e lotta contro i bot
Anche un fingerprint del browser perfettamente configurato non salverà se su un IP vengono effettuate più di 50-100 richieste al minuto verso un dominio protetto. DataDome e Cloudflare analizzano la frequenza delle richieste da un indirizzo specifico e i pattern temporali tra le azioni — intervalli troppo uniformi sono anch'essi sospetti.
Uno schema di rotazione funzionante per tutti e tre i framework è costruito allo stesso modo:
- Utilizza un gateway con rotazione automatica degli IP a livello di provider — non è necessario scrivere la propria logica per cambiare indirizzi ad ogni richiesta.
- Per compiti di sessione (login, navigazione multi-pagina) fissa l'IP per sessione tramite un parametro sticky nella stringa di connessione.
- Per il semplice scraping di pagine statiche ruota gli IP ad ogni richiesta o ogni 5-10 richieste.
- Aggiungi ritardi casuali tra le richieste (1-4 secondi) — questo riduce la rilevazione tramite pattern temporali.
Ecco un esempio di sessione sticky nella stringa di connessione, dove session-id mantiene lo stesso IP in uscita per 10 minuti:
proxy = "http://user-session-abc123:[email protected]:9000"
Per Botasaurus questo schema è particolarmente utile, perché durante lo scraping parallelo ogni processo può ricevere il proprio unique session-id, e ottieni un pool stabile di diversi IP senza gestire manualmente l'elenco degli indirizzi.
Quale tipo di proxy scegliere per ciascun framework
Il tipo di proxy influisce sul successo del parsing tanto quanto la scelta del framework. Di seguito un confronto per compiti:
| Compito | Tipo di proxy raccomandato | Perché |
|---|---|---|
| Parsing di siti con Cloudflare/DataDome | Proxy residenziali | IP reali di utenti domestici raramente finiscono nelle blacklist dei sistemi anti-bot |
| Scraping massivo senza protezione rigorosa | Proxy di data center | Maggiore velocità, costo inferiore su grandi volumi di richieste |
| Emulazione di un utente reale su siti mobili | Proxy mobili | Gli indirizzi CGNAT degli operatori di telecomunicazioni hanno il massimo livello di fiducia presso i sistemi anti-bot |
Per Scrapling in modalità StealthyFetcher, i proxy residenziali offrono il massimo effetto, poiché Camoufox risolve già il problema del fingerprint del browser — resta solo da non farsi scoprire tramite IP. Per Botasaurus, durante lo scraping massivo parallelo, i proxy di data center sono spesso ottimali in termini di rapporto velocità/prezzo, se il sito target non utilizza una protezione avanzata di livello DataDome.
Errori tipici nella combinazione di proxy e automazione del browser
Nella pratica, la maggior parte dei fallimenti nel parsing è legata non al framework stesso, ma a una configurazione errata del proxy. Ecco un elenco di errori che si verificano più frequentemente:
- Lo stesso IP per tutti i thread paralleli di Botasaurus. L'anti-bot vede 20 sessioni simultanee da un unico indirizzo e lo blocca in pochi minuti.
- Passare il proxy come stringa nella modalità browser di Scrapling. Camoufox richiede un dizionario con campi separati — altrimenti l'autenticazione non passa.
- Ignorare il dominio CDP Fetch in nodriver. Senza un gestore authRequired, il proxy autenticato semplicemente non si connetterà, il browser si bloccherà durante il caricamento.
- Assenza di rotazione durante le azioni di sessione. Cambiare IP nel mezzo di una sessione autenticata rivela immediatamente l'automazione — utilizza sessioni sticky.
- Incongruenza tra la geolocalizzazione del proxy e la lingua del browser. IP dalla Germania con intestazioni Accept-Language: ru — un segnale classico di bot per i sistemi di frode.
- Frequenza di richieste troppo aggressiva anche con rotazione. La rotazione degli IP non esclude la necessità di fare pause tra le richieste — anche il pattern di comportamento viene analizzato.
È importante controllare separatamente le perdite DNS quando si lavora tramite proxy in modalità browser — a volte il browser risolve i domini tramite DNS di sistema, e non tramite il tunnel proxy, creando un disallineamento tra l'IP della richiesta e l'IP della risoluzione, che viene facilmente rilevato dai sistemi di protezione.
Conclusione
Scrapling, Botasaurus e nodriver affrontano il problema della rilevazione a livello di fingerprint del browser molto meglio del classico Selenium, ma nessuno di essi riduce l'importanza di un proxy di qualità. Una corretta configurazione dell'autenticazione (soprattutto in nodriver tramite CDP), una rotazione IP intelligente e la scelta del tipo di proxy adatto per un sistema anti-bot specifico — sono tre fattori che determinano la stabilità del parsing a lungo termine.
Se stai facendo scraping di siti con protezioni avanzate come Cloudflare o DataDome, inizia con proxy residenziali — offrono la percentuale più alta di richieste riuscite proprio grazie alla reputazione degli IP. Per compiti massivi senza protezione rigorosa i proxy di data center rimangono la scelta ottimale in termini di velocità e costo su grandi volumi.