Tecnologie e protezioni 14 min di lettura

Proxy per il web scraping: guida completa a tipi, privacy e rilevamento

Guida ai proxy per il web scraping: datacenter, residenziali e mobili, rotazione, verifica della privacy e protezione dal rilevamento.

TW
Team Web-Scraping.it
Raccolta dati per le esigenze del business
Pubblicato il 25 aprile 2025

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:

  1. Nascondere l’IP reale: diventa più difficile identificarti e bannarti personalmente.
  2. Distribuire il carico: un pool di centinaia di IP permette di inviare molte richieste senza superare i limiti di ogni singolo indirizzo.
  3. 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 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 (socks5h nello 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:

code
Datacenter   →  ISP   →  Residenziali  →  Mobili
più economici/                      più cari/
più visibili                        più discreti

IPv4 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.

code
Via: 1.1 proxy
X-Forwarded-For: IL_TUO_IP_REALE

Per 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.

code
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.

code
(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:

code
# 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:

  1. Se è vivo — se risponde e con quale codice.
  2. Velocità / latenza — il tempo di risposta (ping, tempo al primo byte). I lenti si scartano.
  3. 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-For o Via.
  4. Geolocalizzazione reale — un IP può dichiararsi «tedesco» e trovarsi in realtà in un altro paese. Si controlla su un database GeoIP.
  5. Tipo/reputazione — se è nelle liste nere o marcato come datacenter/proxy (tramite servizi di fraud score).
  6. Supporto di HTTPS — se il CONNECT passa 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:

python
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/curl non assomiglia a quella di un browser, e si vede attraverso qualsiasi proxy.
  • Le intestazioni HTTP e il loro ordine — uno User-Agent storto 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)

python
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)

python
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)

python
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

javascript
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

javascript
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)

javascript
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

go
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
<?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

bash
# 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/ip

Checklist 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:

  1. Scegli l’anonimato elite — nessuna fuga di X-Forwarded-For/Via.
  2. Verifica sempre qualsiasi proxy pubblico o gratuito prima di mandarlo in campo.
  3. Per i siti protetti — residenziali o mobili, non datacenter.
  4. I proxy coprono il rilevamento via IP, ma non via fingerprint: combinali con intestazioni corrette e una velocità di richieste ragionevole.
  5. Calcola la tariffa in base al tuo caso: tante richieste leggere → per GB/per request; grandi volumi → per IP.