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 puppeteerComo 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.