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

Docs · Selenium 4 · Python

Selenium con proxy autenticado: un servicio local que funciona

La opción proxy de Chrome no acepta contraseña. Un pequeño servicio local en 127.0.0.1 añade las credenciales, así Selenium solo ve un proxy local abierto.

Última actualización: · 4 minutos de lectura

Respuesta rápida

¿Cómo uso un proxy con usuario y contraseña en Selenium?

Ejecuta un servicio local pequeño que añade el encabezado Proxy-Authorization y apunta Chrome a él con --proxy-server=http://127.0.0.1:8899. Chrome ignora las credenciales en ese parámetro, y Selenium no tiene opción portátil para contraseñas proxy. Los proxies CrawlRelay residenciales funcionan así en gw.crawlrelay.com:7777, de 0,50 US$/GB. Pagados en crypto, sin KYC.

Configuración rápida de Selenium

Por qué un servicio localLa opción --proxy-server de Chrome no admite usuario ni contraseña
Servicio localEscucha en 127.0.0.1:8899, añade Proxy-Authorization, reenvía a gw.crawlrelay.com:7777
Opción Chrome--proxy-server=http://127.0.0.1:8899
RotaciónCada túnel CONNECT nuevo es una conexión nueva, usualmente una salida nueva; agrega un ID de sesión para una IP
Alternativa más simplePlaywright toma directamente el nombre de usuario y la contraseña

¿Cómo funciona el forwarder local?

Acepta la solicitud de proxy del navegador, inserta un encabezado con tus credenciales y luego copia bytes en ambas direcciones. Para un sitio HTTPS, el navegador envía CONNECT host:443, la puerta de enlace responde 200 Connection established, y TLS se ejecuta de extremo a extremo entre Chrome y el sitio web. El forwarder nunca ve el contenido de la página en texto plano.

Esta versión mínima maneja sitios HTTPS, donde cada conexión lleva un túnel CONNECT. Eso cubre casi todos los sitios web hoy en día. Manténlo ligado a 127.0.0.1 para que ninguna otra máquina pueda usar tus credenciales.

forwarder.py (Python 3.8+, solo librería estándar)
import asyncio
import base64
import os

UPSTREAM = ("gw.crawlrelay.com", 7777)
USER = os.environ.get("CRAWLRELAY_USER", "USERNAME-country-us")
PASSWORD = os.environ.get("CRAWLRELAY_PASSWORD", "PASSWORD")
AUTH = b"Proxy-Authorization: Basic " + base64.b64encode(("%s:%s" % (USER, PASSWORD)).encode())


async def pipe(reader, writer):
    try:
        while True:
            data = await reader.read(65536)
            if not data:
                break
            writer.write(data)
            await writer.drain()
    except ConnectionError:
        pass
    finally:
        writer.close()


async def handle(client_reader, client_writer):
    try:
        head = await client_reader.readuntil(b"\r\n\r\n")  # request line and headers from the browser
    except asyncio.IncompleteReadError:
        client_writer.close()
        return
    lines = head.split(b"\r\n")
    lines.insert(1, AUTH)  # add the credentials right after the request line
    up_reader, up_writer = await asyncio.open_connection(*UPSTREAM)
    up_writer.write(b"\r\n".join(lines))
    await up_writer.drain()
    await asyncio.gather(pipe(client_reader, up_writer), pipe(up_reader, client_writer))


async def main():
    server = await asyncio.start_server(handle, "127.0.0.1", 8899)
    async with server:
        await server.serve_forever()


if __name__ == "__main__":
    asyncio.run(main())

¿Cómo apunto Selenium al forwarder?

Inicia forwarder.py en un terminal, luego ejecuta tu script Selenium con la dirección del proxy local. Selenium Manager, incluido en Selenium 4.6 y versiones posteriores, descarga un ChromeDriver compatible, así que no necesitas instalar nada más.

selenium_example.py
from selenium import webdriver
from selenium.webdriver.common.by import By

options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://127.0.0.1:8899")  # the local forwarder
options.add_argument("--headless=new")

driver = webdriver.Chrome(options=options)
try:
    driver.set_page_load_timeout(60)
    driver.get("https://api.ipify.org")
    print("exit IP:", driver.find_element(By.TAG_NAME, "body").text)
finally:
    driver.quit()

¿Cómo obtengo una IP por sesión de Selenium, o una IP nueva por página?

El forwarder envía el nombre de usuario que le des, así que el comportamiento de la sesión depende de ese usuario:

  • Rotación por conexión: omite la parte de sesión (USERNAME-country-us). Chrome abre varias conexiones por página, así que una sola página puede cargar a través de varias salidas.
  • Una IP por sesión de Selenium: asigna CRAWLRELAY_USER a USERNAME-country-us-session-run42-ttl-30 antes de iniciar el forwarder. Cada conexión entonces sale por la misma IP hasta por 30 minutos; la IP puede cambiar antes.
  • Varias sesiones en paralelo: ejecuta un forwarder por sesión en diferentes puertos locales, como 8899 y 8900, y da a cada WebDriver su propio puerto.

¿Qué pasa con selenium-wire o extensiones de navegador?

selenium-wire, un paquete popular que añadía autenticación de proxy interceptando el tráfico, fue archivado por su autor en enero de 2024 y ya no recibe actualizaciones. Una extensión de navegador que responda a la solicitud de autenticación del proxy también funciona, pero debe estar empaquetada y cargada en cada perfil. El forwarder anterior no tiene dependencias y funciona con cualquier navegador que controle Selenium. Para proyectos nuevos, Playwright es aún más sencillo: toma directamente el nombre de usuario y la contraseña del proxy.

Selenium y proxies: preguntas

¿Por qué Chrome muestra una ventana emergente de inicio de sesión con mi proxy en Selenium?

Porque el proxy pidió credenciales y Chrome no tenía ninguna: su bandera --proxy-server solo acepta host y puerto. En modo headless el mismo problema aparece como ERR_TUNNEL_CONNECTION_FAILED. Usa un forwarder local que añada las credenciales, o cambia a Playwright, que acepta usuario y contraseña.

¿El forwarder ralentiza mi scraping?

Casi nada. Copia bytes entre dos sockets locales y uno remoto, sin descifrar nada. El tiempo que tarda una página depende de la salida residencial y del sitio objetivo, no del forwarder corriendo en la misma máquina.

¿Puedo usar Firefox en lugar de Chrome con Selenium?

Sí. Configura las preferencias del proxy de Firefox con FirefoxOptions: network.proxy.type a 1, y network.proxy.http y network.proxy.ssl a 127.0.0.1 con puerto 8899. Mantén el forwarder delante: Firefox pide credenciales del proxy en un diálogo que Selenium tampoco puede completar de forma fiable.

¿Está segura mi contraseña en el forwarder?

Permanece en tu máquina mientras el forwarder escuche en 127.0.0.1, como en el ejemplo. Léela de variables de entorno, nunca la incluyas en commits, y usa un subusuario dedicado con límite de tráfico para cada scraper para que una contraseña filtrada no agote todo tu plan.

Dale a Selenium un exit residencial

1,50 US$ para 1 GB para probar, 0,50 US$/GB desde 50 GB.

Desde 0,50 US$/GB · sin KYC

Comienza ahora