Sin KYC — sin ID, sin selfie, sin documentos. Paga con criptomonedas: BTC, USDT, USDC, ETH, SOL, LTC
Idioma: Español
Comienza ahora

Docs · Playwright · Chromium, Firefox, WebKit

Configuración de proxy Playwright con IPs residenciales rotativas (Python y Node.js)

Asigna el proxy al iniciar para una salida por navegador, o por contexto para un país o una sesión sticky por contexto. Luego reduce el tráfico bloqueando lo que no necesitas.

Última actualización: · 5 minutos de lectura

Respuesta rápida

¿Cómo uso un proxy autenticado en Playwright?

Pasa un objeto proxy con server, username y password a launch() o a new_context(): server es http://gw.crawlrelay.com:7777, y las credenciales van en sus campos respectivos, nunca en la URL del servidor. Con proxies residenciales CrawlRelay, pon el país y un ID de sesión en el nombre de usuario para darle a cada contexto su propia salida. El tráfico cuesta 0,50 US$/GB desde 50 GB. Se paga con criptomonedas, sin KYC.

Configuración de Playwright de un vistazo

Opción de proxy{"server": "http://gw.crawlrelay.com:7777", "username": ..., "password": ...}
Dóndelaunch(proxy=...) para todo el navegador, o new_context(proxy=...) por contexto
PuertoPuerto HTTP 7777; los sitios HTTPS usan CONNECT
SOCKS5Chromium no soporta autenticación SOCKS5: usa el puerto HTTP
Una IP por contexto-session-<id>-ttl-<minutes> en el nombre de usuario del contexto
Costo típico de páginaUnos 2 MB con cada recurso; unos pocos cientos de KB si se bloquean imágenes, fuentes y medios

¿Cómo dar a cada contexto de navegador su propio país o sesión?

Crea un contexto por país o por sesión sticky. Los contextos son baratos comparados con los navegadores y cada uno mantiene sus cookies, almacenamiento y credenciales de proxy. Ajusta la configuración regional del contexto al país de salida para que el sitio vea un visitante coherente.

Python (API síncrona): un contexto por país
from playwright.sync_api import sync_playwright

GATEWAY = "http://gw.crawlrelay.com:7777"
LOCALES = {"us": "en-US", "de": "de-DE", "jp": "ja-JP"}

with sync_playwright() as p:
    browser = p.chromium.launch()
    for country, locale in LOCALES.items():
        context = browser.new_context(
            proxy={"server": GATEWAY, "username": "USERNAME-country-%s" % country, "password": "PASSWORD"},
            locale=locale,
        )
        page = context.new_page()
        page.goto("https://api.ipify.org", wait_until="domcontentloaded")
        print(country, page.inner_text("body"))
        context.close()
    browser.close()

¿Cómo configuro el proxy en Playwright para Node.js y reduzco tráfico?

La opción es igual en Node.js. La mayor parte del peso de una página renderizada son imágenes, fuentes y medios: la página mediana pesó 2.164 KB en móvil según HTTP Archive Web Almanac 2025. Si solo necesitas texto y enlaces, cancela esas solicitudes con un manejador de rutas.

Node.js: sesión sticky al inicio, recursos pesados bloqueados
import { chromium } from "playwright";

const browser = await chromium.launch({
  proxy: {
    server: "http://gw.crawlrelay.com:7777",
    username: "USERNAME-country-us-session-pw1-ttl-30",
    password: "PASSWORD",
  },
});
const context = await browser.newContext();
// Images, fonts and media are most of a page's bytes
await context.route("**/*", (route) =>
  ["image", "font", "media"].includes(route.request().resourceType()) ? route.abort() : route.continue()
);
const page = await context.newPage();
const response = await page.goto("https://example.com/", { waitUntil: "domcontentloaded" });
console.log(response.status(), await page.title());
await browser.close();

¿Cómo ejecuto muchas páginas en paralelo con asyncio?

Usa la API asíncrona con un pool fijo de contextos. Cada contexto mantiene una sesión sticky durante su vida útil, así el sitio ve pocos visitantes estables en lugar de una IP por solicitud. Recicla un contexto con un nuevo ID de sesión después de un número fijo de páginas o tras un error.

Python (API asíncrona): un pool de contextos sticky
import asyncio
import uuid

from playwright.async_api import async_playwright

GATEWAY = "http://gw.crawlrelay.com:7777"
WORKERS = 4


async def worker(browser, queue):
    session = uuid.uuid4().hex[:10]
    context = await browser.new_context(proxy={
        "server": GATEWAY,
        "username": "USERNAME-country-us-session-%s-ttl-30" % session,
        "password": "PASSWORD",
    })
    page = await context.new_page()
    while not queue.empty():
        url = await queue.get()
        try:
            response = await page.goto(url, wait_until="domcontentloaded", timeout=45000)
            print(session, url, response.status if response else None)
        except Exception as exc:  # timeouts and network errors: log and move on
            print(session, url, type(exc).__name__)
        finally:
            queue.task_done()
    await context.close()


async def main(urls):
    queue = asyncio.Queue()
    for url in urls:
        queue.put_nowait(url)
    async with async_playwright() as p:
        browser = await p.chromium.launch()
        await asyncio.gather(*(worker(browser, queue) for _ in range(WORKERS)))
        await browser.close()


asyncio.run(main(["https://example.com/", "https://example.org/"]))

¿Por qué obtengo ERR_TUNNEL_CONNECTION_FAILED o ERR_PROXY_CONNECTION_FAILED?

  • net::ERR_TUNNEL_CONNECTION_FAILED significa que el proxy no aceptó la petición CONNECT. Lo más común es que las credenciales se pusieran dentro de server en lugar de username y password, así Chromium no envió ninguna. Consulta el error de túnel.
  • net::ERR_PROXY_CONNECTION_FAILED significa que el navegador nunca llegó al gateway: error en host o puerto, o red que bloquea el puerto. Consulta el error de conexión proxy.
  • Timeout excedido 30000ms en goto suele ocurrir si esperas load o networkidle en una página que sigue cargando trackers. Espera domcontentloaded y luego el selector que necesites.

¿Qué no debe hacer un scraper con Playwright?

Usa Playwright para renderizar páginas públicas que requieren JavaScript, no para suplantar personas. La Política de Uso Aceptable de CrawlRelay] prohíbe crear cuentas masivas, tomar control de cuentas, resolver CAPTCHA automáticamente o evadir bloqueos deliberados mediante navegadores a través de nuestro gateway. No documentamos plugins stealth ni el spoofing de huellas digitales. Si un sitio desafía tu navegador, frena, revisa su robots.txt y términos, y pide acceso o usa su API.

Playwright y proxies: preguntas frecuentes

¿Puedo usar un proxy distinto para cada contexto de Playwright?

Sí. Pasa proxy a browser.new_context() en Python o browser.newContext() en Node.js. Cada contexto tendrá su propia salida, cookies y almacenamiento. En versiones antiguas de Playwright para Windows también se requería proxy al inicio; si ves ese error, lanza con un proxy genérico y luego configura el real por contexto.

¿Playwright soporta proxies SOCKS5 con autenticación?

No en Chromium, que no soporta autenticación SOCKS5 con usuario y contraseña. Usa el puerto HTTP del gateway (7777): maneja sitios HTTPS vía túneles CONNECT y soporta usuario y contraseña en todos los motores de navegador que controle Playwright.

¿Cómo verifico qué IP y país usa una página Playwright?

Abre https://api.ipify.org en el mismo contexto antes del objetivo y lee el texto del cuerpo, como en el primer ejemplo. Ten en cuenta que una sesión sticky mantiene esa IP solo mientras el dispositivo residencial esté en línea; registra la IP al iniciar cada contexto para detectar cambios.

¿Cuánto tráfico usa una página Playwright a través de un proxy?

Todo se factura: HTML, scripts, estilos, imágenes, fuentes y llamadas API. Una página completa pesa unos 2 MB aprox.; bloquear imágenes, fuentes y medios reduce a algunos cientos de KB. Mide tus páginas reales sumando tamaños de respuesta en un manejador response para 50 páginas.

¿Debo usar navegadores headless o con interfaz para scraping?

Headless es la opción habitual en servidores y consume menos recursos. Usa un navegador con interfaz solo para depurar lo que muestra una página. Ninguno cambia las reglas: renderiza páginas públicas con respeto y cumple el robots.txt y términos del sitio.

Renderiza páginas públicas a través de proxies residenciales

5,94 US$ para 10 GB, 0,50 US$/GB de 50 GB.

Desde 0,50 US$/GB · sin KYC

Comienza ahora