Cómo usar Proxies para rotar direcciones IP en Python

Descubre cómo usar proxies en Python para la rotación de IP en scraping web, dónde encontrar proxies fiables y consejos para evitar bloqueos de sitios web.
8 min de lectura
Python IP rotation

La rotación de IP mediante proxies es esencial en el scraping web, especialmente cuando se trabaja con sitios web modernos que pueden imponer restricciones. Distribuir las solicitudes entre múltiples direcciones IP es fundamental para evitar bloqueos o límites de velocidad. Rotar las direcciones IP dificulta que los sitios web rastreen y restrinjan tu actividad de scraping. Esto mejora la eficiencia y fiabilidad del proceso de scraping web, permitiéndote extraer datos de manera más efectiva. Usar proxies y rotar direcciones IP durante el scraping web te permite evitar bloqueos y penalizaciones basados en IP, superar límites de velocidad y acceder a contenido con restricciones geográficas.

Este artículo explica cómo implementar proxies en tu flujo de trabajo de scraping web para rotar las direcciones IP utilizadas. Explorarás dónde obtener proxies efectivos, cuáles son los consejos para la rotación de IP y cómo evitar ser bloqueado por el sitio web objetivo.

Rotación de IP con Python

Un proceso de scraping habitual con Python generalmente utiliza una biblioteca de Python como Requests o Scrapy para acceder a un sitio web y analizar su contenido. Luego puedes filtrar el contenido del sitio web para extraer la información que necesitas. El siguiente es un ejemplo de un proceso de scraping típico:


import requests

url = 'http://example.com'

# Make requests 
response = requests.get(url)
print(response.text)

Este proceso te proporciona la información que necesitas y es adecuado para casos de uso único o cuando solo necesitas extraer datos una vez. Sin embargo, utiliza la IP de tu sistema para realizar solicitudes y puede tener problemas con solicitudes repetidas o continuas donde el sitio web limita el acceso con el tiempo.

Los resultados del proceso de scraping de ejemplo son los siguientes:

<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", 
…

La mayoría de las bibliotecas de Python, como Requests o Scrapy, orientadas al scraping o a realizar solicitudes web, disponen de mecanismos para cambiar la dirección IP utilizada en dichas solicitudes. Sin embargo, para aprovechar esto, necesitas una lista o fuente de direcciones IP válidas. Estas fuentes pueden ser gratuitas o comerciales, como los proxies de Bright Data.

Las opciones comerciales garantizan la validez y ofrecen herramientas útiles para gestionar y rotar tus proxies y asegurar que no haya interrupciones en tu proceso de scraping. Por ejemplo, Bright Data tiene varias categorías de proxies con precios distintos según el caso de uso, la escalabilidad y la garantía de acceso sin bloqueos a los datos solicitados:

Servicios de Proxy de Bright Data para un scraping de datos sin interrupciones

Usando proxies gratuitos, puedes crear una lista en Python con proxies válidos que puedes rotar a lo largo de tu proceso de scraping:


proxies = ["103.155.217.1:41317", "47.91.56.120:8080", "103.141.143.102:41516", "167.114.96.13:9300", "103.83.232.122:80"]

Con esto, solo necesitas un mecanismo de rotación que seleccione diferentes direcciones IP de la lista a medida que realizas múltiples solicitudes. En Python, esto se vería similar a la siguiente función:

import random
import requests

def scraping_request(url):

   ip = random.randrange(0, len(proxies))
   
   ips = {"http": proxies[ip], "https": proxies[ip]}
   response = requests.get(url, proxies=ips)
   print(f"Proxy currently being used: {ips['https']}")
   return response.text

Este código selecciona un proxy aleatorio de tu lista cada vez que se llama. El proxy se utiliza en las solicitudes de scraping.

Incluir un caso de error para gestionar proxies inválidos daría como resultado que el código de scraping completo tenga el siguiente aspecto:

import random
import requests

proxies = ["103.155.217.1:41317", "47.91.56.120:8080", "103.141.143.102:41516", "167.114.96.13:9300", "103.83.232.122:80"]
def scraping_request(url):

   ip = random.choice(proxies)
   try:
      response = requests.get(url, proxies={"http": ip, "https": ip})
      if response.status_code == 200:   
         print(f"Proxy currently being used: {ip}")
   ip = random.randrange(0, len(proxies))
   
   ips = {"http": proxies[ip], "https": proxies[ip]}
   response = requests.get(url, proxies=ips)
   try:

      if response.status_code == 200:   
         print(f"Proxy currently being used: {ips['https']}")
         print(response.text)   

      elif response.status_code == 403:
         print("Forbidden client")

      elif response.status_code == 429:
         print("Too many requests")
         
   except Exception as e:
      print(f"An unexpected error occurred: {e}")

                
scraping_request("http://example.com")

También puedes usar esta lista rotativa de proxies para realizar tus solicitudes con cualquier otro framework de scraping, como Scrapy.

Scraping con Scrapy

Con Scrapy, necesitas instalar la biblioteca y crear los artefactos de proyecto necesarios antes de poder rastrear la web con éxito.

Puedes instalar Scrapy usando el gestor de paquetes pip en tu entorno habilitado para Python:

pip install Scrapy

Una vez instalado, puedes generar un proyecto Scrapy con algunos archivos de plantilla en tu directorio actual usando los siguientes comandos:

scrapy startproject sampleproject

cd sampleproject

scrapy genspider samplebot example.com

Estos comandos también generan un archivo de código básico que puedes desarrollar con un mecanismo de rotación de IP.

Abre el archivo sampleproject/spiders/samplebot.pysamplebot.py y actualízalo con el siguiente código:


import scrapy
import random

proxies = ["103.155.217.1:41317", "47.91.56.120:8080", "103.141.143.102:41516", "167.114.96.13:9300", "103.83.232.122:80"]
ip = random.randrange(0, len(proxies))
   
class SampleSpider(scrapy.Spider):
    name = "samplebot"
    allowed_domains = ["example.com"]
    start_urls = ["https://example.com"]
    
    def start_requests(self):
        for url in self.start_urls:
            proxy = random.choice(proxies)
            yield scrapy.Request(url, meta={"proxy": f"http://{proxy}"})

    request = scrapy.Request(
        "http://www.example.com/index.html",
        meta={"proxy": f"http://{ip}"}
    )
    def parse(self, response):
        # Log the proxy being used in the request
        proxy_used = response.meta.get("proxy")
        self.logger.info(f"Proxy used: {proxy_used}") 
        print(response.text)

Ejecuta el siguiente comando en la parte superior del directorio del proyecto para ejecutar este script de scraping:

scrapy crawl samplebot
Ejecutando el script

Consejos para la rotación de IP

El scraping web ha evolucionado hasta convertirse en una forma de competición entre sitios web y scrapers, con scrapers desarrollando nuevos métodos y técnicas para obtener los datos necesarios y sitios web encontrando nuevas formas de bloquear el acceso.

La rotación de IP es una técnica que tiene como objetivo eludir las limitaciones establecidas por los sitios web. Para maximizar la efectividad de la rotación de IP y minimizar las posibilidades de ser bloqueado por tu sitio web objetivo, considera los siguientes consejos:

  • Asegura un grupo de proxies amplio y diverso: Al usar la rotación de IP, necesitas un grupo de proxies significativo con un gran número de proxies y una amplia variedad de direcciones IP. Esta diversidad ayuda a lograr una rotación adecuada y reduce el riesgo de sobreutilizar proxies, lo que podría llevar a límites de velocidad y bloqueos. Considera usar múltiples proveedores de proxies con diferentes rangos y ubicaciones de IP. Además, considera variar los tiempos e intervalos entre tus solicitudes con diferentes proxies para simular mejor el comportamiento natural del usuario.
  • Implementa mecanismos robustos de manejo de errores: Durante tu proceso de scraping web, puedes encontrar varios errores debido a problemas de conectividad temporal, proxies bloqueados o cambios en tu sitio web objetivo. Al implementar el manejo de errores en tus scripts, puedes garantizar la ejecución fluida de tu proceso de scraping, capturando y gestionando excepciones comunes como errores de conexión, tiempos de espera y errores de estado HTTP. Considera configurar interruptores de circuito para pausar temporalmente tu proceso de scraping si se produce un alto número de errores en un período corto.
  • Prueba tus proxies antes de usarlos: Antes de implementar tu script de scraping en producción, usa una muestra de tu grupo de proxies para probar la funcionalidad de rotación de IP y los mecanismos de manejo de errores en diferentes escenarios. Puedes usar sitios web de muestra para simular condiciones del mundo real y asegurarte de que tu script pueda manejar estos casos.
  • Monitorea el rendimiento y la eficiencia de los proxies: Supervisa regularmente el rendimiento de tus proxies para detectar cualquier problema, como tiempos de respuesta lentos o fallos frecuentes. Debes llevar un registro de la tasa de éxito de cada proxy para identificar los ineficientes. Proveedores de proxies como Bright Data ofrecen herramientas para verificar el estado y rendimiento de sus proxies. Al monitorear el rendimiento de los proxies, puedes cambiar rápidamente a proxies más fiables y eliminar los de bajo rendimiento de tu grupo de rotación.

El scraping web es un proceso iterativo, y los sitios web pueden cambiar su estructura y patrones de respuesta o implementar nuevas medidas para prevenir el scraping. Monitorea regularmente tu proceso de scraping y adáptate a cualquier cambio para mantener la efectividad de tus esfuerzos de scraping.

Conclusión

Este artículo exploró la rotación de IP y cómo implementarla en tu proceso de scraping con Python. También aprendiste algunos consejos prácticos para mantener la efectividad de tu proceso de scraping con Python.

Bright Data es tu infraestructura integral para soluciones de scraping web. Proporciona proxies de alta calidad y éticos, un Navegador de scraping web, un IDE para el desarrollo y los procesos de tu bot de scraping, conjuntos de datos listos para usar y varias herramientas para rotar y gestionar proxies durante el scraping.