Los navegadores headless renderizan JavaScript, así que manejan los sitios modernos que los clientes HTTP simples no pueden. Pero un navegador sigue enviando cada solicitud desde una sola IP, y la automatización queda atrapada en cuanto un sitio limita la tasa o toma la huella de esa dirección. Usar proxies con Playwright y Puppeteer reparte el tráfico entre varias IPs y, hecho bien, hace que tu automatización parezca usuarios normales. Aquí tienes la configuración que funciona para ambos, en Python y Node.
Configura el proxy al iniciar el navegador. Pasa la autenticación como campos separados username y password — no incrustes las credenciales en la URL del 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()
JIBAO expone tanto HTTP como SOCKS5 en la pasarela. Usa el endpoint HTTP para la automatización del navegador: Playwright y Puppeteer no admiten proxies SOCKS5 autenticados, así que HTTP-con-auth es la opción fiable.
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();
})();
La forma más limpia de rotar en Playwright es una IP por BrowserContext. Cada contexto es una sesión aislada (con sus propias cookies y caché), así que vincular cada uno a una IP de salida distinta te da identidades paralelas desde un único proceso 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 un token de sesión sticky distinto, así que la IP permanece estable dentro de un contexto (ideal para flujos de inicio de sesión) pero difiere entre contextos (ideal para ejecutar muchas cuentas en paralelo). Este es el patrón que automatizan los navegadores anti-detección como GoLogin y Dolphin Anty — consulta nuestra guía de configuración de proxy anti-detección.
Puppeteer configura el servidor proxy como una bandera de inicio de Chromium y luego se autentica en el objeto de la 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 el proxy es una bandera a nivel de proceso, un único navegador Puppeteer usa una sola IP. Para rotar, inicia un navegador nuevo por identidad (más pesado) o gestiona la rotación mediante una pasarela que cambie de IP por conexión.
Cualquier flujo que cree una cookie de sesión debe mantener la misma IP durante toda su vida. Una cookie acuñada en la IP-A que de repente aparece desde la IP-B se interpreta como secuestro de sesión y dispara una reautenticación o un baneo. Mantén un contexto (o un navegador) por cuenta con sesión iniciada, fijado a un solo token de sesión sticky, durante toda la sesión.
Una IP residencial es necesaria pero no suficiente. Los sitios también leen el handshake TLS/JA4 de tu navegador, el orden de los frames HTTP/2, el canvas, el WebGL y las propiedades de navigator. El Chromium headless de fábrica filtra navigator.webdriver = true y una huella headless que derrota a la mejor IP. Mitígalo con plugins stealth y banderas de inicio 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 exactamente qué señales estás filtrando, ejecuta tu navegador automatizado contra el verificador gratuito de huellas JA3/JA4 de JIBAO. Para conocer la mecánica más profunda de por qué los handshakes quedan marcados, lee cómo eludir el fingerprinting TLS y la completa receta para eludir Cloudflare.
headless=False para observar lo que el objetivo realmente le muestra a tu bot.Obtén 500MB de tráfico gratis e IPs residenciales que mantienen a Playwright y Puppeteer fuera de la lista de baneos.
Comenzar Prueba GratisLos nuevos usuarios reciben 500MB al registrarse, más un bono en la primera recarga. Oferta por tiempo limitado.