Proxy con SeleniumBase: autenticación y rotación

Publicado:

2 min de lectura

Acar Diveroli
Autor: Acar Diveroli
Proxy con SeleniumBase

SeleniumBase es un marco de pruebas construido sobre Selenium, y acepta proxies con credenciales. Eso es justo lo que Selenium por sí solo no consigue, y por eso el rodeo merece la pena en cualquier trabajo de scraping.

El problema de los proxies en Selenium

Selenium puede fijar un proxy, pero no autenticarse en él: Chrome ignora el usuario y la contraseña en el argumento --proxy-server y abre en su lugar una ventana de acceso que el WebDriver no puede rellenar. La herramienta que antes cubría ese hueco, SeleniumWire, lleva tiempo sin mantenimiento y ya no es recomendable.

Primeros pasos

Instalación

bash
pip install seleniumbase

Un caso de prueba

La siguiente prueba pide la información en JSON de IPinfo y la escribe en la consola: así ves de inmediato qué dirección se muestra hacia fuera.

python
from seleniumbase import BaseCase
from selenium.webdriver.common.by import By
import json

class ProxyTest(BaseCase):
    def test_proxy(self):
        # Abrir la página
        self.driver.get("https://ipinfo.io/json")

        # Leer la respuesta JSON
        location_info = json.loads(self.driver.find_element(By.TAG_NAME, "body").text)

        # Imprimir el contenido
        for k, v in location_info.items():
            print(f"{k}: {v}")

Ejecutar la prueba

Se lanza con pytest.

Sin proxy

bash
pytest proxy_test.py -s

En la consola aparecen tu propia IP y tu ubicación.

Con proxy

bash
pytest proxy_test.py --proxy=USUARIO:CONTRASENA@pr.proxynet.io:8000 -s

El usuario, la contraseña, el nombre de host y el puerto están en tu panel de Proxynet. La salida se parece a esto:

=================================== test session starts ===================================
platform linux -- Python 3.10.12, pytest-8.3.4, pluggy-1.5.0
plugins: seleniumbase-4.34.6, rerunfailures-15.0, xdist-3.6.1
collected 1 item

proxy_test.py ip: 144.202.4.246
hostname: 144-202-4-246.pxnet.io
city: Piscataway
region: New Jersey
country: US
timezone: America/New_York
.

==================================== 1 passed in 3.25s ====================================

La dirección ha cambiado y no ha aparecido ninguna ventana de acceso: ese es todo el propósito.

Rotar proxies

Con lo que trae Python de serie montas una rotación sencilla. El script siguiente lanza la misma prueba una vez por país:

python
import subprocess

USER = "USUARIO"
PASSWORD = "CONTRASENA"

# Países desde los que debe salir la petición
countries = ["us", "es", "gb", "tr"]

for country in countries:
    # En Proxynet el país de destino va dentro del nombre de usuario
    proxy = f"{USER}-country-{country}:{PASSWORD}@pr.proxynet.io:8000"
    subprocess.run(f"pytest proxy_test.py --proxy={proxy} -s", shell=True)

La forma exacta de indicar el país está en tu panel y cambia según el producto. Cómo resolver lo mismo dentro de un script, en vez de desde la línea de comandos, lo explicamos en Cómo rotar proxies en Python.

Conclusión

Con SeleniumBase, una prueba de Selenium sale por un proxy con autenticación, comprueba la ubicación visible y la cambia entre ejecuciones: tres cosas que con Selenium a secas cuestan bastante más trabajo.

Cuáles de nuestros productos de proxy sirven para esto: