Socks5Proxy

Configurazione proxy in Selenium, collegare proxy SOCKS5 e HTTP a Chrome e Firefox

Questa guida spiega come collegare i proxy HTTP e SOCKS5 di Socks5Proxy a Selenium 4 per Chrome e Firefox, e come usare l'autorizzazione IP perché Chrome non accetta password proxy negli argomenti di avvio.

Perché l'autenticazione proxy è difficile in Selenium?

Chrome accetta l'indirizzo del proxy tramite l'argomento --proxy-server, ma non accetta username e password all'interno dell'indirizzo. Se ci si connette a un proxy che richiede username e password, il browser mostra una finestra di autenticazione, che è difficile da gestire con Selenium.

La soluzione più pulita è l'autorizzazione IP. Registrando l'IPv4 del server o PC che esegue Selenium nella dashboard, il proxy accetterà connessioni da quell'IP senza username e password. In Chrome basta inserire ip:porta. Puoi registrare fino a 10 IP per usarli su più server.

L'esempio usa IP 198.51.100.23, porta HTTP 8000 e porta SOCKS5 1080.

pip install selenium

Come si collega un proxy HTTP a Chrome?

Dopo aver registrato l'autorizzazione IP, aggiungi l'indirizzo come argomento --proxy-server in ChromeOptions. Selenium 4.6 e versioni successive utilizzano Selenium Manager per scaricare automaticamente il chromedriver corretto, quindi non è necessario installarlo separatamente.

Anche in modalità headless vengono applicati gli stessi parametri. Per verificare la connessione, apri l'indirizzo di verifica IP e controlla se l'IP visualizzato è quello del proxy.

from selenium import webdriver
from selenium.webdriver.common.by import By

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")  # this machine's IP is authorized in the dashboard
opts.add_argument("--headless=new")

driver = webdriver.Chrome(options=opts)
try:
    driver.get("https://api.ipify.org")
    print(driver.find_element(By.TAG_NAME, "body").text)  # should print the proxy IP
finally:
    driver.quit()

Come si usa un proxy SOCKS5 su Chrome?

Inserisci l'indirizzo socks5:// in --proxy-server. Chrome utilizza il proxy per la risoluzione dei nomi di dominio con SOCKS5, ma in alcuni ambienti potrebbe rimanere una risoluzione DNS interna. Per bloccare la risoluzione dei nomi locali, è comune utilizzare l'argomento --host-resolver-rules.

Anche SOCKS5 si connette con autorizzazione IP. Questo perché Chrome non supporta l'autenticazione con username e password per i proxy SOCKS.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=socks5://198.51.100.23:1080")
# make sure host names are resolved through the proxy
opts.add_argument('--host-resolver-rules=MAP * ~NOTFOUND , EXCLUDE 198.51.100.23')

driver = webdriver.Chrome(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

Come ci si connette a Firefox?

Firefox specifica il proxy tramite preferenze. Imposta network.proxy.type a 1 (manuale) e inserisci l'indirizzo e la porta HTTP o SOCKS. Per SOCKS5, imposta network.proxy.socks_version a 5 e network.proxy.socks_remote_dns a True per risolvere i nomi tramite il proxy.

Anche Firefox non permette di inserire la password del proxy tramite impostazioni di avvio, quindi l'autorizzazione IP è la soluzione più semplice.

from selenium import webdriver

opts = webdriver.FirefoxOptions()
opts.set_preference("network.proxy.type", 1)
opts.set_preference("network.proxy.socks", "198.51.100.23")
opts.set_preference("network.proxy.socks_port", 1080)
opts.set_preference("network.proxy.socks_version", 5)
opts.set_preference("network.proxy.socks_remote_dns", True)

driver = webdriver.Firefox(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

Come aprire più browser con IP diversi contemporaneamente?

Assegna indirizzi proxy diversi a ciascun browser ed eseguili separatamente. Il codice seguente è un esempio che riceve un elenco ip:port dall'API e apre tre browser con IP diversi. Poiché un browser consuma molta memoria, imposta il numero di browser da eseguire contemporaneamente in base alle dimensioni del server.

Per attività che richiedono un uso prolungato del browser, come una sessione di accesso, è consigliabile mantenere lo stesso IP fino al completamento dell'operazione.

import requests
from selenium import webdriver

KEY = "YOUR_API_KEY"
lines = requests.get(
    "https://socks5proxy.io/api/v1/proxies/download",
    params={"format": "ip:port", "protocol": "http"},
    headers={"Authorization": "Bearer " + KEY},
    timeout=30,
).text.split()

drivers = []
for line in lines[:3]:
    opts = webdriver.ChromeOptions()
    opts.add_argument("--headless=new")
    opts.add_argument("--proxy-server=http://" + line)
    drivers.append(webdriver.Chrome(options=opts))

for d in drivers:
    d.get("https://api.ipify.org")
    print(d.page_source)
    d.quit()

Se devi usare l'autenticazione username/password?

Se non puoi utilizzare l'autorizzazione IP, ad esempio in un ambiente in cui l'IP in uscita cambia continuamente, ci sono due metodi. Il primo è utilizzare una libreria proxy intermedia come selenium-wire per inserire le informazioni di autenticazione al posto tuo. Il secondo è eseguire un proxy di relay locale senza autenticazione sullo stesso server, in modo che Chrome si connetta all'indirizzo locale e il relay locale si connetta a Socks5Proxy con username e password.

Entrambi i metodi aggiungono un elemento in più da gestire. Se possibile, utilizzare l'autorizzazione IP su un server con IP fisso è il modo più semplice e veloce.

Cosa devo configurare per adattare l'ambiente del browser al paese?

Modifica l'argomento --lang di Chrome e l'impostazione Accept-Language in base al paese dell'IP per aprire la pagina nella lingua di quel paese. Per i siti in cui il fuso orario è importante, puoi anche impostare il fuso orario con il comando CDP Emulation.setTimezoneOverride.

Imposta la dimensione della finestra con l'argomento --window-size e, se hai bisogno di uno schermo mobile, usa le impostazioni di emulazione del dispositivo mobile. Creando questi valori come un set di configurazioni per paese, puoi eseguire gli stessi test in modo uniforme in diversi paesi.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")
opts.add_argument("--lang=de-DE")
opts.add_argument("--window-size=1366,900")

driver = webdriver.Chrome(options=opts)
driver.execute_cdp_cmd("Emulation.setTimezoneOverride", {"timezoneId": "Europe/Berlin"})
driver.get("https://example.com/")
driver.quit()

Le stesse impostazioni funzionano anche con Selenium Grid o browser remoti?

Sì. ChromeOptions e FirefoxOptions funzionano anche in esecuzione remota. Passando le stesse opzioni a webdriver.Remote, il browser nel nodo Grid si connetterà tramite quel proxy. L'IP da registrare per l'autorizzazione IP è l'IP in uscita del nodo Grid dove il browser è effettivamente eseguito, non il PC che esegue il codice.

Se hai più nodi, registra tutti gli IP di ciascun nodo. Puoi registrarne fino a 10. Se i tuoi nodi cloud cambiano spesso, assegnare un IP fisso semplifica la gestione.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")  # authorize the Grid node IP, not this machine
driver = webdriver.Remote(command_executor="http://grid.example.internal:4444", options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

Cosa controllare quando la connessione non funziona?

ERR_PROXY_CONNECTION_FAILED spesso indica un indirizzo o una porta errati. Verifica di non aver inserito una porta SOCKS5 in un indirizzo HTTP. Se appare ERR_TUNNEL_CONNECTION_FAILED o una finestra di autenticazione, l'IP registrato per l'autorizzazione IP potrebbe non corrispondere all'IP effettivo. Utilizza cURL sul server per aprire api.ipify.org senza proxy e registra l'IP visualizzato.

I server cloud possono cambiare IP quando vengono riavviati. Usa un IP fisso o aggiorna la lista registrata nel dashboard quando l'IP cambia.

Configurazione proxy in Selenium, come collegare Chrome e Firefox | Socks5Proxy