Risposta rapida
Come uso un proxy autenticato in Puppeteer?
Avvia Chrome con --proxy-server=http://gw.crawlrelay.com:7777, poi chiama page.authenticate({ username, password }) prima della prima goto. Chrome ignora le credenziali scritte nel flag. I proxy residenziali CrawlRelay leggono il paese e la sessione sticky dal nome utente, così ogni pagina o contesto ha il proprio exit. Il traffico costa 0,50 USD/GB da 50 GB. Pagato in crypto, senza KYC.
Configurazione Puppeteer in breve
| Indirizzo proxy | --proxy-server=http://gw.crawlrelay.com:7777 in args, o proxyServer su un contesto browser |
|---|---|
| Credenziali | await page.authenticate({ username, password }) prima della navigazione |
| Sessioni separate | browser.createBrowserContext({ proxyServer }): un contesto per sessione |
| SOCKS5 | Non con autenticazione in Chrome: usa la porta HTTP |
| Risparmiare traffico | page.setRequestInterception(true) e abortisci immagini, font e media |
Come configuro un singolo proxy autenticato?
Questo è il modello minimo. Il blocco try … finally chiude Chrome anche se una navigazione fallisce, cosa importante su server dove browser orfani si accumulano.
import puppeteer from "puppeteer";
const browser = await puppeteer.launch({
args: ["--proxy-server=http://gw.crawlrelay.com:7777"],
});
try {
const page = await browser.newPage();
await page.authenticate({ username: "USERNAME-country-us", password: "PASSWORD" });
await page.setRequestInterception(true);
page.on("request", (req) =>
["image", "font", "media"].includes(req.resourceType()) ? req.abort() : req.continue()
);
const res = await page.goto("https://example.com/", { waitUntil: "domcontentloaded", timeout: 60000 });
console.log(res.status(), await page.title());
} finally {
await browser.close();
}Come gestisco più sessioni o paesi in un solo browser?
Crea un contesto browser per sessione. Un contesto è un profilo isolato con propri cookie, cache e stato rete, così le credenziali di un contesto non filtrano in un altro. Dai a ogni contesto un nome utente con il proprio paese o ID sessione.
import puppeteer from "puppeteer";
import { randomUUID } from "node:crypto";
const GATEWAY = "http://gw.crawlrelay.com:7777";
const browser = await puppeteer.launch();
async function visit(country, url) {
const session = randomUUID().replaceAll("-", "").slice(0, 10);
const context = await browser.createBrowserContext({ proxyServer: GATEWAY });
try {
const page = await context.newPage();
await page.authenticate({
username: `USERNAME-country-${country}-session-${session}-ttl-20`,
password: "PASSWORD",
});
await page.goto(url, { waitUntil: "domcontentloaded", timeout: 60000 });
return { country, session, ip: await page.evaluate(() => document.body.innerText.trim()) };
} finally {
await context.close();
}
}
try {
const results = await Promise.all([
visit("us", "https://api.ipify.org"),
visit("gb", "https://api.ipify.org"),
]);
console.table(results);
} finally {
await browser.close();
}Perché Puppeteer mostra 407 o ERR_TUNNEL_CONNECTION_FAILED?
Perché Chrome non ha inviato le credenziali o ha inviato quelle sbagliate. Controlla tre cose:
page.authenticate()si esegue prima della primagotosu quella pagina.- Il flag
--proxy-serveroproxyServercontiene solo schema, host e porta, senza parteuser:pass@. - Il nome utente non ha errori nella parte di destinazione: testalo prima con curl, come mostrato nella pagina 407.
Se curl funziona con nome utente e password uguali e Puppeteer no, leggi ERR_TUNNEL_CONNECTION_FAILED.
Quanto traffico consuma una pagina Puppeteer?
Tutto quello che Chrome scarica viene conteggiato: HTML, script, stili, immagini, font e chiamate API della pagina. L'HTTP Archive Web Almanac 2025 ha misurato un peso medio pagina di 2.164 KB su mobile e 2.412 KB su desktop. Bloccare immagini, font e media con intercettazione richieste di solito riduce il peso a poche centinaia di KB, e rispondere con risposte cache per script ripetuti lo taglia ancora. Usa proxy mobili 4G rotanti solo per le pagine che ne hanno bisogno: il traffico mobile costa 1,50 USD/GB da 5 GB, i proxy residenziali 0,50 USD/GB da 50 GB.
Puppeteer e proxy: domande
Posso mettere nome utente e password in --proxy-server?
No. Chrome ignora le credenziali nel flag --proxy-server, e la prima richiesta HTTPS fallisce con un 407 nascosto dietro ERR_TUNNEL_CONNECTION_FAILED. Metti solo http://host:port nel flag e passa le credenziali con page.authenticate() a ogni nuova pagina.
Come faccio a cambiare IP tra pagine in Puppeteer?
Apri ogni pagina in un nuovo contesto browser, oppure dai a ogni pagina un nome utente senza ID sessione. Un contesto nuovo apre connessioni nuove, e ogni connessione nuova di solito ottiene un exit residenziale diverso. Dentro una pagina, Chrome riusa le connessioni, quindi richieste allo stesso sito spesso condividono exit fino a chiusura connessione.
page.authenticate() funziona con intercettazione richieste?
Sì. Puppeteer gestisce da sé la sfida di autenticazione del proxy, e il tuo handler per l'intercettazione deve solo chiamare continue() o abort() su ogni richiesta. Imposta prima authenticate(), poi attiva l'intercettazione, come nel primo esempio.
Conviene usare plugin stealth di puppeteer-extra con proxy?
Non documentiamo né supportiamo tool pensati per nascondere l'automazione o bypassare i controlli bot. Il loro scopo è aggirare i filtri anti-automazione dei siti, cosa che la nostra Acceptable Use Policy non permette. Visualizza pagine pubbliche con moderazione e usa API ufficiali quando disponibili.
Quale Chrome usa Puppeteer con il proxy?
Le versioni recenti di Puppeteer scaricano una build matching di Chrome for Testing e la usano per default. I flag proxy e page.authenticate() funzionano in modo identico rispetto a Chrome normale. Se punti Puppeteer a un tuo Chrome con executablePath, mantieni quel browser aggiornato.
Usa Puppeteer con proxy residenziali
5,94 USD per 10 GB, 0,50 USD/GB da 50 GB.