🥳Únase a la Comunidad Scrapeless y Solicite su prueba gratuita para acceder a nuestro potente kit de herramientas de Web Scraping.
Volver al blog

Usando un Proxy en Python con Selenium

James Thompson
James Thompson

Scraping and Proxy Management Expert

12-Sep-2024

¿Has sido identificado como un bot que utiliza Selenium para el raspado web?

Comprensible. Aunque Selenium es una gran herramienta para raspar páginas web dinámicas, no puede funcionar contra sofisticadas defensas anti-bot por sí solo. Puedes agregar un proxy a tu raspador Selenium para controlar las limitaciones de velocidad, evitar las restricciones geográficas y prevenir las prohibiciones de IP.

Proxy Selenium: ¿Qué es?

Un proxy actúa como intermediario entre un cliente y un servidor. Al usarlo, el cliente evita las limitaciones geográficas y envía solicitudes anónimas y seguras a otros servidores.

Los servidores proxy se pueden utilizar con navegadores sin cabeza de la misma manera que los clientes HTTP. Al acceder a sitios web, un proxy Selenium ayuda a proteger tu dirección IP y evita las prohibiciones.

Selenium con soporte de proxy es muy útil para tareas de automatización del navegador, como el raspado de sitios y las pruebas. ¡Sigue leyendo para descubrir cómo configurar un proxy en Selenium para el raspado web!

Cómo configurar un proxy Selenium

La siguiente línea de código carga un controlador Chrome sin cabeza y navega a httpbin, un sitio web que proporciona la dirección IP del cliente. El script imprime la respuesta HTML al final.

language Copy
# pip install selenium webdriver-manager
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options

# establecer las opciones de Chrome para ejecutar en modo sin cabeza
options = Options()
options.add_argument("--headless=new")

# inicializar el controlador Chrome
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    options=options
)

# navegar a la página web de destino
driver.get("https://httpbin.io/ip")

# imprimir el HTML de la página web de destino
print(driver.page_source)

# liberar los recursos y cerrar el navegador
driver.quit()

El código imprimirá el siguiente HTML:

language Copy
<html><head><meta name="color-scheme" content="light dark"><meta charset="utf-8"></head><body><pre>{
  "origin": "50.217.226.40:80"
}
</pre><div class="json-formatter-container"></div></body></html>

En Selenium, para configurar un proxy, debes:

  • Obtener un servidor proxy confiable
  • Ingresarlo en el campo --proxy-server de la opción Chrome
  • Ir a la página que deseas visitar.

Primero, visita el sitio web Free Proxy List para obtener una dirección de proxy gratuita. Configura Selenium con Options de modo que se use un proxy para abrir Chrome. Luego, imprime el texto del cuerpo de la página web de destino.

language Copy
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

# definir la dirección y el puerto del proxy
proxy = "20.235.159.154:80"

# establecer las opciones de Chrome para ejecutar en modo sin cabeza usando un proxy
options = Options()
options.add_argument("--headless=new")
options.add_argument(f"--proxy-server={proxy}")

# inicializar el controlador Chrome
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    options=options
)

# navegar a la página web de destino
driver.get("https://httpbin.io/ip")

# imprimir el contenido del cuerpo de la página web de destino
print(driver.find_element(By.TAG_NAME, "body").text)

# liberar los recursos y cerrar el navegador
driver.quit()

Ahora, cada solicitud realizada por la instancia controlada de Chrome se enrutará a través del proxy designado.

La IP del servidor proxy y la respuesta del sitio coinciden. Esto indica que Selenium está utilizando el servidor proxy para ver sitios web.

Autenticación de proxy en Selenium

Ciertos servidores proxy utilizan la autenticación para evitar que los usuarios sin credenciales válidas accedan a sus servidores. Ese suele ser el caso cuando se utilizan proxies premium o soluciones comerciales.

La siguiente es la sintaxis de Selenium para proporcionar un nombre de usuario y una contraseña en una URL de proxy autenticada:

language Copy
<PROTOCOLO_PROXY>://<TU_NOMBRE_DE_USUARIO>:<TU_CONTRASEÑA>@<DIRECCION_IP_PROXY>:<PUERTO_PROXY>

Sin embargo, debido a que el controlador Chrome ignora el nombre de usuario y la contraseña de forma predeterminada, ingresar una URL en --proxy-server no funcionará. Un complemento de terceros como Selenium Wire puede ayudar en esta situación.

Con la ayuda de Selenium Wire, puedes modificar las solicitudes del navegador a tu gusto y tener acceso a las propias solicitudes. Para instalarlo, utiliza el comando que se muestra a continuación:

language Copy
pip install blinker==1.7.0 selenium-wire

Para manejar la autenticación de proxy, usa Selenium Wire, como se muestra a continuación:

language Copy
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

# configurar el proxy
proxy_username = "<TU_NOMBRE_DE_USUARIO>"
proxy_password = "<TU_CONTRASEÑA>"
proxy_address = "20.235.159.154"
proxy_port = "80"

# formular la URL del proxy con autenticación
proxy_url = f"http://{proxy_username}:{proxy_password}@{proxy_address}:{proxy_port}"

# establece las opciones de selenium-wire para usar el proxy
seleniumwire_options = {
    "proxy": {
        "http": proxy_url,
        "https": proxy_url
    },
}

# establece las opciones de Chrome para ejecutar en modo sin cabeza
options = Options()
options.add_argument("--headless=new")

# inicializa el controlador de Chrome con el servicio, las opciones de selenium-wire y las opciones de Chrome
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    seleniumwire_options=seleniumwire_options,
    options=options
)

# navega a la página web de destino
driver.get("https://httpbin.io/ip")

# imprime el contenido del cuerpo de la página web de destino
print(driver.find_element(By.TAG_NAME, "body").text)

# libera los recursos y cierra el navegador
driver.quit()

¿Estás cansado de los bloqueos continuos de la raspado web?

Scrapeless: ¡la mejor solución de raspado online todo en uno disponible!

Mantente anónimo y evita las prohibiciones basadas en IP con nuestra rotación inteligente y de alto rendimiento de proxy:

¡Pruébalo gratis!

Los mejores protocolos de proxy de Selenium

Las alternativas más populares para seleccionar un protocolo para un proxy de Selenium son HTTP, HTTPS y SOCKS5.

Los proxies HTTPS añaden un grado adicional de seguridad al cifrar los datos que transfieren a través de Internet, en contraste con los proxies HTTP. Por lo tanto, este último es más favorecido y seguro.

SoCKS5, o SOCKS, es otro protocolo útil para los proxies de Selenium. Es un protocolo más flexible ya que puede gestionar una mayor variedad de tráfico online, como los protocolos de correo electrónico y transferencia de archivos.

En definitiva, el raspado web y el rastreo se benefician en gran medida de los proxies HTTP y HTTPS, mientras que las tareas de tráfico no HTTP son un ajuste adecuado para SOCKS.

Utiliza un proxy rotatorio en Python para Selenium

Si tu script envía varias consultas en un breve periodo de tiempo, el servidor puede marcarlo como sospechoso y prohibir tu IP. Tienes menos éxito raspando datos cuando intentas usar direcciones IP específicas, ya que los sitios web pueden identificar y bloquear las solicitudes de esas direcciones.

No obstante, este problema puede resolverse empleando una estrategia de proxy rotatorio. Después de un cierto tiempo o número de solicitudes, tu IP final cambiará continuamente como resultado de cambiar de proxy. Esto te evita ser baneado por el servidor haciéndote parecer un usuario distinto cada vez.

Veamos cómo usar selenium-wire para crear un rotatorio de proxy en Selenium.

Es necesario primero establecer un pool de proxies. En este ejemplo, utilizaremos varios proxies gratuitos.

Como sigue, ponlos en una matriz:

language Copy
PROXIES = [
    "http://19.151.94.248:88",
    "http://149.169.197.151:80",
    # ...
    "http://212.76.118.242:97"
]

A continuación, utiliza random.choice() para extraer un proxy aleatorio, que puedes utilizar después para iniciar una nueva instancia del controlador. Así es como debería aparecer tu código final:

language Copy
from seleniumwire import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By

import random

# la lista de proxy para rotar
PROXIES = [
    "http://20.235.159.154:80",
    "http://149.169.197.151:80",
    # ...
    "http://212.76.118.242:97"
]

# selecciona aleatoriamente un proxy
proxy = random.choice(PROXIES)

# establece las opciones de selenium-wire para usar el proxy
seleniumwire_options = {
    "proxy": {
        "http": proxy,
        "https": proxy
    },
}

# establece las opciones de Chrome para ejecutar en modo sin cabeza
options = Options()
options.add_argument("--headless=new")

# inicializa el controlador de Chrome con el servicio, las opciones de selenium-wire y las opciones de Chrome
driver = webdriver.Chrome(
    service=Service(ChromeDriverManager().install()),
    seleniumwire_options=seleniumwire_options,
    options=options
)

# navega a la página web de destino
driver.get("https://httpbin.io/ip")

# imprime el contenido del cuerpo de la página web de destino
print(driver.find_element(By.TAG_NAME, "body").text)

# libera los recursos y cierra el navegador
driver.quit()

En realidad, el uso de proxies gratuitos normalmente provocará bloqueos. Aunque los hemos utilizado para ilustrar los fundamentos, nunca debes depender de ellos para un proyecto práctico.

Error 403 de Selenium Grid: Proxy está prohibido

Selenium Grid permite la ejecución paralela de scripts multiplataforma y el control remoto del navegador. No obstante, si lo utilizas, puedes recibir uno de los problemas más frecuentes durante el raspado web: Error 403: Forbidden for Proxy. Hay dos razones por las que ocurre esto:

  • El puerto 4444 ya está en uso por otro proceso.
  • La URL correcta no está llegando a tus solicitudes de RemoteWebDriver.
    Asegúrate de que estás conectando el controlador remoto a la URL del concentrador correcta, como se indica a continuación, si el problema no se resuelve:
language Copy
import selenium.webdriver as webdriver
# ...
webdriver.Remote('http://localhost:4444/wd/hub', {})

Conclusión

Los servidores proxy pueden ayudar a eludir los sistemas de detección de bots, pero requieren mucho mantenimiento humano y no siempre son confiables. Usa una API de raspado web, como Scrapeless, para evitar de forma confiable cualquier medida anti-bot y ahórrate la molestia de ubicar y configurar proxies. ¡Obtén una prueba gratuita de Scrapeless!

En Scrapeless, solo accedemos a datos disponibles públicamente y cumplimos estrictamente con las leyes, regulaciones y políticas de privacidad del sitio web aplicables. El contenido de este blog es sólo para fines de demostración y no implica ninguna actividad ilegal o infractora. No ofrecemos garantías y renunciamos a toda responsabilidad por el uso de la información de este blog o enlaces de terceros. Antes de realizar cualquier actividad de scraping, consulte a su asesor legal y revise los términos de servicio del sitio web de destino u obtenga los permisos necesarios.

Artículos más populares

Catalogar