Integrazione Proxy Playwright: Browser, Contesto e Rotazione
Playwright è l'unico framework per browser principale in cui i proxy autenticati funzionano senza problemi — le credenziali sono configurazioni di prima classe. Il vantaggio sta nei contesti: un browser, un IP di uscita diverso per ogni lavoro. Ecco il modello completo.
Playwright è l'unico framework di automazione browser principale in cui un proxy autenticato è un cittadino di prima classe: nome utente e password sono campi di configurazione semplici, senza hack di estensione, senza finestre di dialogo di autenticazione, senza librerie wrapper. Questo rende l'impostazione base del proxy Playwright un lavoro di cinque righe in Node o Python. Il vero vantaggio si trova un livello più in profondità — i proxy per contesto permettono a un singolo processo browser di eseguire molte sessioni isolate, ciascuna con il proprio IP di uscita, che è l'architettura di rotazione più economica offerta da qualsiasi framework. Questa guida copre entrambi i livelli, le insidie SOCKS5 e localhost, cosa fa il proxying alla tua bolletta di larghezza di banda e dove finisce realmente lo stealth.
Proxy Playwright al lancio del browser
Passa un oggetto proxy a launch() e ogni pagina nel browser viene instradata attraverso di esso. Nota la forma: l'URL del server non contiene credenziali — vanno nei campi separati username e password, che è il modo in cui Playwright evita il problema del popup di autenticazione che affligge Selenium e Puppeteer:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'http://gate.quantumproxies.io:PORT',
username: 'USER',
password: 'PASS',
},
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.textContent('body')); // proxy exit IP
await browser.close();
})();
L'API Python lo rispecchia esattamente:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(proxy={
"server": "http://gate.quantumproxies.io:PORT",
"username": "USER",
"password": "PASS",
})
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.text_content("body"))
browser.close()
Se le tue credenziali risiedono in una stringa standard http://user:pass@host:port, dividila con la classe URL (new URL() in Node, urllib.parse in Python) piuttosto che con la manipolazione delle stringhe — le password con caratteri speciali sopravvivono in questo modo. Un avvertimento per i test-runner: use.proxy in playwright.config.ts copre i test, ma ci sono segnalazioni di lunga data di impostazioni proxy a livello di configurazione ignorate in configurazioni miste, quindi per gli script di scraping imposta sempre il proxy su launch() o direttamente sul contesto.
Proxy per contesto: rotazione senza nuovi browser
Un BrowserContext è un browser isolato all'interno del browser: cookie, storage e cache separati, condividendo solo il processo. I contesti accettano la propria opzione proxy, e crearne uno richiede millisecondi rispetto ai secondi per un lancio completo — quindi il modello di rotazione è un browser, contesto per lavoro:
const { chromium } = require('playwright');
const PROXY = {
server: 'http://gate.quantumproxies.io:PORT',
username: 'USER',
password: 'PASS',
};
(async () => {
const browser = await chromium.launch();
const urls = ['https://example.com/a', 'https://example.com/b'];
for (const url of urls) {
const context = await browser.newContext({ proxy: PROXY });
const page = await context.newPage();
try {
await page.goto(url, { timeout: 30000 });
// ...extract...
} finally {
await context.close(); // frees cookies, cache, session
}
}
await browser.close();
})();
Puntato a un gateway rotante, ogni contesto esce da un IP diverso in un pool residenziale di oltre 90 milioni senza alcuna gestione delle liste — questo è ciò che fanno i proxy rotanti lato server. Quando un lavoro richiede lo stesso IP su diverse pagine (login più checkout), richiedi una sessione sticky tramite i parametri del nome utente e l'uscita si mantiene per la finestra della sessione. I contesti isolano anche i fallimenti: un'uscita bannata muore con il suo contesto invece di avvelenare l'intero browser.
Lo stesso modello ti offre il geo-targeting gratuitamente. Poiché il proxy è un'opzione di contesto, un browser può contenere contemporaneamente un contesto USA, un contesto tedesco e un contesto giapponese — ciascuno vedendo prezzi localizzati, risultati di ricerca e banner di consenso da un IP di uscita locale. Per il lavoro di confronto prezzi e verifica annunci, ciò sostituisce tre regioni cloud con tre righe di configurazione.

SOCKS5, regole di bypass e la trappola localhost
- SOCKS5 funziona, l'autenticazione SOCKS5 no. Chromium non supporta le credenziali SOCKS, quindi
server: 'socks5://...'si connette solo a endpoint non autenticati. Con proxy SOCKS5 autenticati, passa alla porta HTTP dello stesso gateway o inserisci nella whitelist l'IP della tua macchina in modo che non siano necessarie credenziali. - Bypass host con
bypass: '*.internal.example.com, localhost'— il traffico verso quegli host va diretto. Utile quando il tuo script parla anche a servizi interni che non devono transitare attraverso il proxy. - Localhost è speciale. Chromium salta i proxy per gli indirizzi di loopback per impostazione predefinita, quindi testare contro un server mock locale sembra 'ignorare' il tuo proxy. Questo è il browser, non Playwright — testa contro un endpoint esterno come httpbin.org/ip invece.
- Checklist 'proxy non funzionante': credenziali nei campi (non nell'URL del server), schema presente sul valore del server, e l'uscita verificata caricando una pagina di eco IP prima di incolpare il sito di destinazione.
Riduci la larghezza di banda prima di scalare
Un browser di rendering scarica tutto — immagini, font, analisi, script pubblicitari — e attraverso il traffico residenziale misurato paghi per tutto. Bloccare i tipi di risorse non essenziali riduce di routine il trasferimento per pagina della metà o più, e l'instradamento di Playwright lo rende una riga di codice sul contesto. Altri modelli nella nostra guida su ridurre i costi di larghezza di banda dei proxy:
await context.route('**/*', (route) => {
const type = route.request().resourceType();
if (type === 'image' || type === 'font' || type === 'media') {
return route.abort();
}
return route.continue();
});
Misura l'effetto piuttosto che supporlo: iscriviti agli eventi di risposta del contesto, somma le dimensioni del trasferimento per un campione di pagine con e senza il percorso, e ottieni il tuo vero costo per pagina in GB — il numero che decide se un crawl di un milione di pagine è un errore di arrotondamento o una voce di bilancio.
Limiti stealth: cosa un proxy non può risolvere
Sii onesto sul limite. Un'uscita residenziale risolve la reputazione IP — il primo e più grande filtro — ma Playwright presenta ancora segnali di automazione sopra il livello di rete: stranezze di rendering headless, artefatti CDP e superfici di impronte digitali che i fornitori anti-bot sondano direttamente. I plugin stealth correggono alcuni segnali e rimangono indietro rispetto agli aggiornamenti dei rilevatori su altri; è una corsa agli armamenti che erediti, non un'impostazione che abiliti. La divisione pragmatica: esegui Playwright attraverso proxy residenziali per la lunga coda di siti normali, e instrada i domini realmente ostili attraverso un Scraper API che gestisce impronte digitali, rendering e retry come suo intero lavoro e restituisce HTML, markdown o JSON strutturato. Il tuo codice Playwright continua a fare ciò che sa fare meglio — flussi di interazione — mentre i lavori di fetch-and-parse si spostano all'API. Lo stesso calcolo si applica a Puppeteer e Selenium; nessun cambio di framework risolve un problema di impronte digitali.

Domande frequenti
Come imposto un proxy in Playwright Python?
Passa un dizionario proxy a launch(): p.chromium.launch(proxy={"server": "http://host:port", "username": "USER", "password": "PASS"}). Lo stesso dizionario funziona su browser.new_context() per l'instradamento per contesto. Le credenziali vanno sempre nei campi separati, mai all'interno dell'URL del server.
Playwright può usare un proxy diverso per contesto?
Sì — passa un'opzione proxy a ogni chiamata newContext(). I contesti non condividono nulla tranne il processo del browser, quindi due contesti con proxy diversi si comportano come due browser non correlati per i siti di destinazione. Questo è il modello di rotazione standard: un lancio, poi un contesto fresco per lavoro o per identità.
Playwright supporta l'autenticazione del proxy SOCKS5?
No. Playwright passa SOCKS5 al browser, e Chromium non ha meccanismo per le credenziali SOCKS, quindi gli endpoint SOCKS5 autenticati falliscono. Usa la porta HTTP(S) dello stesso gateway proxy con campi nome utente e password, o autentica tramite whitelist IP e mantieni lo schema SOCKS5.
Qual è il formato corretto del proxy Playwright?
Un oggetto con un campo server (scheme://host:port — http, https o socks5) più campi opzionali username, password e bypass. Non mettere le credenziali all'interno dell'URL del server; Playwright le aspetta separatamente, e le password con caratteri speciali sopravvivono solo nei campi dedicati.
Perché il mio proxy Playwright non funziona su localhost?
Chromium bypassa i proxy per gli indirizzi di loopback per impostazione predefinita, quindi le richieste a localhost o 127.0.0.1 vanno dirette e sembrano ignorare la tua configurazione. Verifica il proxy contro un URL esterno come httpbin.org/ip. Nei setup di test, preferisci anche impostare il proxy su launch() piuttosto che fare affidamento sulle opzioni del file di configurazione.
La storia del proxy di Playwright è la più pulita nell'ecosistema: credenziali come configurazione, contesti come unità di rotazione, instradamento come valvola di larghezza di banda. Ottieni la qualità IP giusta sotto di essa e il framework svanisce sullo sfondo — che è esattamente ciò che una buona infrastruttura dovrebbe fare.