Il web scraping sbatte quasi sempre contro lo stesso muro: il sito vede che da uno stesso indirizzo IP arriva un numero sospetto di richieste e inizia a bloccare, a mostrare captcha o a servire pagine «vuote». I proxy risolvono questo problema — sostituiscono il tuo IP reale con uno altrui e distribuiscono il carico. Ma non tutti i proxy sono uguali: ne esistono decine di varianti, e dalla scelta dipende se il tuo scraper passerà inosservato o si brucerà al primo centinaio di richieste.
Qui sotto trovi una panoramica di tutti i principali tipi di proxy, delle loro proprietà, dei livelli di privacy e delle tariffe, oltre a esempi di codice in vari linguaggi.
Che cos’è un proxy e a cosa serve nello scraping
Un server proxy è un intermediario tra il tuo scraper e il sito di destinazione. La richiesta non viaggia in modo diretto, ma passa attraverso il proxy: il sito vede l’IP del proxy, non il tuo. Nello scraping questo porta tre vantaggi:
- Nascondere l’IP reale: diventa più difficile identificarti e bannarti personalmente.
- Distribuire il carico: un pool di centinaia di IP permette di inviare molte richieste senza superare i limiti di ogni singolo indirizzo.
- Aggirare le restrizioni geografiche: puoi raccogliere dati come se ti trovassi nel paese che ti serve (prezzi, risultati di ricerca e contenuti dipendono spesso dalla regione).
Classificazione per protocollo: HTTP, HTTPS, SOCKS
È la prima cosa da capire: a quale livello lavora il proxy.
Proxy HTTP
Lavora solo con il traffico HTTP. «Capisce» la struttura della richiesta HTTP, può leggere e modificare le intestazioni e mettere in cache le risposte. Per lo scraping di siti comuni spesso è sufficiente.
Proxy HTTPS (HTTP CONNECT)
Stessa cosa, ma sa incapsulare in un tunnel il traffico TLS cifrato tramite il metodo CONNECT. Il proxy non vede il contenuto (è cifrato): si limita a inoltrare i byte. Oggi quasi tutto il web gira su HTTPS, quindi il supporto di CONNECT è obbligatorio.
SOCKS4 e SOCKS5
SOCKS lavora a un livello più basso: è un tunnel universale per qualsiasi traffico TCP (e SOCKS5 anche UDP). Il proxy non entra nel merito del contenuto: gli è indifferente che si tratti di HTTP, FTP, WebSocket o altro.
In che cosa differiscono SOCKS e un proxy HTTP:
| HTTP(S) | SOCKS5 | |
|---|---|---|
| Livello | Applicativo (capisce HTTP) | Di trasporto (inoltra solo TCP/UDP) |
| Può leggere/modificare le intestazioni | Sì | No |
| Caching | Possibile | No |
| Protocolli | Solo HTTP/HTTPS | Qualsiasi TCP, più UDP |
| Velocità | Overhead un po’ più alto | Di solito più veloce, più «trasparente» |
| Autenticazione | Basic/Digest | Utente e password, GSSAPI |
Differenza tra SOCKS4 e SOCKS5:
- SOCKS4 — vecchio: non supporta l’autenticazione con password, né IPv6 né UDP, e non sa risolvere il DNS sul lato del proxy (il dominio si trasforma in IP sulla tua macchina — è una fuga di informazioni: dalle query DNS si può capire che cosa stai scrapando).
- SOCKS5 — supporta autenticazione, IPv6, UDP e risoluzione DNS remota (
socks5hnello schema dell’URL). Per lo scraping è preferibile, perché il DNS non trapela.
Regola pratica: se sei indeciso tra i due, prendi SOCKS5 (e nel codice usa lo schema
socks5h://, così il DNS viene risolto attraverso il proxy).
Classificazione per origine dell’IP
Molto più importante del protocollo è da dove proviene l’indirizzo IP. È proprio questo a determinare quanto sembri «umano» agli occhi dei sistemi anti-bot.
Proxy datacenter
Gli IP appartengono a provider di hosting e data center (AWS, OVH, Hetzner ecc.).
- ➕ Economici, molto veloci, disponibili a migliaia.
- ➖ Facili da rilevare: i sistemi anti-bot mantengono database delle sottoreti dei data center. Molti siti bloccano questi IP in via preventiva.
- Adatti allo scraping di siti «tolleranti», senza protezioni serie.
Proxy residenziali (residential)
IP di utenti domestici reali, assegnati dai provider internet (ISP). Il traffico passa attraverso i dispositivi di persone in carne e ossa (spesso tramite reti P2P o SDK integrati nelle app).
- ➕ Sembrano utenti normali: distinguerli dal traffico reale è difficile.
- ➖ Più cari, più lenti, a volte instabili.
- Adatti ai siti con protezioni serie (marketplace, social network, motori di ricerca).
Proxy mobili (mobile)
IP degli operatori mobili (3G/4G/5G). La particolarità: gli operatori usano il CGNAT: dietro uno stesso IP ci sono centinaia di abbonati reali.
- ➕ Il livello di fiducia più alto: bannare un IP del genere = bannare un mucchio di persone reali, quindi i siti vanno cauti.
- ➖ I più costosi; velocità e stabilità inferiori.
- Si usano dove tutto il resto viene bannato all’istante.
Proxy ISP (static residential)
Un ibrido: gli IP appartengono formalmente a un provider internet (come i residenziali), ma sono ospitati fisicamente in un data center (come i proxy datacenter).
- ➕ Velocità da data center + reputazione da provider. Sono statici (non cambiano), il che è comodo per le sessioni lunghe.
- ➖ Più cari dei datacenter.
Confronto rapido per «discrezione» e prezzo:
Datacenter → ISP → Residenziali → Mobili
più economici/ più cari/
più visibili più discretiIPv4 vs IPv6
Lo spazio di indirizzi IPv4 è esaurito: gli indirizzi sono pochi e costosi. IPv6 è praticamente infinito, per questo i proxy IPv6 costano nettamente meno.
Ma c’è un’insidia: i proxy IPv6 funzionano solo se il sito di destinazione supporta IPv6. Molti grandi siti sono ancora solo su IPv4 — in quel caso un proxy IPv6 semplicemente non riuscirà a connettersi.
| IPv4 | IPv6 | |
|---|---|---|
| Disponibilità di indirizzi | Scarsità | Praticamente infinita |
| Prezzo del proxy | Più alto | Più basso |
| Compatibilità con i siti | Quasi ovunque | Solo se il sito supporta IPv6 |
| Rilevamento | IPv4 è più «familiare» agli anti-bot | Le enormi sottoreti di uno stesso provider si bannano più facilmente a blocchi interi |
Conclusione: IPv6 conviene per prezzo nello scraping di siti che di sicuro supportano IPv6 (Google, molti servizi internazionali). Per tutto il resto, e per la massima compatibilità — IPv4.
Livelli di privacy (anonimato) dei proxy
Un proxy può «tradirti» in vari modi, aggiungendo alla richiesta intestazioni HTTP di servizio. In base a ciò che viene trasmesso si distinguono tre livelli.
1. Transparent (trasparente)
Trasmette il tuo IP reale nelle intestazioni e dichiara apertamente di essere un proxy.
Via: 1.1 proxy
X-Forwarded-For: IL_TUO_IP_REALEPer lo scraping è inutile: il sito vede sia il fatto che usi un proxy sia te. Proxy di questo tipo si trovano spesso nelle reti aziendali o pubbliche per il caching.
2. Anonymous (anonimo)
Nasconde il tuo IP reale, ma non nasconde il fatto stesso che stai usando un proxy.
Via: 1.1 proxy
X-Forwarded-For: IP_DEL_PROXY (o assente, ma Via tradisce il proxy)L’IP reale è protetto, ma il sistema anti-bot vede l’etichetta «questo è un proxy» e può insospettirsi.
3. Elite / High Anonymous (elite)
Non trasmette né il tuo IP né segnali della presenza di un proxy. La richiesta sembra fatta in connessione diretta.
(niente Via, X-Forwarded-For, X-Real-IP, Proxy-Connection)Perché alcuni proxy trasmettono questi dati e altri no? È questione di configurazione del server proxy stesso. Quelli trasparenti aggiungono X-Forwarded-For di proposito, perché il server di destinazione conosca il client originario (così sono stati concepiti i proxy di caching e aziendali). Quelli elite sono configurati per ripulire tutte queste intestazioni. Le intestazioni che tradiscono un proxy: Via, X-Forwarded-For, X-Real-IP, Forwarded, Proxy-Connection, X-Proxy-ID.
Per lo scraping servono solo proxy elite. Anonymous (a tuo rischio e pericolo; transparent) mai.
Rotazione: proxy statici e a rotazione
- Statici (sticky): lo stesso IP resta attivo a lungo. Servono dove è necessaria una sessione (login, carrello), perché il sito non ti «perda» al cambio di IP.
- A rotazione (rotating): l’IP cambia automaticamente: a ogni richiesta o ogni N minuti. Ideali per la raccolta massiva in cui la sessione non conta. Spesso il provider fornisce un unico endpoint «gateway» e fa la rotazione dal suo lato, su un pool di migliaia di indirizzi.
TOR come proxy gratuito
TOR (The Onion Router) è una rete anonima in cui il traffico attraversa una catena di tre nodi: di ingresso (guard/entry), intermedio (middle) e di uscita (exit). Ogni strato di cifratura viene rimosso al nodo corrispondente — da qui l’instradamento «a cipolla». In locale TOR avvia un proxy SOCKS5 (porta 9050 di default) a cui puoi collegare lo scraper.
Sì, anche in TOR si possono scegliere la geografia e i nodi. Tramite il file di configurazione torrc puoi controllare da quali paesi uscire su internet:
# Uscire solo attraverso nodi di questi paesi
ExitNodes {us},{de},{nl}
StrictNodes 1
# Si possono fissare i nodi di ingresso/uscita per paese
EntryNodes {de}
ExcludeNodes {ru},{cn}
ExcludeExitNodes {ru}I codici paese vanno tra parentesi graffe, secondo lo standard ISO ({us}, {de}, {fr}). StrictNodes 1 vieta di uscire dall’elenco indicato. Per cambiare circuito (ottenere un nuovo IP di uscita) basta inviare il segnale NEWNYM alla porta di controllo.
Svantaggi di TOR per lo scraping:
- Lento: tre salti più la congestione della rete.
- Nodi di uscita nelle liste nere: l’elenco dei nodi di uscita è pubblico, e molti siti bloccano tutto TOR in via preventiva.
- Pool di IP piccolo: i nodi di uscita si contano a migliaia, non a milioni come nei provider residenziali. La rotazione è limitata.
- Va bene per attività una tantum ed esperimenti, ma non per lo scraping industriale.
Liste di proxy gratuiti
Internet è pieno di siti con liste di proxy gratuiti (free proxy lists): migliaia di coppie IP:porta scaricabili all’istante. Suona allettante, ma la qualità è sistematicamente scarsa:
- La maggior parte è già morta nel momento in cui li scarichi: ne sopravvive, se va bene, il 5–20%.
- Lenti e instabili: a volte rispondono, a volte no.
- Spesso trasparenti: fanno trapelare il tuo IP.
- Già nelle liste nere — li hanno usati migliaia di persone prima di te, e i siti seri li hanno bannati da tempo.
- Rischio per la sicurezza — non si sa chi gestisce il proxy; potrebbe intercettare o alterare il traffico (particolarmente pericoloso con HTTP non cifrato e quando trasmetti credenziali).
Conclusione: i proxy gratuiti vanno bene per imparare e per esperimenti usa e getta, ma qualsiasi scraping serio o commerciale richiede proxy a pagamento. Proprio per questo ogni proxy pubblico va assolutamente verificato prima dell’uso (vedi sotto).
Verifica (checking) dei proxy
Un proxy non si può prendere e usare così com’è, soprattutto se viene da liste pubbliche. Bisogna verificarli, perché «muoiono» di continuo, rallentano e cambiano comportamento. Che cosa si controlla:
- Se è vivo — se risponde e con quale codice.
- Velocità / latenza — il tempo di risposta (ping, tempo al primo byte). I lenti si scartano.
- Livello di anonimato — se fa trapelare il tuo IP reale. Si verifica con una richiesta a un servizio di echo (per esempio un endpoint che restituisce il tuo IP e le tue intestazioni), controllando se compaiono
X-Forwarded-ForoVia. - Geolocalizzazione reale — un IP può dichiararsi «tedesco» e trovarsi in realtà in un altro paese. Si controlla su un database GeoIP.
- Tipo/reputazione — se è nelle liste nere o marcato come datacenter/proxy (tramite servizi di fraud score).
- Supporto di HTTPS — se il
CONNECTpassa e il TLS non si rompe.
Il checker più semplice in Python: proviamo a raggiungere un servizio di echo attraverso il proxy e guardiamo che cosa torna indietro:
import requests
def check_proxy(proxy: str, timeout: int = 8):
proxies = {"http": proxy, "https": proxy}
try:
r = requests.get("https://httpbin.org/get",
proxies=proxies, timeout=timeout)
data = r.json()
origin_ip = data.get("origin")
headers = data.get("headers", {})
leaked = any(h in headers for h in
("X-Forwarded-For", "Via", "X-Real-Ip"))
return {
"ok": True,
"ip": origin_ip,
"anonymous": not leaked, # True = l'IP reale non è trapelato
"latency": r.elapsed.total_seconds(),
}
except Exception as e:
return {"ok": False, "error": str(e)}
print(check_proxy("http://user:pass@1.2.3.4:8080"))Come i proxy influiscono sul rilevamento nello scraping
Da solo, il proxy non è un «mantello dell’invisibilità». I sistemi anti-bot (Cloudflare, DataDome, PerimeterX/HUMAN, Akamai) osservano una moltitudine di segnali, e l’IP è solo uno di questi.
Che cosa tradisce uno scraper sul fronte IP:
- Il tipo di IP. Le sottoreti dei data center sono note e vengono etichettate come «non umane». I residenziali e i mobili ispirano più fiducia. È il fattore principale su cui incide la scelta del proxy.
- La reputazione dell’IP (fraud score). La storia dell’indirizzo: spam, botnet, ban precedenti. Un IP «sporco» si fa notare anche se è residenziale.
- La frequenza delle richieste da uno stesso IP (rate limiting). Troppe richieste al secondo = ban. Un pool di proxy con rotazione spalma il carico e riduce la frequenza su ogni indirizzo.
- La distribuzione geografica. Se «uno stesso utente» in un minuto salta dagli Stati Uniti al Brasile e ritorno — è chiaramente un bot. Per questo, all’interno di una stessa sessione conviene mantenere l’IP stabile.
- L’ASN. Il numero di sistema autonomo rivela a chi appartiene l’IP (a un hosting o a un provider reale).
Che cosa i proxy NON coprono (e perché un proxy da solo non basta):
- Il fingerprint TLS/JA3 — l’impronta del tuo handshake TLS. Quella di
requests/curlnon assomiglia a quella di un browser, e si vede attraverso qualsiasi proxy. - Le intestazioni HTTP e il loro ordine — uno
User-Agentstorto o non standard, l’assenza delle consuete intestazioni da browser. - Il fingerprint del browser — Canvas, WebGL, font, ambiente JS (rilevante per i browser headless).
- Il comportamento — pattern di clic e navigazione troppo veloci, troppo regolari, «non umani».
Conclusione: un proxy di qualità (residenziale o mobile, elite, con buona reputazione) riduce drasticamente il rilevamento via IP, ma va combinato con intestazioni corrette, un fingerprint realistico e una velocità di richieste ragionevole. Il proxy è condizione necessaria, ma non sufficiente.
Tariffe: che cosa paghi esattamente
I provider fanno pagare in modi diversi, e dal modello dipende che cosa conviene per il tuo caso.
- A traffico (per GB). Paghi i gigabyte di dati transitati; il pool di IP è enorme e «gratuito». Tipico di residenziali e mobili. Pericoloso quando fai scraping di pagine «pesanti» con immagini o video: il conto sale in fretta. Per risparmiare: scaricare solo l’HTML e bloccare il caricamento dei file multimediali.
- A numero di IP (per IP). Paghi indirizzi specifici (per esempio 100 proxy statici datacenter o ISP) con traffico illimitato. Conveniente con grandi volumi di dati e IP stabili.
- A porte/thread (per port / per thread). Paghi il numero di connessioni simultanee, non il volume. Frequente nei proxy mobili.
- A richieste (per request) o in abbonamento. Tipico delle scraping API chiavi in mano, in cui il provider gestisce i proxy al posto tuo e restituisce l’HTML già pronto.
Come scegliere: tante piccole richieste a pagine leggere → meglio per GB o per request; travaso di grandi volumi → meglio per IP con traffico illimitato.
Esempi di codice: connessione a un proxy in vari linguaggi
Il formato della stringa proxy è quasi universale: schema://utente:password@host:porta, per esempio http://user:pass@1.2.3.4:8080.
Python — requests (sincrono)
import requests
proxies = {
"http": "http://user:pass@1.2.3.4:8080",
"https": "http://user:pass@1.2.3.4:8080",
}
r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
print(r.json())
# SOCKS5 con DNS remoto (serve il pacchetto: pip install requests[socks])
socks = {"http": "socks5h://user:pass@1.2.3.4:1080",
"https": "socks5h://user:pass@1.2.3.4:1080"}
print(requests.get("https://httpbin.org/ip", proxies=socks).json())Python — httpx (asincrono, con rotazione)
import asyncio, httpx, random
POOL = [
"http://user:pass@1.2.3.4:8080",
"http://user:pass@5.6.7.8:8080",
]
async def fetch(url):
proxy = random.choice(POOL) # IP casuale dal pool a ogni richiesta
async with httpx.AsyncClient(proxy=proxy, timeout=10) as client:
resp = await client.get(url)
return resp.status_code, resp.text[:80]
async def main():
tasks = [fetch("https://httpbin.org/ip") for _ in range(5)]
for code, body in await asyncio.gather(*tasks):
print(code, body)
asyncio.run(main())Python — TOR (SOCKS5 + cambio di circuito)
import requests
from stem import Signal
from stem.control import Controller
proxies = {"http": "socks5h://127.0.0.1:9050",
"https": "socks5h://127.0.0.1:9050"}
print(requests.get("https://httpbin.org/ip", proxies=proxies).json())
# Richiedere un nuovo IP di uscita (un nuovo circuito)
with Controller.from_port(port=9051) as c:
c.authenticate(password="la_tua_password")
c.signal(Signal.NEWNYM)Node.js — axios + HttpsProxyAgent
const axios = require("axios");
const { HttpsProxyAgent } = require("https-proxy-agent");
const agent = new HttpsProxyAgent("http://user:pass@1.2.3.4:8080");
axios.get("https://httpbin.org/ip", { httpsAgent: agent, httpAgent: agent })
.then(res => console.log(res.data))
.catch(err => console.error(err.message));Node.js — SOCKS5
const axios = require("axios");
const { SocksProxyAgent } = require("socks-proxy-agent");
// socks5h:// — il DNS viene risolto sul lato del proxy
const agent = new SocksProxyAgent("socks5h://user:pass@1.2.3.4:1080");
axios.get("https://httpbin.org/ip", { httpAgent: agent, httpsAgent: agent })
.then(res => console.log(res.data));Node.js — Puppeteer (browser headless tramite proxy)
const puppeteer = require("puppeteer");
(async () => {
const browser = await puppeteer.launch({
args: ["--proxy-server=http://1.2.3.4:8080"],
});
const page = await browser.newPage();
// autenticazione sul proxy, se serve
await page.authenticate({ username: "user", password: "pass" });
await page.goto("https://httpbin.org/ip");
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();
})();Go — net/http
package main
import (
"fmt"
"io"
"net/http"
"net/url"
)
func main() {
proxyURL, _ := url.Parse("http://user:pass@1.2.3.4:8080")
client := &http.Client{
Transport: &http.Transport{Proxy: http.ProxyURL(proxyURL)},
}
resp, err := client.Get("https://httpbin.org/ip")
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}PHP — cURL
<?php
$ch = curl_init("https://httpbin.org/ip");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_PROXY => "1.2.3.4:8080",
CURLOPT_PROXYUSERPWD => "user:pass",
CURLOPT_PROXYTYPE => CURLPROXY_HTTP, // o CURLPROXY_SOCKS5_HOSTNAME
CURLOPT_TIMEOUT => 10,
]);
echo curl_exec($ch);
curl_close($ch);cURL dalla riga di comando
# Proxy HTTP
curl -x http://user:pass@1.2.3.4:8080 https://httpbin.org/ip
# SOCKS5 con DNS remoto
curl --proxy socks5h://user:pass@1.2.3.4:1080 https://httpbin.org/ipChecklist finale per scegliere il proxy per lo scraping
| Attività | Raccomandazione |
|---|---|
| Siti leggeri senza protezione | Proxy datacenter, IPv4 |
| Siti con anti-bot (marketplace, motori di ricerca) | Residenziali, elite, con rotazione |
| Siti blindati / social network | Proxy mobili |
| Serve una sessione (login, carrello) | Statici (sticky) ISP/residenziali |
| Solo siti con IPv6, risparmio | Proxy IPv6 |
| Esperimento una tantum / studio | TOR o liste gratuite (con verifica) |
| Il DNS non deve trapelare | SOCKS5 con schema socks5h:// |
Regole principali:
- Scegli l’anonimato elite — nessuna fuga di
X-Forwarded-For/Via. - Verifica sempre qualsiasi proxy pubblico o gratuito prima di mandarlo in campo.
- Per i siti protetti — residenziali o mobili, non datacenter.
- I proxy coprono il rilevamento via IP, ma non via fingerprint: combinali con intestazioni corrette e una velocità di richieste ragionevole.
- Calcola la tariffa in base al tuo caso: tante richieste leggere → per GB/per request; grandi volumi → per IP.