Socks5Proxy

Configuración de proxy en Selenium: conectar SOCKS5/HTTP a Chrome y Firefox

Esta guía explica cómo conectar el proxy HTTP y SOCKS5 de Socks5Proxy al ejecutar Chrome y Firefox con Selenium 4, y cómo usar la autenticación IP ya que el argumento de ejecución de Chrome no acepta contraseñas de proxy.

¿Por qué es difícil la autenticación de proxy en Selenium?

Chrome acepta la dirección del proxy como argumento de ejecución --proxy-server, pero no acepta el nombre de usuario y la contraseña dentro de esa dirección. Si te conectas a un proxy que requiere nombre de usuario y contraseña, el navegador mostrará una ventana de autenticación, la cual es difícil de completar usando Selenium.

Solución limpia: autorización por IP. Registra IPv4 de tu servidor en el dashboard para omitir credenciales en Chrome (solo ip:port). Máx. 10 IPs permitidos.

El ejemplo usa IP 198.51.100.23, puerto HTTP 8000, puerto SOCKS5 1080.

pip install selenium

¿Cómo conecto un proxy HTTP a Chrome?

Después de registrar la autorización por IP, añade la dirección en el argumento --proxy-server de ChromeOptions. Selenium 4.6 y superior usa Selenium Manager para descargar automáticamente el chromedriver correcto, sin necesidad de instalarlo manualmente.

Los mismos parámetros se aplican incluso en modo headless. Para verificar la conexión, abre una dirección de verificación de IP y comprueba si la IP mostrada es la del proxy.

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

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")  # this machine's IP is authorized in the dashboard
opts.add_argument("--headless=new")

driver = webdriver.Chrome(options=opts)
try:
    driver.get("https://api.ipify.org")
    print(driver.find_element(By.TAG_NAME, "body").text)  # should print the proxy IP
finally:
    driver.quit()

¿Cómo uso un proxy SOCKS5 en Chrome?

Pon la dirección socks5:// en --proxy-server. Chrome usa SOCKS5 para resolver nombres de dominio a través del proxy, pero en algunos entornos puede quedar resolución DNS local, por lo que se suele usar --host-resolver-rules para bloquearla.

SOCKS5 también soporta autorización por IP. Chrome no soporta autenticación por usuario/contraseña en proxies SOCKS.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=socks5://198.51.100.23:1080")
# make sure host names are resolved through the proxy
opts.add_argument('--host-resolver-rules=MAP * ~NOTFOUND , EXCLUDE 198.51.100.23')

driver = webdriver.Chrome(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

¿Cómo me conecto en Firefox?

Firefox especifica el proxy mediante valores de configuración. Establece network.proxy.type en 1 (manual) e ingresa la dirección y el puerto HTTP o SOCKS. Para SOCKS5, establece network.proxy.socks_version en 5 y network.proxy.socks_remote_dns en True para que el proxy resuelva los nombres.

Firefox tampoco tiene un método para ingresar la contraseña del proxy en la configuración de ejecución, por lo que usar autorización IP es la opción más simple.

from selenium import webdriver

opts = webdriver.FirefoxOptions()
opts.set_preference("network.proxy.type", 1)
opts.set_preference("network.proxy.socks", "198.51.100.23")
opts.set_preference("network.proxy.socks_port", 1080)
opts.set_preference("network.proxy.socks_version", 5)
opts.set_preference("network.proxy.socks_remote_dns", True)

driver = webdriver.Firefox(options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

¿Cómo abrir varios navegadores con diferentes IP simultáneamente?

Ejecuta navegadores separados con diferentes proxies. Este ejemplo usa la API para obtener listas ip:port y lanza 3 navegadores con IPs distintas. Ajusta la cantidad según los recursos de tu servidor.

Para tareas prolongadas en el navegador (como mantener una sesión), es recomendable asignar una IP fija por navegador y no cambiarla hasta finalizar la tarea.

import requests
from selenium import webdriver

KEY = "YOUR_API_KEY"
lines = requests.get(
    "https://socks5proxy.io/api/v1/proxies/download",
    params={"format": "ip:port", "protocol": "http"},
    headers={"Authorization": "Bearer " + KEY},
    timeout=30,
).text.split()

drivers = []
for line in lines[:3]:
    opts = webdriver.ChromeOptions()
    opts.add_argument("--headless=new")
    opts.add_argument("--proxy-server=http://" + line)
    drivers.append(webdriver.Chrome(options=opts))

for d in drivers:
    d.get("https://api.ipify.org")
    print(d.page_source)
    d.quit()

¿Qué hacer si es obligatorio usar usuario/contraseña?

En entornos donde no se puede usar autorización por IP, como cuando la IP de salida cambia constantemente, hay dos métodos. El primero es usar una biblioteca de proxy intermedia como selenium-wire para insertar la información de autenticación. El segundo es ejecutar un proxy local sin autenticación en el mismo servidor, conectando Chrome a la dirección local y el proxy local a Socks5Proxy con nombre de usuario y contraseña.

Ambos métodos añaden un componente más a gestionar. Si es posible, usar IP authorization desde un servidor con IP fija es la opción más simple y rápida.

¿Qué configuraciones necesito para adaptar el navegador a un país específico?

Cambia el argumento --lang de Chrome y la configuración de Accept-Language según el país de la IP para que las páginas se abran en el idioma de ese país. Para sitios donde la zona horaria es importante, puedes ajustarla con el comando CDP Emulation.setTimezoneOverride.

Define el tamaño de la ventana con el argumento --window-size, y si necesitas una pantalla de móvil, usa la configuración de emulación de dispositivo móvil. Almacena estos valores en paquetes de configuración por país para ejecutar pruebas consistentes en múltiples países.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")
opts.add_argument("--lang=de-DE")
opts.add_argument("--window-size=1366,900")

driver = webdriver.Chrome(options=opts)
driver.execute_cdp_cmd("Emulation.setTimezoneOverride", {"timezoneId": "Europe/Berlin"})
driver.get("https://example.com/")
driver.quit()

¿Funciona igual en Selenium Grid o navegadores remotos?

Sí. ChromeOptions y FirefoxOptions funcionan igual en ejecución remota. Al pasar las mismas opciones a webdriver.Remote, el navegador en el nodo Grid usará ese proxy. Para autorización por IP, registra la IP de salida del nodo Grid donde se ejecuta el navegador, no la de tu PC.

Si tienes varios nodos, registra todas sus IPs. Puedes registrar hasta 10. Si tus nodos en la nube cambian frecuentemente, asignar IPs fijas facilita la gestión.

from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.add_argument("--proxy-server=http://198.51.100.23:8000")  # authorize the Grid node IP, not this machine
driver = webdriver.Remote(command_executor="http://grid.example.internal:4444", options=opts)
driver.get("https://api.ipify.org")
print(driver.page_source)
driver.quit()

¿Qué verificar si la conexión falla?

ERR_PROXY_CONNECTION_FAILED suele ocurrir cuando la dirección o el puerto son incorrectos. Asegúrate de no haber puesto un puerto SOCKS5 en una dirección HTTP. Si aparece ERR_TUNNEL_CONNECTION_FAILED o una ventana de autenticación, es posible que la IP registrada en la autorización IP no coincida con la IP real. Usa cURL en el servidor para abrir api.ipify.org sin proxy y registra la IP que aparece.

Los servidores en la nube pueden cambiar la IP de salida al reiniciarse. Usa una IP fija o cambia la lista registrada en el dashboard cuando cambie la IP.

Configuración de proxy en Selenium: conectar Chrome/Firefox | Socks5Proxy