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.