Configuración de proxy en Playwright, conexión de diferentes IPs por navegador y contexto
Esta guía explica cómo conectar el proxy HTTP y SOCKS5 de Socks5Proxy con las opciones proxy de Playwright usando server, username y password, y cómo usar diferentes IP por contexto en un solo navegador con código en Node.js y Python.
¿Qué es más conveniente en la configuración de proxy de Playwright?
Playwright recibe la dirección del proxy, el nombre de usuario y la contraseña en una sola opción proxy, por lo que no es necesario manejar la ventana de autenticación por separado. Los tres navegadores, Chromium, Firefox y WebKit, usan la misma opción.
También puedes ejecutar un solo navegador con múltiples contextos, cada uno con un proxy diferente. Los contextos son perfiles independientes con cookies y almacenamiento separados, permitiendo manejar múltiples IPs y sesiones con un solo navegador y ahorrando memoria.
El ejemplo usa IP 198.51.100.23, puerto HTTP 8000, puerto SOCKS5 1080, usuario spx_user, contraseña spx_pass.
npm install playwright
npx playwright install chromium¿Cómo configuro un proxy HTTP para todo el navegador?
En la opción proxy de launch, añade server, username y password, y todas las páginas de ese navegador usarán el mismo proxy. Los sitios HTTPS se transmiten a través de un túnel CONNECT cifrado.
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();¿Cómo usar diferentes IPs por contexto?
Al añadir la opción proxy a newContext, solo ese contexto usará ese proxy. El siguiente código obtiene una lista a través de la API, crea 3 contextos con diferentes IP y muestra la IP visible en cada contexto. Para manejar múltiples cuentas simultáneamente, empareja una cuenta y una IP por contexto.
Algunas versiones de Chromium y entornos Windows requieren que la opción proxy también esté en launch para usar proxies por contexto. En esos casos, puedes poner el primer proxy en launch y sobrescribirlo para cada 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();¿Cómo usar proxies SOCKS5?
Solo necesitas añadir la dirección socks5:// a server. Chromium no admite autenticación con nombre de usuario y contraseña en SOCKS5, por lo que se recomienda usar autorización IP. Registra la IPv4 del servidor de ejecución en el dashboard y usa solo server sin username ni password.
Para conexiones con usuario/contraseña, usa el puerto HTTP de la misma IP. El sitio objetivo verá la misma IP y ubicación.
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();¿Cómo se usa en Python?
Playwright para Python tiene la misma estructura. Coloca server, username y password en el diccionario proxy. He incluido un ejemplo sincrónico a continuación. Los nombres de las opciones son los mismos en el modo asincrónico.
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()¿Qué debo ajustar para que los resultados parezcan de usuarios de ese país?
Configura el locale y el timezoneId del contexto según el país de la IP para que las páginas se muestren en el idioma y la hora que verían los usuarios de ese país. Por ejemplo, para una IP alemana, usa locale de-DE y timezoneId Europe/Berlin.
Si no necesitas imágenes o videos, puedes usar page.route para bloquear esas solicitudes y ahorrar ancho de banda y tiempo. Esto es especialmente útil en planes compartidos, que tienen un límite mensual de ancho de banda.
- Ajustar locale y timezoneId según el país de la IP
- Un contexto, una cuenta, una IP
- Bloquear solicitudes de imágenes/videos innecesarias con page.route
- SOCKS5 usa autorización por IP, usuario/contraseña es para el puerto HTTP
¿Cómo puedo automatizar la descarga y división de listas para diferentes tareas?
GET /proxies de la API devuelve en JSON cada línea con IP, puerto y país. Al filtrar por país, puedes crear listas específicas para trabajos por país. Este código es un ejemplo que crea contextos para proxies estadounidenses según el número de trabajos. Los nombres de los campos de respuesta están en la documentación de la API.
Para múltiples tareas, cierra los contextos al finalizar para liberar memoria.
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();¿Cómo ahorrar ancho de banda bloqueando solicitudes innecesarias?
Bloquear solicitudes de imágenes, fuentes y videos con page.route o context.route hace que las páginas se carguen más rápido y ahorra ancho de banda del proxy. Es especialmente efectivo en tareas de recopilación donde solo se necesitan datos.
await context.route("**/*", (route) => {
const type = route.request().resourceType();
return ["image", "font", "media"].includes(type) ? route.abort() : route.continue();
});¿Se usa el mismo proxy en Firefox y WebKit?
Sí. Playwright acepta la misma opción proxy para los tres navegadores. Para equipos de prueba, puedes abrir Chromium, Firefox y WebKit sucesivamente con el mismo proxy y verificar si las páginas por país son iguales en cada navegador.
Firefox, al igual que Chromium, no admite autenticación por nombre de usuario y contraseña para SOCKS5 en el navegador, por lo que debes conectarte usando autorización IP. El puerto HTTP se conecta con nombre de usuario y contraseña en los tres navegadores.
Si usas Playwright Test, puedes agregar proxy en la sección use de playwright.config para aplicarlo a todas las pruebas o dividir el proyecto por país y asignar diferentes proxies a cada uno.
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" } } },
],
});¿Cómo soluciono errores comunes?
net::ERR_PROXY_CONNECTION_FAILED ocurre si la dirección del servidor o el puerto son incorrectos. 407 o errores relacionados con la autenticación, verifica los valores de username y password. El error 'Browser does not support socks5 proxy authentication' ocurre si usas nombre de usuario y contraseña con SOCKS5. Cambia a autorización IP o usa el puerto HTTP.