Playwright permite la configuración de proxy para scripts de Python y Node.js principalmente a través de las opciones browserType.launch() o browser.newContext(), permitiendo la especificación de la dirección del servidor proxy, el puerto y las credenciales de autenticación. Esta configuración dirige todas las solicitudes de red subsiguientes desde la instancia del navegador o el contexto lanzado a través del proxy especificado.
Resumen de la Configuración de Proxy de Playwright
Playwright soporta configuraciones de proxy en dos niveles principales:
- Nivel de Lanzamiento del Navegador: Aplicar un proxy a toda la instancia del navegador. Todos los contextos y páginas creados dentro de este navegador usarán el proxy especificado. Esto es adecuado cuando todas las tareas de automatización requieren el mismo proxy.
- Nivel de Contexto del Navegador: Aplicar un proxy a un contexto de navegador específico. Esto permite que diferentes contextos dentro de la misma instancia del navegador utilicen diferentes proxies, o que algunos contextos no utilicen ningún proxy, lo cual es beneficioso para gestionar diversos escenarios de scraping o pruebas.
El objeto o diccionario de configuración de proxy de Playwright típicamente incluye la dirección del server (por ejemplo, http://proxy.example.com:8080, socks5://localhost:9050), y opcionalmente username y password para proxies autenticados.
Tipos de Proxy Soportados
Playwright soporta protocolos de proxy estándar:
- Proxies HTTP: Especificados con esquemas
http://ohttps://. - Proxies SOCKS: Especificados con esquemas
socks5://osocks4://.
Cuando se omite el esquema (por ejemplo, proxy.example.com:8080), Playwright asume un proxy HTTP por defecto. Se recomienda especificar explícitamente el esquema para mayor claridad y para asegurar que se utilice el protocolo correcto.
Configuración de Proxy de Playwright en Python
En Python, la configuración del proxy se pasa como un diccionario al argumento proxy de browser_type.launch() o browser.new_context().
Configuración Básica de Proxy HTTP/HTTPS
Para usar un proxy HTTP o HTTPS no autenticado:
from playwright.sync_api import sync_playwright
# Para proxy a nivel de navegador
with sync_playwright() as p:
browser = p.chromium.launch(proxy={"server": "http://your.proxy.server:8080"})
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.content())
browser.close()
# Para proxy específico del contexto
with sync_playwright() as p:
browser = p.chromium.launch()
context = browser.new_context(proxy={"server": "http://another.proxy.server:8080"})
page = context.new_page()
page.goto("https://httpbin.org/ip")
print(page.content())
context.close()
browser.close()
Configuración de Proxy HTTP/HTTPS Autenticado
Para proxies que requieren autenticación, incluya las claves username y password en el diccionario del proxy:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": "http://user.proxy.server:8080",
"username": "proxy_user",
"password": "proxy_password"
}
)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.content())
browser.close()
Configuración de Proxy SOCKS
Especifique el protocolo SOCKS en la cadena server:
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={"server": "socks5://your.socks.proxy:9050"}
)
page = browser.new_page()
page.goto("https://httpbin.org/ip")
print(page.content())
browser.close()
Los proxies SOCKS también soportan autenticación añadiendo username y password al diccionario.
Omitir el Proxy para Dominios Específicos
La clave bypass en el diccionario del proxy permite especificar una lista separada por comas de hosts o dominios que no deben usar el proxy. Se soportan comodines (*).
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(
proxy={
"server": "http://your.proxy.server:8080",
"bypass": "*.local, .example.com, 192.168.1.1"
}
)
page = browser.new_page()
page.goto("http://example.com") # Omitirá el proxy si example.com está en la lista de bypass
page.goto("https://google.com") # Usará el proxy
browser.close()
Configuración de Proxy de Playwright en Node.js
En Node.js, la configuración del proxy se pasa como un objeto a la propiedad proxy de browserType.launch() o browser.newContext().
Configuración Básica de Proxy HTTP/HTTPS
Para usar un proxy HTTP o HTTPS no autenticado:
const { chromium } = require('playwright');
(async () => {
// Para proxy a nivel de navegador
const browser = await chromium.launch({
proxy: {
server: 'http://your.proxy.server:8080'
}
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.content());
await browser.close();
// Para proxy específico del contexto
const browser2 = await chromium.launch();
const context = await browser2.newContext({
proxy: {
server: 'http://another.proxy.server:8080'
}
});
const page2 = await context.newPage();
await page2.goto('https://httpbin.org/ip');
console.log(await page2.content());
await context.close();
await browser2.close();
})();
Configuración de Proxy HTTP/HTTPS Autenticado
Para proxies que requieren autenticación, incluya las propiedades username y password en el objeto del proxy:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'http://user.proxy.server:8080',
username: 'proxy_user',
password: 'proxy_password'
}
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.content());
await browser.close();
})();
Configuración de Proxy SOCKS
Especifique el protocolo SOCKS en la cadena server:
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'socks5://your.socks.proxy:9050'
}
});
const page = await browser.newPage();
await page.goto('https://httpbin.org/ip');
console.log(await page.content());
await browser.close();
})();
Los proxies SOCKS también soportan autenticación añadiendo username y password al objeto.
Omitir el Proxy para Dominios Específicos
La propiedad bypass en el objeto del proxy permite especificar una lista separada por comas de hosts o dominios que no deben usar el proxy. Se soportan comodines (*).
const { chromium } = require('playwright');
(async () => {
const browser = await chromium.launch({
proxy: {
server: 'http://your.proxy.server:8080',
bypass: '*.local, .example.com, 192.168.1.1'
}
});
const page = await browser.newPage();
await page.goto('http://example.com'); // Omitirá el proxy si example.com está en la lista de bypass
await page.goto('https://google.com'); // Usará el proxy
await browser.close();
})();
Comparación de la Configuración de Proxy de Playwright
| Característica/Lenguaje | Python (dict) |
Node.js (object) |
Descripción |
|---|---|---|---|
| Servidor | {"server": "http://host:port"} |
{ server: "http://host:port" } |
Requerido. Dirección y puerto del proxy, con esquema opcional. |
| Nombre de usuario | {"username": "user"} |
{ username: "user" } |
Opcional. Para proxies autenticados. |
| Contraseña | {"password": "pass"} |
{ password: "pass" } |
Opcional. Para proxies autenticados. |
| Bypass | {"bypass": "*.local,domain.com"} |
{ bypass: "*.local,domain.com" } |
Opcional. Lista separada por comas de hosts/dominios para omitir el proxy. |
| Nivel de Lanzamiento | browser_type.launch(proxy={...}) |
browserType.launch({ proxy: {...} }) |
Aplica el proxy a toda la instancia del navegador. |
| Nivel de Contexto | browser.new_context(proxy={...}) |
browser.newContext({ proxy: {...} }) |
Aplica el proxy a un contexto de navegador específico. |
Consideraciones Avanzadas del Proxy
Proxying de Solicitudes Específicas con page.route()
Para un control altamente granular, page.route() puede interceptar solicitudes de red y reenviarlas a diferentes proxies basándose en criterios específicos. Este método proporciona más flexibilidad que las configuraciones de proxy globales o a nivel de contexto, pero requiere un manejo manual de las solicitudes.
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
def handle_route(route):
if "example.com" in route.request.url:
route.fulfill(status=200, body="Blocked by route handler.")
else:
# Reenviar otras solicitudes a través de un proxy específico
# Esto requiere una configuración manual del cliente HTTP o podría ser complejo para el proxying directo
# Para casos de uso simples, se prefiere el proxy global/de contexto.
# Para un enrutamiento de proxy complejo, considere usar un gestor de proxy externo.
route.continue_({"url": route.request.url}) # Ejemplo: continuar sin modificación
page.route("**/*", handle_route)
page.goto("https://www.google.com") # Será enrutado
page.goto("https://www.example.com") # Será completado
browser.close()
page.route() se usa generalmente para simular, modificar solicitudes o bloquear, en lugar de redirigir dinámicamente a diferentes proxies, a menos que se integre con una lógica de manejo de proxy personalizada.
Verificación de la Funcionalidad del Proxy
Después de configurar un proxy, verifique su funcionamiento navegando a un servicio de verificación de dirección IP, como https://httpbin.org/ip o https://whatismyipaddress.com/. La dirección IP mostrada debe corresponder al servidor proxy, no a la máquina local.
Manejo de Errores y Tiempos de Espera del Proxy
Los proxies pueden introducir puntos adicionales de fallo. Implemente un manejo de errores robusto para las solicitudes de red cuando use proxies. Esto incluye:
- Reintentos: Intentar la solicitud de nuevo si una conexión de proxy falla o expira.
- Tiempos de espera: Configurar tiempos de espera de red apropiados para las operaciones de Playwright.
- Rotación de Proxy: Para operaciones a gran escala, rote a través de un pool de proxies para mitigar la limitación de velocidad, las prohibiciones de IP o los fallos de un solo proxy. Esto típicamente implica gestionar una lista de proxies y actualizar la configuración
proxydinámicamente para nuevos contextos o reintentos.
Consideraciones de Seguridad
Cuando use proxies autenticados, evite codificar las credenciales directamente en el código fuente. En su lugar, use variables de entorno o un sistema de gestión de configuración seguro para recuperar username y password. Esto previene la exposición de credenciales y simplifica la gestión de credenciales en diferentes entornos.