Senza KYC — niente documento, selfie o altri documenti. Paga in crypto: BTC, USDT, USDC, ETH, SOL, LTC
Lingua: Italiano
Inizia ora

Docs · Selenium 4 · Python

Selenium con proxy autenticato: un forwarder locale funzionante

Il flag proxy di Chrome non supporta password. Un piccolo forwarder locale su 127.0.0.1 aggiunge le credenziali, così Selenium vede sempre un proxy locale aperto.

Ultimo aggiornamento: · 4 minuti di lettura

Risposta rapida

Come usare un proxy con username e password in Selenium?

Esegui un piccolo forwarder locale che aggiunge l'intestazione Proxy-Authorization e punta Chrome verso di esso con --proxy-server=http://127.0.0.1:8899. Chrome ignora le credenziali in quel flag e Selenium non ha opzioni portabili per password proxy. CrawlRelay proxy residenziali funzionano così su gw.crawlrelay.com:7777, da 0,50 USD/GB. Pagati in crypto, senza KYC.

Configurazione Selenium in sintesi

Perché un forwarderIl flag --proxy-server di Chrome non accetta username né password
ForwarderAscolta su 127.0.0.1:8899, aggiunge Proxy-Authorization, rilancia a gw.crawlrelay.com:7777
Opzione Chrome--proxy-server=http://127.0.0.1:8899
RotazioneOgni nuovo tunnel CONNECT è una nuova connessione, quindi solitamente un'uscita diversa; aggiungi un ID sessione per un IP
Alternativa più semplicePlaywright prende direttamente nome utente e password

Come funziona il forwarder locale?

Accetta la richiesta proxy del browser, inserisce un header con le tue credenziali e poi copia i byte in entrambe le direzioni. Per un sito HTTPS il browser invia CONNECT host:443, il gateway risponde 200 Connection established, e TLS funziona end-to-end tra Chrome e il sito web. Il forwarder non vede mai il contenuto della pagina in chiaro.

Questa versione minimale gestisce siti HTTPS, dove ogni connessione gestisce un tunnel CONNECT. Copre quasi tutti i siti oggi. Mantienilo legato a 127.0.0.1 così nessun altro dispositivo può usare le tue credenziali.

forwarder.py (Python 3.8+, solo libreria standard)
import asyncio
import base64
import os

UPSTREAM = ("gw.crawlrelay.com", 7777)
USER = os.environ.get("CRAWLRELAY_USER", "USERNAME-country-us")
PASSWORD = os.environ.get("CRAWLRELAY_PASSWORD", "PASSWORD")
AUTH = b"Proxy-Authorization: Basic " + base64.b64encode(("%s:%s" % (USER, PASSWORD)).encode())


async def pipe(reader, writer):
    try:
        while True:
            data = await reader.read(65536)
            if not data:
                break
            writer.write(data)
            await writer.drain()
    except ConnectionError:
        pass
    finally:
        writer.close()


async def handle(client_reader, client_writer):
    try:
        head = await client_reader.readuntil(b"\r\n\r\n")  # request line and headers from the browser
    except asyncio.IncompleteReadError:
        client_writer.close()
        return
    lines = head.split(b"\r\n")
    lines.insert(1, AUTH)  # add the credentials right after the request line
    up_reader, up_writer = await asyncio.open_connection(*UPSTREAM)
    up_writer.write(b"\r\n".join(lines))
    await up_writer.drain()
    await asyncio.gather(pipe(client_reader, up_writer), pipe(up_reader, client_writer))


async def main():
    server = await asyncio.start_server(handle, "127.0.0.1", 8899)
    async with server:
        await server.serve_forever()


if __name__ == "__main__":
    asyncio.run(main())

Come indirizzo Selenium al forwarder?

Avvia forwarder.py in un terminale, poi esegui lo script Selenium con l’indirizzo proxy locale. Selenium Manager, integrato da Selenium 4.6 in poi, scarica automaticamente il ChromeDriver corrispondente, quindi non serve altro.

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

options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://127.0.0.1:8899")  # the local forwarder
options.add_argument("--headless=new")

driver = webdriver.Chrome(options=options)
try:
    driver.set_page_load_timeout(60)
    driver.get("https://api.ipify.org")
    print("exit IP:", driver.find_element(By.TAG_NAME, "body").text)
finally:
    driver.quit()

Come ottengo un IP per sessione Selenium, o un nuovo IP per pagina?

Il forwarder invia qualunque nome utente gli fornisci, quindi il comportamento della sessione dipende da questo:

  • Rotazione per connessione: ometti la parte sessione (USERNAME-country-us). Chrome apre più connessioni per pagina, quindi una singola pagina può caricare tramite più uscite.
  • Un IP per sessione Selenium: imposta CRAWLRELAY_USER a USERNAME-country-us-session-run42-ttl-30 prima di avviare il forwarder. Ogni connessione userà lo stesso IP fino a 30 minuti; l’IP può cambiare prima.
  • Più sessioni in parallelo: esegui un forwarder per sessione su porte locali diverse, per esempio 8899 e 8900, e assegna a ogni WebDriver la sua porta.

Che ne è di selenium-wire o estensioni browser?

selenium-wire, un popolare pacchetto che aggiungeva autenticazione proxy intercettando il traffico, è stato archiviato dall’autore a gennaio 2024 e non riceve più aggiornamenti. Un’estensione browser che risponde alla richiesta di autenticazione proxy funziona, ma va configurata e caricata in ogni profilo. Il forwarder sopra non ha dipendenze e funziona con qualsiasi browser guidato da Selenium. Per progetti nuovi, Playwright è ancora più semplice: prende direttamente nome utente e password del proxy.

Selenium e proxy: domande

Perché Chrome mostra il popup di login con il mio proxy in Selenium?

Perché il proxy ha chiesto le credenziali e Chrome non ne aveva: la sua flag --proxy-server accetta solo host e porta. In modalità headless lo stesso problema appare come ERR_TUNNEL_CONNECTION_FAILED. Usa un forwarder locale che aggiunge le credenziali, oppure passa a Playwright, che accetta nome utente e password.

Il forwarder rallenta il mio scraping?

Difficilmente. Copia byte tra due socket locali e uno remoto, senza decriptare nulla. Il tempo di caricamento di una pagina dipende dall’exit proxy residenziale e dal sito target, non dal forwarder che gira sulla stessa macchina.

Posso usare Firefox invece di Chrome con Selenium?

Sì. Imposta i proxy di Firefox tramite FirefoxOptions: network.proxy.type a 1, e network.proxy.http e network.proxy.ssl a 127.0.0.1 con porta 8899. Tieni il forwarder davanti: Firefox mostra una finestra per le credenziali proxy che Selenium non riesce a compilare in modo affidabile.

La mia password è sicura nel forwarder?

Rimane nella tua macchina finché il forwarder ascolta su 127.0.0.1, come nell’esempio. Leggila dalle variabili ambiente, mai inserirla nel codice, e usa un sub-user dedicato con un limite traffico per ogni scraper così se la password viene compromessa non rischi di consumare tutto il piano.

Dai a Selenium un exit residenziale

1,50 USD per 1 GB da testare, 0,50 USD/GB da 50 GB.

Da 0,50 USD/GB · senza KYC

Inizia ora