Torna al blog

Impostazione del proxy in Selenium WebDriver: guida completa con esempi di codice per Python e Java

Guida dettagliata all'integrazione dei proxy in Selenium WebDriver con esempi di codice in Python e Java per Chrome e Firefox.

📅13 febbraio 2026
```html

Selenium WebDriver è uno degli strumenti più popolari per l'automazione del browser e il scraping dei dati. Quando si lavora con grandi volumi di richieste o quando è necessario aggirare le restrizioni geografiche, è fondamentale configurare correttamente il proxy. In questa guida esamineremo tutti i modi per integrare il proxy in Selenium per diversi browser e linguaggi di programmazione, oltre a risolvere i problemi comuni che gli sviluppatori affrontano.

Perché utilizzare i proxy in Selenium

Durante l'automazione del web scraping o dei test tramite Selenium, sorgono diverse problematiche che non possono essere risolte senza proxy:

  • Elusione del rate limiting — molti siti limitano il numero di richieste da un singolo indirizzo IP. Senza proxy, il tuo script verrà rapidamente bloccato dopo 50-100 richieste.
  • Restrizioni geografiche — se è necessario estrarre contenuti disponibili solo da un determinato paese, un proxy con IP della geolocalizzazione desiderata risolve questo problema.
  • Distribuzione del carico — durante il scraping massivo di dati, la rotazione degli indirizzi IP tramite proxy consente di distribuire le richieste ed evitare il rilevamento dei bot.
  • Test di localizzazione — per verificare come il sito viene visualizzato dagli utenti di diversi paesi, sono necessari proxy delle regioni corrispondenti.
  • Elusione dei sistemi anti-bot — le moderne protezioni (Cloudflare, DataDome) analizzano la reputazione degli IP. Proxy di alta qualità aiutano a sembrare un utente normale.

Senza una corretta configurazione del proxy, il tuo script Selenium funzionerà in modo instabile: riceverà CAPTCHA, ban temporanei o un blocco totale dell'accesso. Questo è particolarmente critico quando si esegue il scraping di piattaforme di e-commerce, social media o siti con protezioni aggressive contro i bot.

Quali tipi di proxy utilizzare

La scelta del tipo di proxy dipende dal compito. Per l'automazione in Selenium si utilizzano tre tipi principali di proxy, ognuno con i propri vantaggi:

Tipo di proxy Velocità Anonimato Migliori scenari
Proxy dei data center Molto alta (100+ Mbps) Media Scraping di dati pubblici, test delle prestazioni, controlli massivi
Proxy residenziali Media (10-50 Mbps) Molto alta Elusione dei sistemi anti-bot, scraping di social media, e-commerce, siti con protezioni rigide
Proxy mobili Media (5-30 Mbps) Massima Lavorare con versioni mobili dei siti, social media, applicazioni con verifica degli IP mobili

Raccomandazioni per la scelta:

  • Per il scraping di siti di notizie, API aperti, cataloghi semplici — vanno bene i proxy dei data center. Sono più economici e veloci.
  • Per lavorare con Amazon, eBay, Google, social media — solo proxy residenziali. Queste piattaforme bloccano attivamente gli IP dei data center.
  • Per emulare utenti mobili o lavorare con Instagram, TikTok — i proxy mobili sono indispensabili.
  • Per testare la geolocalizzazione — scegli proxy con possibilità di selezionare un paese e una città specifici.

Configurazione del proxy per Chrome in Selenium

Chrome WebDriver è la scelta più popolare per l'automazione in Selenium. La configurazione del proxy viene eseguita tramite l'oggetto ChromeOptions. Esaminiamo alcuni metodi.

Metodo 1: Proxy HTTP/HTTPS senza autenticazione (Python)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# Configurazione del proxy
PROXY = "123.45.67.89:8080"  # Sostituisci con il tuo server proxy

chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{PROXY}')

# Opzioni aggiuntive per stabilità
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

# Avvio del driver
driver = webdriver.Chrome(options=chrome_options)

# Verifica IP
driver.get('https://httpbin.org/ip')
print(driver.page_source)

driver.quit()

Metodo 2: Proxy SOCKS5 (Python)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

PROXY = "123.45.67.89:1080"

chrome_options = Options()
# Per SOCKS5 specificare esplicitamente il protocollo
chrome_options.add_argument(f'--proxy-server=socks5://{PROXY}')

driver = webdriver.Chrome(options=chrome_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()

Importante: Chrome supporta proxy HTTP, HTTPS e SOCKS5. Per SOCKS4 sono necessarie configurazioni aggiuntive o l'uso di estensioni.

Configurazione del proxy per Chrome in Java

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.Proxy;

public class ChromeProxyExample {
    public static void main(String[] args) {
        // Configurazione del proxy
        Proxy proxy = new Proxy();
        proxy.setHttpProxy("123.45.67.89:8080");
        proxy.setSslProxy("123.45.67.89:8080");
        
        ChromeOptions options = new ChromeOptions();
        options.setProxy(proxy);
        options.addArguments("--no-sandbox");
        
        WebDriver driver = new ChromeDriver(options);
        driver.get("https://httpbin.org/ip");
        
        System.out.println(driver.getPageSource());
        driver.quit();
    }
}

Configurazione del proxy per Firefox in Selenium

Firefox WebDriver utilizza un approccio diverso per configurare il proxy tramite il profilo del browser. Questo offre maggiore flessibilità, ma richiede una comprensione delle opzioni di configurazione.

Proxy HTTP/HTTPS per Firefox (Python)

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080

firefox_options = Options()

# Configurazione del proxy tramite preferences
firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.http", PROXY_HOST)
firefox_options.set_preference("network.proxy.http_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.ssl", PROXY_HOST)
firefox_options.set_preference("network.proxy.ssl_port", PROXY_PORT)

# Disabilitazione del proxy per indirizzi locali
firefox_options.set_preference("network.proxy.no_proxies_on", "localhost,127.0.0.1")

driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()

Proxy SOCKS5 per Firefox (Python)

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

PROXY_HOST = "123.45.67.89"
PROXY_PORT = 1080

firefox_options = Options()

firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.socks", PROXY_HOST)
firefox_options.set_preference("network.proxy.socks_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.socks_version", 5)

# Per SOCKS5 con DNS tramite proxy
firefox_options.set_preference("network.proxy.socks_remote_dns", True)

driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()

Vantaggio di Firefox: l'opzione network.proxy.socks_remote_dns consente di eseguire richieste DNS tramite il proxy, aumentando l'anonimato e aiutando a superare i blocchi a livello DNS.

Lavorare con proxy che richiedono autenticazione

La maggior parte dei servizi proxy di alta qualità utilizza l'autenticazione tramite nome utente e password. Selenium non supporta la trasmissione delle credenziali direttamente nell'URL del proxy per Chrome, quindi sono necessarie soluzioni alternative.

Metodo 1: Estensione di Chrome per l'autenticazione (raccomandato)

Creiamo un'estensione temporanea di Chrome che inserisce automaticamente nome utente e password quando ci si connette al proxy:

import os
import zipfile
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080
PROXY_USER = "username"
PROXY_PASS = "password"

# Creazione del manifesto dell'estensione
manifest_json = """
{
    "version": "1.0.0",
    "manifest_version": 2,
    "name": "Chrome Proxy",
    "permissions": [
        "proxy",
        "tabs",
        "unlimitedStorage",
        "storage",
        "webRequest",
        "webRequestBlocking"
    ],
    "background": {
        "scripts": ["background.js"]
    }
}
"""

# Script per l'autenticazione
background_js = """
var config = {
    mode: "fixed_servers",
    rules: {
        singleProxy: {
            scheme: "http",
            host: "%s",
            port: parseInt(%s)
        },
        bypassList: ["localhost"]
    }
};

chrome.proxy.settings.set({value: config, scope: "regular"}, function() {});

function callbackFn(details) {
    return {
        authCredentials: {
            username: "%s",
            password: "%s"
        }
    };
}

chrome.webRequest.onAuthRequired.addListener(
    callbackFn,
    {urls: [""]},
    ['blocking']
);
""" % (PROXY_HOST, PROXY_PORT, PROXY_USER, PROXY_PASS)

# Creazione dell'estensione
plugin_path = 'proxy_auth_plugin.zip'
with zipfile.ZipFile(plugin_path, 'w') as zp:
    zp.writestr("manifest.json", manifest_json)
    zp.writestr("background.js", background_js)

# Avvio di Chrome con l'estensione
chrome_options = Options()
chrome_options.add_extension(plugin_path)

driver = webdriver.Chrome(options=chrome_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)

driver.quit()
os.remove(plugin_path)  # Rimozione del file temporaneo

Metodo 2: Firefox con autenticazione (più semplice)

Firefox consente di trasmettere le credenziali tramite le impostazioni del profilo:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options

PROXY_HOST = "123.45.67.89"
PROXY_PORT = 8080
PROXY_USER = "username"
PROXY_PASS = "password"

firefox_options = Options()

firefox_options.set_preference("network.proxy.type", 1)
firefox_options.set_preference("network.proxy.http", PROXY_HOST)
firefox_options.set_preference("network.proxy.http_port", PROXY_PORT)
firefox_options.set_preference("network.proxy.ssl", PROXY_HOST)
firefox_options.set_preference("network.proxy.ssl_port", PROXY_PORT)

# Autenticazione (non sempre funziona, dipende dalla versione di Firefox)
firefox_options.set_preference("network.proxy.username", PROXY_USER)
firefox_options.set_preference("network.proxy.password", PROXY_PASS)

# Disabilitazione della richiesta di autenticazione
firefox_options.set_preference("network.automatic-ntlm-auth.trusted-uris", PROXY_HOST)

driver = webdriver.Firefox(options=firefox_options)
driver.get('https://httpbin.org/ip')
print(driver.page_source)
driver.quit()

Nota: Se il tuo fornitore di proxy supporta la whitelist degli IP, è più semplice aggiungere l'IP del tuo server alla lista bianca e utilizzare il proxy senza autenticazione.

Rotazione dei proxy in Selenium

Durante lo scraping di grandi volumi di dati, è fondamentale cambiare i proxy per evitare blocchi. Esistono due approcci: rotazione a livello di codice e utilizzo di proxy rotanti.

Rotazione a livello di codice (creazione di un nuovo driver)

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import random

# Lista dei proxy
PROXY_LIST = [
    "123.45.67.89:8080",
    "98.76.54.32:8080",
    "11.22.33.44:8080",
]

def create_driver_with_proxy(proxy):
    """Creazione di un driver con il proxy specificato"""
    chrome_options = Options()
    chrome_options.add_argument(f'--proxy-server=http://{proxy}')
    chrome_options.add_argument('--no-sandbox')
    return webdriver.Chrome(options=chrome_options)

# Scraping con rotazione
urls_to_parse = [
    'https://example.com/page1',
    'https://example.com/page2',
    'https://example.com/page3',
]

for url in urls_to_parse:
    # Seleziona un proxy casuale
    current_proxy = random.choice(PROXY_LIST)
    
    # Crea un nuovo driver con il proxy
    driver = create_driver_with_proxy(current_proxy)
    
    try:
        driver.get(url)
        # La tua logica di scraping
        print(f"Scraped {url} tramite {current_proxy}")
        print(driver.title)
    except Exception as e:
        print(f"Errore con {current_proxy}: {e}")
    finally:
        driver.quit()  # Importante chiudere il driver

Utilizzo di proxy rotanti (più semplice)

Molti fornitori di proxy offrono un endpoint rotante: un URL che cambia automaticamente IP ad ogni richiesta o a intervalli specifici. Questo semplifica il codice:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

# Endpoint proxy rotante (l'IP cambia automaticamente)
ROTATING_PROXY = "rotating.proxycove.com:8080"

chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{ROTATING_PROXY}')

driver = webdriver.Chrome(options=chrome_options)

# Ogni richiesta sarà con un nuovo IP
urls = ['https://httpbin.org/ip'] * 5

for url in urls:
    driver.get(url)
    print(driver.find_element("tag name", "body").text)
    # Ogni output mostrerà un IP diverso

driver.quit()

Raccomandazione: per progetti di grandi dimensioni, utilizza proxy rotanti: risparmia risorse (non è necessario ricreare il driver) e semplifica il codice. I proxy residenziali di solito supportano la rotazione di default.

Errori comuni e loro soluzione

Errore: "ERR_PROXY_CONNECTION_FAILED"

Motivo: Selenium non riesce a connettersi al server proxy.

Soluzione:

  • Controlla la correttezza dell'IP e della porta del proxy
  • Assicurati che il proxy sia attivo (controlla tramite curl: curl -x http://123.45.67.89:8080 https://httpbin.org/ip)
  • Controlla il firewall — potrebbe bloccare le connessioni in uscita al proxy
  • Se utilizzi l'autenticazione, verifica la correttezza di nome utente/password

Errore: "ERR_TUNNEL_CONNECTION_FAILED"

Motivo: Problema con la connessione HTTPS tramite proxy.

Soluzione:

  • Assicurati che il proxy supporti HTTPS (metodo CONNECT)
  • Per i siti HTTPS, utilizza proxy HTTPS o SOCKS5
  • Aggiungi l'opzione per ignorare gli errori SSL: chrome_options.add_argument('--ignore-certificate-errors')

Errore: Il proxy funziona, ma il sito rileva il bot

Motivo: Il sito utilizza metodi avanzati di rilevamento (fingerprinting, analisi del comportamento).

Soluzione:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument(f'--proxy-server=http://{PROXY}')

# Disabilita il flag del webdriver (principale indicatore di automazione)
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)

driver = webdriver.Chrome(options=chrome_options)

# Rimozione di navigator.webdriver
driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {
    'source': '''
        Object.defineProperty(navigator, 'webdriver', {
            get: () => undefined
        })
    '''
})

driver.get('https://bot.sannysoft.com/')  # Sito per verificare il rilevamento

Si consiglia inoltre di utilizzare la libreria undetected-chromedriver, che applica automaticamente molte tecniche anti-rilevamento.

Problema: Lentezza nel caricamento delle pagine tramite proxy

Motivo: Il proxy è sovraccarico o si trova geograficamente lontano.

Soluzione:

  • Scegli proxy più vicini al server di destinazione (ad esempio, per lo scraping di siti statunitensi, utilizza proxy statunitensi)
  • Utilizza proxy dei data center per compiti in cui la velocità è più importante dell'anonimato
  • Configura i timeout in Selenium per evitare blocchi:
from selenium.webdriver.support.ui import WebDriverWait

driver.set_page_load_timeout(30)  # Massimo 30 secondi per il caricamento
driver.implicitly_wait(10)  # Attesa implicita per gli elementi

Best practices nell'uso dei proxy

1. Utilizza pool di proxy
Non fare affidamento su un singolo server proxy. Crea un pool di 10-50 proxy e ruotali. Se un proxy viene bloccato, lo scraping continuerà con un altro.

2. Aggiungi ritardi casuali
Anche con i proxy, richieste troppo veloci sembrano sospette. Aggiungi ritardi casuali di 2-5 secondi tra le richieste:

import time
import random

for url in urls:
    driver.get(url)
    # Scraping...
    time.sleep(random.uniform(2, 5))  # Ritardo casuale di 2-5 sec

3. Monitora la qualità dei proxy
Controlla i proxy prima di utilizzarli. Escludi dal pool quelli che non rispondono o restituiscono errori:

import requests

def check_proxy(proxy):
    """Controllo della funzionalità del proxy"""
    try:
        response = requests.get(
            'https://httpbin.org/ip',
            proxies={'http': f'http://{proxy}', 'https': f'http://{proxy}'},
            timeout=10
        )
        return response.status_code == 200
    except:
        return False

# Filtraggio dei proxy funzionanti
working_proxies = [p for p in PROXY_LIST if check_proxy(p)]
print(f"Proxy funzionanti: {len(working_proxies)}/{len(PROXY_LIST)}")

4. Usa la modalità headless con cautela
I browser headless sono più facili da rilevare. Per siti complessi, avvia il browser in modalità normale o utilizza --window-size invece di --headless.

5. Registra tutte le richieste
Salva informazioni su quale proxy è stato utilizzato per ogni richiesta. Questo aiuterà a identificare i proxy problematici e a risolvere gli errori.

6. Rispetta robots.txt e rate limits
Anche con i proxy, rispetta le regole del sito. Uno scraping aggressivo può portare al blocco di interi sotto-reti di proxy, danneggiando altri utenti.

Conclusione

Una corretta configurazione del proxy in Selenium WebDriver è la base per uno scraping e un'automazione stabili. Abbiamo esaminato tutti i principali modi per integrare il proxy per Chrome e Firefox, lavorare con l'autenticazione, la rotazione degli indirizzi IP e risolvere problemi comuni. La cosa principale è scegliere il tipo di proxy adatto al tuo compito: per uno scraping semplice, i proxy dei data center sono sufficienti, mentre per lavorare con piattaforme protette sono necessari proxy residenziali o mobili.

Ricorda le best practices: utilizza pool di proxy, aggiungi ritardi casuali, monitora la qualità delle connessioni e applica tecniche anti-rilevamento. Questo aumenterà la stabilità dei tuoi script e ridurrà il rischio di blocchi di decine di volte.

Se prevedi di automatizzare lo scraping con elevate esigenze di anonimato e elusione dei sistemi anti-bot, ti consigliamo di provare proxy residenziali — offrono la massima stabilità nel lavoro con qualsiasi sito, comprese le reti sociali, le piattaforme di e-commerce e i servizi con protezioni avanzate. Per compiti in cui la velocità di elaborazione di grandi volumi di dati è critica, i proxy dei data center saranno la scelta ottimale in termini di rapporto qualità-prezzo.

```