Socks5Proxy

Configuração de proxy no Puppeteer: conexão via --proxy-server e page.authenticate

Este guia explica como conectar proxies HTTP da Socks5Proxy no Puppeteer usando --proxy-server e page.authenticate, conexões SOCKS5, e código para distribuir navegadores em múltiplos IPs.

Como o proxy funciona no Puppeteer?

O Puppeteer define proxy via argumentos ao iniciar o Chrome. --proxy-server define o proxy para todas as páginas. Credenciais não podem ser passadas como argumentos, então use page.authenticate após abrir a página.

O exemplo usa IP 198.51.100.23, porta HTTP 8000, porta SOCKS5 1080, nome de usuário spx_user e senha spx_pass.

npm install puppeteer

Como conectar e autenticar em um proxy HTTP?

Adicione --proxy-server=198.51.100.23:8000 aos args de launch e, após criar a página com newPage, passe username e password para page.authenticate. A autenticação é necessária para cada página nova.

Sites HTTPS também abrem normalmente. O navegador cria um túnel CONNECT e comunica-se criptografado dentro dele.

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();

Como usar um proxy SOCKS5?

Basta colocar o endereço socks5:// no --proxy-server. No entanto, o Chrome não suporta autenticação de usuário e senha para proxies SOCKS, então page.authenticate não se aplica ao SOCKS5. Para se conectar via SOCKS5, use a autenticação IP registrando o IPv4 do servidor onde este código será executado no dashboard.

Se o ambiente exige conexão com usuário e senha, a porta HTTP do mesmo IP é a opção mais simples. O IP visto pelo site alvo será o mesmo.

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();

Como abrir vários navegadores com IPs diferentes?

O Chrome usa um proxy por navegador executado, então, se você precisar de IPs diferentes, execute navegadores separadamente. O código abaixo recebe uma lista de ip:port:user:pass pela API, abre três navegadores com os primeiros três IPs e exibe o IP visível em cada página.

Muitas instâncias de navegador consomem muita memória. Recomendamos usar uma fila de tarefas e limitar o número de navegadores executados simultaneamente.

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();
  }
}));

Como abrir páginas mais rapidamente?

Passar por proxy aumenta o consumo de banda e tempo, pois imagens, fontes e vídeos também são baixados via proxy. Se só precisa de texto e dados, bloquear requisições de imagens e fontes com page.setRequestInterception aumenta a velocidade e economiza banda mensal em planos compartilhados.

waitUntil também é importante. networkidle0 aguarda todas as requisições, podendo ser lento - prefira page.waitForSelector para avançar assim que elementos essenciais carregarem.

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 usar IPs diferentes por página no mesmo navegador?

O --proxy-server do Chrome é aplicado a todo o navegador, tornando difícil usar IPs diferentes por página. O Puppeteer 22+ permite usar proxies diferentes por contexto com a opção proxyServer em browser.createBrowserContext. Os contextos têm cookies e armazenamento separados, o que é ideal para tarefas por conta.

Páginas criadas no contexto também aceitam credenciais via page.authenticate, consumindo menos memória que múltiplos navegadores.

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();

O que ajustar para parecer um usuário desse país?

Defina Accept-Language com page.setExtraHTTPHeaders e fuso horário com page.emulateTimezone conforme o país do IP. Idioma e fuso errados podem mostrar páginas em linguagem incorreta ou datas diferentes.

Defina o tamanho da tela com page.setViewport. Para emular dispositivos móveis, use configurações pré-definidas em KnownDevices do Puppeteer com 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 });

Como manter o navegador estável em tarefas de longa duração?

Para tarefas que rodam o dia todo, é mais estável fechar e reabrir o navegador após processar um certo número de páginas, em vez de deixá-lo aberto continuamente. Navegadores abertos por muito tempo consomem cada vez mais memória, e um erro pode parar todas as tarefas subsequentes.

Certifique-se de chamar page.close com try e finally em cada página e adicione timeout ao goto para evitar parar em páginas sem resposta. Tarefas falhas podem ser tentadas novamente com um novo navegador usando outro proxy.

Registrar tempo de resposta e erros por proxy ajuda a identificar proxies lentos e ajustar o agendamento de tarefas. Em caso de dúvidas, consulte o suporte pelo dashboard.

Como resolver erros frequentes?

net::ERR_INVALID_AUTH_CREDENTIALS ou erro 407 ocorrem quando page.authenticate está incorreto ou não é chamado após newPage. Verifique se a chamada ocorre antes de goto em cada página.

net::ERR_PROXY_CONNECTION_FAILED indica endereço ou porta incorretos. Confirme se a porta HTTP é usada para endereços HTTP e a porta SOCKS5 para SOCKS5. Se conexões SOCKS5 forem recusadas, verifique se o IP de saída do servidor está na lista de IPs permitidos.

Configuração de proxy no Puppeteer: autenticação com page.authenticate | Socks5Proxy