Socks5Proxy

Configuração de proxy no Playwright: conectar IPs diferentes por navegador e contexto

Este guia mostra como configurar proxies HTTP e SOCKS5 da Socks5Proxy nas opções proxy do Playwright (server, username, password), e como usar IPs diferentes por contexto no mesmo navegador, com exemplos em Node.js e Python.

Qual é a forma mais fácil de configurar proxy no Playwright?

O Playwright aceita endereço, usuário e senha do proxy em uma única opção, sem necessidade de lidar com pop-ups de autenticação. A opção funciona igual no Chromium, Firefox e WebKit.

Além disso, ao executar apenas um navegador com vários contextos, você pode atribuir diferentes proxies a cada contexto. Contextos são perfis separados com cookies e armazenamento isolados, permitindo gerenciar vários IPs e sessões em um único navegador e economizar memória.

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 playwright
npx playwright install chromium

Como conectar um proxy HTTP a todo o navegador?

Configure server, username e password nas opções de proxy de launch para usar o mesmo proxy em todas as páginas do navegador. Sites HTTPS são transmitidos via túnel CONNECT criptografado.

import { chromium } from "playwright";

const browser = await chromium.launch({
  proxy: { server: "http://198.51.100.23:8000", username: "spx_user", password: "spx_pass" },
});
const page = await browser.newPage();
await page.goto("https://api.ipify.org");
console.log(await page.textContent("body")); // proxy IP
await browser.close();

Como usar IPs diferentes por contexto?

A opção proxy em newContext aplica o proxy apenas àquele contexto. O código abaixo obtém proxies via API, cria 3 contextos com IPs distintos e exibe o IP visível em cada um. Para gerenciar múltiplas contas, associe cada conta a um contexto com um IP exclusivo.

Algumas versões do Chromium e ambientes Windows exigem que a opção proxy esteja presente em launch para usar proxies por contexto. Nesses casos, insira o primeiro proxy em launch e substitua-o por contexto.

import { chromium } from "playwright";

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

const browser = await chromium.launch();
for (const line of lines) {
  const [ip, port, user, pass] = line.trim().split(":");
  const context = await browser.newContext({
    proxy: { server: "http://" + ip + ":" + port, username: user, password: pass },
    locale: "en-US",
  });
  const page = await context.newPage();
  await page.goto("https://api.ipify.org");
  console.log(ip, await page.textContent("body"));
  await context.close();
}
await browser.close();

Como usar um proxy SOCKS5?

Use server com endereço socks5://. Chromium não suporta autenticação por credenciais em SOCKS5 - prefira autorização por IP. Registre o IPv4 do servidor no dashboard e use apenas server sem username/password.

Se precisar conectar com usuário e senha, use a porta HTTP do mesmo IP. O IP e localização vistos pelo site alvo serão os mesmos.

import { chromium } from "playwright";

const browser = await chromium.launch({
  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.textContent("body"));
await browser.close();

Como usar no Python?

Playwright para Python tem a mesma estrutura. Passe server, username e password no dicionário proxy. Veja exemplo síncrono abaixo. Opções assíncronas são iguais.

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(proxy={
        "server": "http://198.51.100.23:8000",
        "username": "spx_user",
        "password": "spx_pass",
    })
    page = browser.new_page()
    page.goto("https://api.ipify.org")
    print(page.text_content("body"))
    browser.close()

O que devo ajustar para que os resultados pareçam ser de um usuário daquele país?

Defina locale e timezoneId no contexto conforme o país do IP para renderizar páginas no idioma e horário local. Exemplo: para IP alemão, use locale de-DE e timezoneId Europe/Berlin.

Se você não precisa de imagens e vídeos, pode bloquear essas solicitações com page.route para economizar largura de banda e tempo. Isso é especialmente útil em planos compartilhados, que têm uma largura de banda mensal limitada.

  • Ajustar locale e timezoneId conforme o país do IP
  • Um contexto, uma conta, um IP
  • Bloqueie requisições desnecessárias de imagens/vídeos com page.route
  • SOCKS5 usa autorização por IP, enquanto nome de usuário e senha são para a porta HTTP

Como receber a lista automaticamente e dividi-la para cada tarefa?

GET /proxies retorna JSON com IP, porta e país por linha. Filtre por país para criar listas específicas. Este código cria contextos para proxies dos EUA conforme o número de tarefas. Veja os nomes dos campos na documentação.

Se você tem muitos trabalhos, não deixe o contexto aberto até o final; feche-o após cada trabalho para liberar memória.

import { chromium } from "playwright";

const KEY = "YOUR_API_KEY";
const res = await fetch("https://socks5proxy.io/api/v1/proxies?country=us&protocol=http", {
  headers: { Authorization: "Bearer " + KEY },
});
const { proxies } = await res.json();

const browser = await chromium.launch();
for (const p of proxies.slice(0, 5)) {
  const context = await browser.newContext({
    proxy: { server: "http://" + p.host + ":" + p.http_port, username: p.username, password: p.password },
    locale: "en-US",
    timezoneId: "America/New_York",
  });
  const page = await context.newPage();
  await page.goto("https://api.ipify.org");
  console.log(await page.textContent("body"));
  await context.close();
}
await browser.close();

Como bloquear requisições desnecessárias para economizar largura de banda?

Bloquear requisições de imagens, fontes e vídeos com page.route ou context.route acelera o carregamento e economiza largura de banda do proxy, especialmente útil em tarefas de coleta de dados.

await context.route("**/*", (route) => {
  const type = route.request().resourceType();
  return ["image", "font", "media"].includes(type) ? route.abort() : route.continue();
});

O mesmo proxy funciona no Firefox e WebKit?

Sim. Playwright aceita as mesmas opções de proxy para todos os três navegadores. Para testes, sua equipe pode usar o mesmo proxy com Chromium, Firefox e WebKit sequencialmente para verificar consistência entre visualizações por país.

Assim como o Chromium, o Firefox não suporta autenticação por nome de usuário e senha para SOCKS5 no navegador, então conecte-se ao SOCKS5 usando autorização por IP. A porta HTTP é conectada por nome de usuário e senha em todos os três navegadores.

Se usar Playwright Test, adicione proxy em 'use' no playwright.config para aplicar a todos os testes ou divida projetos por país com proxies diferentes.

import { defineConfig } from "@playwright/test";

export default defineConfig({
  projects: [
    { name: "us", use: { locale: "en-US", proxy: { server: "http://198.51.100.23:8000", username: "spx_user", password: "spx_pass" } } },
    { name: "de", use: { locale: "de-DE", proxy: { server: "http://198.51.100.24:8000", username: "spx_user", password: "spx_pass" } } },
  ],
});

Como resolver erros frequentes?

net::ERR_PROXY_CONNECTION_FAILED indica endereço ou porta incorretos. Erros 407 ou de autenticação requerem verificação de username e password. 'Browser does not support socks5 proxy authentication' aparece ao usar credenciais com SOCKS5 - troque para autorização por IP ou use a porta HTTP.

Configuração de proxy no Playwright: IPs por navegador/contexto | Socks5Proxy