Socks5Proxy

Configurazione proxy in Puppeteer, collegamento con --proxy-server e page.authenticate

Questa guida spiega come collegare i proxy HTTP di Socks5Proxy a Puppeteer con l'argomento --proxy-server e l'autenticazione page.authenticate, la connessione SOCKS5 e il codice per avviare browser con IP diversi.

Come funziona il proxy in Puppeteer?

Puppeteer imposta il proxy con gli argomenti passati all'avvio di Chrome. Inserisci l'indirizzo in --proxy-server e tutte le pagine del browser useranno lo stesso proxy. Il nome utente e la password per il proxy HTTP non possono essere passati come argomenti, quindi vengono passati con page.authenticate dopo aver aperto la pagina. Puppeteer risponde automaticamente quando il proxy richiede l'autenticazione.

L'esempio usa IP 198.51.100.23, porta HTTP 8000, porta SOCKS5 1080, username spx_user e password spx_pass.

npm install puppeteer

Come ci si connette a un proxy HTTP con autenticazione?

Aggiungi --proxy-server=198.51.100.23:8000 agli argomenti di launch e, subito dopo aver creato la pagina con newPage, passa username e password a page.authenticate. L'autenticazione deve essere eseguita per ogni pagina, quindi inserisci la stessa chiamata ogni volta che crei una nuova pagina.

I siti HTTPS si aprono normalmente. Il browser crea un tunnel CONNECT e comunica in modo crittografato al suo interno.

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({
  headless: true,
  args: ["--proxy-server=http://198.51.100.23:8000"],
});

const page = await browser.newPage();
await page.authenticate({ username: "spx_user", password: "spx_pass" });

await page.goto("https://api.ipify.org", { waitUntil: "domcontentloaded" });
console.log(await page.evaluate(() => document.body.innerText)); // proxy IP

await browser.close();

Come si usa un proxy SOCKS5?

Inserisci l'indirizzo socks5:// in --proxy-server. Tuttavia, Chrome non supporta l'autenticazione con username e password per i proxy SOCKS, quindi page.authenticate non si applica a SOCKS5. Per connetterti con SOCKS5, utilizza l'autorizzazione IP registrando l'IPv4 del server che esegue questo codice nel dashboard.

Se devi usare username e password, il modo più semplice è usare la porta HTTP dello stesso IP. Il sito di destinazione vedrà la stessa posizione.

import puppeteer from "puppeteer";

const browser = await puppeteer.launch({
  args: ["--proxy-server=socks5://198.51.100.23:1080"], // server IP is authorized in the dashboard
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();

Come aprire più browser con IP diversi?

Chrome utilizza un proxy per ogni browser avviato, quindi se sono necessari IP diversi, è necessario avviare browser separati. Il codice seguente riceve un elenco di ip:port:user:pass dall'API, avvia tre browser con i primi tre IP e stampa l'IP visualizzato su ciascuna pagina.

Aprire molti browser consuma molta memoria. Si consiglia di impostare una coda di lavoro e limitare il numero di browser eseguiti contemporaneamente.

import puppeteer from "puppeteer";

const KEY = "YOUR_API_KEY";
const res = await fetch("https://socks5proxy.io/api/v1/proxies/download?format=ip:port:user:pass&protocol=http", {
  headers: { Authorization: "Bearer " + KEY },
});
const lines = (await res.text()).trim().split("\n").slice(0, 3);

await Promise.all(lines.map(async (line) => {
  const [ip, port, user, pass] = line.trim().split(":");
  const browser = await puppeteer.launch({ args: ["--proxy-server=http://" + ip + ":" + port] });
  try {
    const page = await browser.newPage();
    await page.authenticate({ username: user, password: pass });
    await page.goto("https://api.ipify.org", { timeout: 30000 });
    console.log(ip, await page.evaluate(() => document.body.innerText));
  } finally {
    await browser.close();
  }
}));

Come aprire le pagine più velocemente?

Passando attraverso il proxy, immagini, font e video vengono tutti scaricati tramite il proxy, consumando più larghezza di banda e tempo. Se hai bisogno solo di testo e dati, bloccare le richieste di immagini e font con page.setRequestInterception può aumentare la velocità e risparmiare la larghezza di banda mensile dei piani condivisi.

Anche il valore waitUntil è importante. networkidle0 attende il completamento di tutte le richieste, il che può rallentare il processo. È preferibile utilizzare page.waitForSelector per passare alla fase successiva non appena l'elemento necessario è visibile.

await page.setRequestInterception(true);
page.on("request", (req) => {
  const type = req.resourceType();
  if (type === "image" || type === "font" || type === "media") req.abort();
  else req.continue();
});

Posso utilizzare IP diversi per ogni pagina nello stesso browser?

L'argomento --proxy-server di Chrome si applica all'intero browser, rendendo difficile assegnare IP diversi per ogni pagina. Puppeteer 22 e versioni successive permettono di utilizzare proxy diversi per ogni contesto tramite l'opzione proxyServer in browser.createBrowserContext. I contesti hanno cookie e storage separati, quindi sono ideali per attività per account.

Anche le pagine create nel contesto possono passare username e password tramite page.authenticate. Utilizza meno memoria rispetto all'apertura di più browser.

import puppeteer from "puppeteer";

const browser = await puppeteer.launch();
const context = await browser.createBrowserContext({ proxyServer: "http://198.51.100.23:8000" });
const page = await context.newPage();
await page.authenticate({ username: "spx_user", password: "spx_pass" });
await page.goto("https://api.ipify.org");
console.log(await page.evaluate(() => document.body.innerText));
await context.close();
await browser.close();

Cosa allineare per apparire come un utente di quel paese?

Imposta Accept-Language con page.setExtraHTTPHeaders e il fuso orario con page.emulateTimezone in base al paese dell'IP. Se lingua e fuso orario non corrispondono al paese dell'IP, la pagina potrebbe apparire in una lingua sbagliata o con una visualizzazione della data diversa.

Imposta le dimensioni della schermata con page.setViewport e, se hai bisogno di una schermata mobile, passa le impostazioni del dispositivo da KnownDevices di puppeteer a page.emulate.

await page.setExtraHTTPHeaders({ "Accept-Language": "ja-JP,ja;q=0.9" });
await page.emulateTimezone("Asia/Tokyo");
await page.setViewport({ width: 1366, height: 900 });

Come mantenere stabile il browser per sessioni lunghe?

Per lavori che girano tutto il giorno, è più stabile chiudere e riaprire il browser dopo aver elaborato un certo numero di pagine, piuttosto che tenerlo aperto continuamente. Un browser lasciato aperto a lungo consuma sempre più memoria e, in caso di errore, tutto il lavoro successivo potrebbe fermarsi.

Assicurati di chiamare page.close con try e finally su ogni pagina, e aggiungi un timeout a goto per evitare di bloccarti su pagine senza risposta. Se un'operazione fallisce, riprova con un nuovo browser su un altro proxy.

Registrare i tempi di risposta e gli errori per ogni proxy può aiutarti a identificare i proxy lenti e a contattare il supporto o modificare la distribuzione del lavoro.

Come risolvere gli errori più frequenti?

net::ERR_INVALID_AUTH_CREDENTIALS o 407 indicano che i valori di page.authenticate sono errati o che la chiamata non è stata eseguita dopo newPage. Assicurati di chiamarlo prima di goto per ogni pagina.

net::ERR_PROXY_CONNECTION_FAILED indica che l'indirizzo o la porta sono errati. Assicurati di utilizzare la porta HTTP per gli indirizzi HTTP e la porta SOCKS5 per gli indirizzi SOCKS5. Se la connessione SOCKS5 viene rifiutata, verifica che l'IP in uscita del server sia registrato per l'autenticazione IP.

Configurazione proxy in Puppeteer, autenticazione con page.authenticate | Socks5Proxy