Navegadores headless renderizam JavaScript, então lidam com sites modernos que clientes HTTP simples não conseguem. Mas um navegador ainda envia cada requisição a partir de um único IP, e a automação é pega no momento em que um site aplica rate-limit ou faz fingerprint desse endereço. Usar proxies com Playwright e Puppeteer distribui o tráfego entre vários IPs e, feito corretamente, faz sua automação parecer usuários comuns. Aqui está a configuração que funciona para os dois, em Python e Node.
Defina o proxy no lançamento do navegador. Passe a autenticação como campos separados de username e password — não coloque as credenciais embutidas na URL do servidor:
from playwright.sync_api import sync_playwright
PROXY = {
"server": "http://gate.jibaoproxy.com:10001",
"username": "USERNAME",
"password": "PASSWORD",
}
with sync_playwright() as p:
browser = p.chromium.launch(proxy=PROXY, headless=True)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.inner_text("body"))
browser.close()
A JIBAO expõe tanto HTTP quanto SOCKS5 no gateway. Use o endpoint HTTP para automação de navegador: Playwright e Puppeteer não suportam proxies SOCKS5 autenticados, então HTTP com autenticação é a escolha confiável.
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
headless: true,
proxy: {
server: 'http://gate.jibaoproxy.com:10001',
username: 'USERNAME',
password: 'PASSWORD',
},
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.innerText('body'));
await browser.close();
})();
A forma mais limpa de rotacionar no Playwright é um IP por BrowserContext. Cada contexto é uma sessão isolada (com seus próprios cookies e cache), então vincular cada um a um IP de saída diferente lhe dá identidades paralelas a partir de um único processo de navegador:
from playwright.sync_api import sync_playwright
def ctx_proxy(session_id):
return {
"server": "http://gate.jibaoproxy.com:10001",
"username": f"USERNAME-session-{session_id}",
"password": "PASSWORD",
}
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
for i in range(3):
context = browser.new_context(proxy=ctx_proxy(f"ctx{i}"))
page = context.new_page()
page.goto("https://httpbin.org/ip")
print(i, page.inner_text("body"))
context.close()
browser.close()
Cada contexto usa um token de sessão sticky distinto, então o IP permanece estável dentro de um contexto (bom para fluxos de login) mas difere entre contextos (bom para rodar muitas contas em paralelo). Esse é o padrão que navegadores anti-detect como GoLogin e Dolphin Anty automatizam — veja nosso guia de configuração de proxy anti-detect.
O Puppeteer define o servidor proxy como uma flag de lançamento do Chromium e depois autentica no objeto da página:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({
headless: 'new',
args: ['--proxy-server=http://gate.jibaoproxy.com:10001'],
});
const page = await browser.newPage();
await page.authenticate({ username: 'USERNAME', password: 'PASSWORD' });
await page.goto('https://httpbin.org/ip');
console.log(await page.evaluate(() => document.body.innerText));
await browser.close();
})();
Como o proxy é uma flag em nível de processo, um único navegador Puppeteer usa um IP. Para rotacionar, lance um novo navegador por identidade (mais pesado) ou conduza a rotação por um gateway que troca de IPs a cada conexão.
Qualquer fluxo que cria um cookie de sessão precisa manter o mesmo IP por toda a sua vida. Um cookie gerado no IP-A que de repente aparece a partir do IP-B é lido como sequestro de sessão e dispara uma reautenticação ou um banimento. Mantenha um contexto (ou um navegador) por conta logada, fixado a um único token de sessão sticky, durante toda a sessão.
Um IP residencial é necessário, mas não suficiente. Os sites também leem o handshake TLS/JA4 do seu navegador, a ordem dos frames do HTTP/2, canvas, WebGL e propriedades do navigator. O Chromium headless puro vaza navigator.webdriver = true e um fingerprint headless que derrota o melhor IP. Mitigue com plugins stealth e flags de lançamento realistas:
// Node: puppeteer-extra + stealth
const puppeteer = require('puppeteer-extra');
const Stealth = require('puppeteer-extra-plugin-stealth');
puppeteer.use(Stealth());
// Realistic launch flags
const browser = await puppeteer.launch({
headless: 'new',
args: [
'--proxy-server=http://gate.jibaoproxy.com:10001',
'--disable-blink-features=AutomationControlled',
'--window-size=1920,1080',
],
});
Para ver exatamente quais sinais você está vazando, rode seu navegador automatizado contra o verificador de fingerprint JA3/JA4 gratuito da JIBAO. Para a mecânica mais profunda de por que os handshakes são sinalizados, leia como contornar o fingerprinting de TLS e a receita completa de bypass do Cloudflare.
headless=False para observar o que o alvo realmente mostra ao seu bot.Ganhe 500MB de tráfego grátis e IPs residenciais que mantêm Playwright e Puppeteer fora da lista de banidos.
Comece o Teste GratuitoNovos usuários recebem 500MB ao se cadastrar, mais um bônus na primeira recarga. Oferta por tempo limitado.