En Selenium, el proxy se pasa al navegador como argumento, y ahí está el problema: Chrome no acepta usuario y contraseña en --proxy-server. Con la credencial en la dirección, Chrome muestra la ventana de inicio de sesión del proxy, que Selenium no controla.
La solución estable es un proxy local sin contraseña: un pequeño programa en tu máquina recibe la conexión del navegador y la reenvía al proxy de ProxyBox ya con usuario y contraseña. El navegador solo ve 127.0.0.1, sin autenticación. Esto es necesario porque la autenticación de ProxyBox es siempre por usuario y contraseña: no existe autorización por IP.
En el panel, en Mis proxies, copia host, puerto HTTP, usuario y contraseña.
Paso 1 — Inicia el proxy local
Con el paquete pproxy, en Python:
pip install pproxy
pproxy -l http://127.0.0.1:8081 -r "http://p1.ejemplo.com:8000#usuario:contrasena"
-les la dirección local, sin contraseña, que usará el navegador.-res el proxy remoto; la credencial va después de#.
Deja esa terminal abierta. Compruébalo en otra terminal:
curl -x http://127.0.0.1:8081 https://api.ipify.org
La IP que aparece debe ser la de tu proxy, no la de tu conexión.
Paso 2 — Chrome en Selenium
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--proxy-server=http://127.0.0.1:8081")
driver = webdriver.Chrome(options=options)
driver.get("https://api.ipify.org?format=json")
print(driver.find_element("tag name", "body").text)
driver.quit()
Paso 2 (alternativa) — Firefox en Selenium
from selenium import webdriver
options = webdriver.FirefoxOptions()
options.set_preference("network.proxy.type", 1)
options.set_preference("network.proxy.http", "127.0.0.1")
options.set_preference("network.proxy.http_port", 8081)
options.set_preference("network.proxy.ssl", "127.0.0.1")
options.set_preference("network.proxy.ssl_port", 8081)
driver = webdriver.Firefox(options=options)
driver.get("https://api.ipify.org?format=json")
print(driver.find_element("tag name", "body").text)
driver.quit()
Configura http y ssl: sin ssl, los sitios HTTPS salen por tu IP real.
Varios proxies a la vez
Un proxy local por cada proxy remoto, cada uno en un puerto:
pproxy -l http://127.0.0.1:8081 -r "http://p1.ejemplo.com:8000#usuario1:contrasena1"
pproxy -l http://127.0.0.1:8082 -r "http://p2.ejemplo.com:8000#usuario2:contrasena2"
Cada navegador apunta a su puerto. Así cada instancia sale por una IP.
¿Y selenium-wire?
selenium-wire resolvía la autenticación desde Python, pero el proyecto fue archivado y no recibe actualizaciones. Para un proyecto nuevo, prefiere el proxy local de arriba o Playwright, que acepta usuario y contraseña directamente en su API; mira Playwright, Puppeteer y Scrapy.
Errores comunes
- Aparece la ventana de inicio de sesión del proxy y el script se bloquea: la credencial está en
--proxy-server. Pásala al proxy local. ERR_PROXY_CONNECTION_FAILED: el proxy local no está en marcha o el puerto es distinto. Mira ERR_PROXY_CONNECTION_FAILED.- La IP que aparece es la tuya: en Firefox faltó la preferencia
ssl; en Chrome, comprueba que el argumento se aplicó a lasoptionsusadas para crear el driver. - 407 en la terminal de pproxy: la credencial que va después de
#es incorrecta. Mira el error 407.
Lo que el proxy no cambia
El proxy cambia la IP de salida del navegador automatizado. No oculta que el navegador está controlado por Selenium ni cambia la huella digital, y no autoriza a automatizar sitios cuyas condiciones de uso lo prohíben.
Para peticiones sin navegador, el camino es más sencillo: proxy en Python con requests y httpx.