Cómo rotar proxies en Python

Domine la rotación de proxy en Python para superar las prohibiciones de IP y agilizar su proceso de raspado web.
12 min de lectura
How to Rotate Proxies in Python blog image

En esta guía sobre cómo rotar proxies en Python, aprenderás:

  • Qué son los proxies y por qué utilizarlos
  • Qué es la rotación de proxy y por qué puede necesitarla
  • Cómo rotar proxies en Python
  • Limitaciones comunes al rotar proxies en Python

Sumerjámonos.

¿Qué es un poder?

Un proxy es un servidor que actúa como intermediario entre un usuario y un recurso de red a través de Internet. Un proxy es un intermediario que reenvía solicitudes y respuestas entre las partes.

¿Por qué utilizar proxies en Python?

Cuando envías una petición a un sitio web utilizando un proxy, la petición pasa primero por el servidor proxy. Después, el proxy reenvía la petición al sitio web, recibe la respuesta y te la devuelve. Este proceso enmascara tu dirección IP en el destino, haciendo que parezca que la petición procede del servidor proxy en lugar de tu dispositivo.

La razón típica por la que quieres usar un proxy es en el caso de la automatización de peticiones web o web scraping. En este escenario, Python es uno de los mejores lenguajes para el web scraping, gracias a sus extensas librerías y a su amplia y activa comunidad.

¿Qué es la rotación de proxy y por qué es necesaria?

Si realizas demasiadas peticiones desde una única dirección IP, los sitios web pueden bloquearte mediante la limitación de velocidad o la prohibición total de IP. Aquí es donde entra en juego la rotación de proxies.

Cambiar sistemáticamente entre diferentes servidores proxy mientras se realizan peticiones web es una de las mejores formas de implementar la rotación de direcciones IP. Este procedimiento le ayuda a eludir las técnicas comunes anti-scraping y le proporciona los siguientes beneficios:

  • Evitar bloqueos de IP: Distribuya las solicitudes entre varias IP, lo que dificultará que los sitios web detecten y bloqueen su actividad de scraping.
  • Eludir los límites de velocidad: Los sitios web suelen establecer límites de solicitudes por dirección IP dentro de un plazo determinado. Rotar los proxies te ayuda a seguir haciendo scraping incluso después de alcanzar estos límites en una IP.
  • Acceso a contenidos con restricciones geográficas: Algunos sitios web muestran contenidos diferentes en función de la ubicación geográfica. La rotación de proxies con proxies de distintos países te permite acceder a contenidos específicos de tu ubicación.

Cómo rotar proxies en Python: 3 Enfoques

Ahora que sabes qué son los proxies y por qué rotarlos, prepárate para algunos tutoriales paso a paso en Python. Los siguientes párrafos te mostrarán cómo rotar proxies en Python utilizando diferentes enfoques y librerías.

El sitio de destino para todos los scripts será el endpoint /ip del proyecto HTTPBin. Este endpoint especial devuelve la dirección IP de la persona que llama, por lo que es perfecto para comprobar si la IP que ve el servidor está rotando.

¡Es hora de rotar algunos proxies en Python!

Requisitos

Para replicar los tutoriales para rotar proxies con Python, debes tener Python 3.7 o superior instalado en tu máquina.

Requisitos previos

Supongamos que llamas a la carpeta principal de tu proyecto proxy_rotación/. Al final de este paso, la carpeta tendrá la siguiente estructura:

proxy_rotation/
    ├── requests_file.py
    ├── async.py
    ├── scrapy_rotation/
    └── venv/ 

Dónde:

  • requests.py, y async.py son archivos Python que almacenan la lógica de rotación de proxy Requests y AIOHTTP, respectivamente.
  • scrapy_rotation/ es una carpeta que contiene un proyecto Scrapy. Lo crearás e instanciarás más adelante.
  • venv/ contiene el entorno virtual

Puede crear el directorio del entorno virtual venv/ de la siguiente manera:

python -m venv venv

Para activarlo, en Windows, ejecute

venv\Scripts\activate

De forma equivalente, en macOS y Linux, ejecute:

source venv/bin/activate

Como último prerrequisito, necesitas recuperar una lista de proxies. Para este artículo, puedes usar nuestra lista gratuita de proxies.

Cómo rotar proxies en Python con peticiones

En esta sección del tutorial, aprenderás a rotar proxies en Python con Requests.

Paso 1: Instalar dependencias

En el entorno virtual activado, instale Requests con:

pip install requests

Paso nº 2: Definir la lógica de rotación

Para rotar proxies en Python con Requests, escriba el siguiente código en el archivo requests_file.py:

import random
import requests

# Define a list of proxies and return a random one
def get_random_proxy():
    proxies = [
        "http://PROXY_1:PORT_X",
        "http://PROXY_2:PORT_Y",
        "http://PROXY_3:PORT_X",
        # Add more proxies here...
    ]

    # Randomly pick a proxy
    return random.choice(proxies)

for i in range(3):
    proxy_url = get_random_proxy()
    proxies = {
        "http": proxy_url,
        "https": proxy_url,
    }
    response = requests.get("https://httpbin.io/ip", proxies=proxies)
    print(response.text)

Dónde:

  • La función get_random_proxy() almacena la lista de proxies que ha recuperado y devuelve uno aleatorio con el método random.choice().
  • El bucle for itera sobre la lista aleatoria de proxies y realiza la petición real con el método requests.get(). Para más información, lee nuestra guía sobre el uso de un proxy con Python Requests.

Paso 3: Iniciar el script

Para iniciar el script, ejecute:

python requests_file.py

A continuación figura la respuesta esperada:

{
  "origin": "PROXY_3:PORT_K"
}
{
  "origin": "PROXY_1:PORT_N"
}
{
  "origin": "PROXY_2:PORT_P"
}

¡Maravilloso! Las IPs de salida de tu script han sido rotadas como deseabas.

Cómo rotar proxies en Python con AIOHTTP

La principal limitación del enfoque aleatorio que utiliza la biblioteca Requests es que utiliza un proxy cada vez. Esto significa que hay que esperar a que concluya cada petición antes de utilizar el siguiente proxy.

Para evitar esa limitación, puedes utilizar AIOHTTP. Esta librería le permite realizar peticiones asíncronas, utilizando así múltiples proxies simultáneamente de forma no bloqueante. En otras palabras, te permite rotar los proxies de tu lista haciendo peticiones asíncronas y paralelas al servidor de destino. Vea AIOHTTP en acción en nuestra guía sobre web scraping asíncrono.

La siguiente sección muestra cómo rotar proxies en Python con AIOHTTP.

Paso 1: Instalar dependencias

En el entorno virtual activado, instale AIOHTTP con:

pip install aiohttp

Paso nº 2: Definir la lógica de rotación

Para rotar proxies en Python con AIOHTTP, escribe el siguiente código en el archivo async.py:

import asyncio
import aiohttp

# Define a list of proxies
proxies_list = [
    "http://PROXY_1:PORT_X",
    "http://PROXY_2:PORT_Y",
    "http://PROXY_3:PORT_X",
    # Add more proxies here...
]

async def fetch_ip(session, proxy_address, attempt):
    print(f"Attempt {attempt} using proxy: {proxy_address}")
    async with session.get("https://httpbin.io/ip", proxy=proxy_address) as response:
        json_response = await response.json()
        print(f"Response from httpbin.io/ip (Attempt {attempt}):")
        print(f"IP Address: {json_response.get('origin', 'Unknown')}")
        print("-" * 40)
        return json_response

async def main():
    async with aiohttp.ClientSession() as session:
        tasks = []
        num_attempts = 3
        for i in range(num_attempts):
            # Rotate proxies using the modulus operator.
            proxy_address = proxies_list[i % len(proxies_list)]
            tasks.append(fetch_ip(session, proxy_address, i + 1))
        # Run all requests concurrently
        await asyncio.gather(*tasks)

# Launch the script
asyncio.run(main())

Este código hace lo siguiente:

  • La función fetch_ip() gestiona las peticiones tomando la sesión, un proxy y el número de intento. En concreto, envía una petición GET al sitio web de destino e imprime la respuesta.
  • La función main()
    :Marcador de posición Polylang no modificar

Paso 3: Iniciar el script

Para iniciar el script, ejecute:

python async.py

Esta es la respuesta esperada:

Attempt 1 using proxy: http://PROXY_1:PORT_X
Attempt 2 using proxy: http://PROXY_2:PORT_Y
Attempt 3 using proxy: http://PROXY_3:PORT_Z

Response from httpbin.io/ip (Attempt 3):
IP Address: xxx.xxx.xxx.xxx
----------------------------------------
Response from httpbin.io/ip (Attempt 1):
IP Address: yyy.yyy.yyy.yyy
----------------------------------------
Response from httpbin.io/ip (Attempt 2):
IP Address: zzz.zzz.zzz.zzz
----------------------------------------

¡Increíble! Las IPs están rotando como se esperaba.

Cómo rotar proxies con Python Scrapy

En un artículo anterior, discutimos la posibilidad de rotar proxies en Python con Scrapy utilizando scrapy-rotating-proxies.

En esta sección guiada aprenderás cómo hacerlo.

Paso 1: Instalar dependencias

En el entorno virtual activado, instale las bibliotecas necesarias:

pip install scrapy scrapy-rotating-proxies

Paso 2: Crear un nuevo proyecto Scrapy

Dentro de la carpeta principal de su repositorio(proxy_rotation/), instancie un nuevo proyecto Scrapy con este comando:

scrapy startproject scrapy_rotation

Esto creará una nueva subcarpeta llamada scrapy_rotation/ que tiene la siguiente estructura:

scrapy_rotation/
  ├── scrapy_rotation/ 
  │   ├── __init__.py
  │   ├── items.py # Defines the data structure for scraped items
  │   ├── middlewares.py # Custom middlewares
  │   ├── pipelines.py # Handles post-processing of scraped data
  │   ├── settings.py # Project settings
  │   └── spiders/ # Folder for all spiders
  └── scrapy.cfg # Scrapy configuration file

De la carpeta principal(proxy_rotation/), pasa a la de scrapy_rotation/:

cd scrapy_rotation

Ahora puede crear una nueva araña que apunte al sitio web de destino ejecutando:

scrapy genspider rotation http://httpbin.io/ip

Este script también crea el archivo rotation.py dentro de la carpeta spiders/.

Paso 3: Definir la lógica de rotación

La lógica de rotación del proxy se puede gestionar modificando el archivo settings.py con la siguiente configuración:

# Enable the rotating proxies middleware
DOWNLOADER_MIDDLEWARES = {
    "rotating_proxies.middlewares.RotatingProxyMiddleware": 610,
    "rotating_proxies.middlewares.BanDetectionMiddleware": 620,
}

# List of proxies to rotate
ROTATING_PROXY_LIST = [
    "http://PROXY_1:PORT_X",
    "http://PROXY_2:PORT_Y",
    "http://PROXY_3:PORT_Z",
    # Add more proxies as needed
]

# Configure retry settings
RETRY_TIMES = 5  # Number of retries for failed requests
RETRY_HTTP_CODES = [500, 502, 503, 504, 408]  # HTTP codes to retry

Lo que gestiona aquí la rotación de proxies es la opción rotating_proxies.middlewares.RotatingProxyMiddleware: 610 de DOWNLOADER_MIDDLEWARES. En concreto, esta opción selecciona un proxy de la ROTATING_PROXY_LIST y lo asigna a cada solicitud.

Además, la opción rotating_proxies.middlewares.BanDetectionMiddleware: 620 permite al scraper detectar si una IP ha sido baneada o bloqueada por el sitio web de destino. Si una petición falla debido a esa razón, el middleware reintentará la petición con un nuevo proxy. Así, esta opción trabaja estrechamente con el RotatingProxyMiddleware para asegurar que los proxies baneados son automáticamente evitados.

Ahora, en el archivo rotation.py dentro de la carpeta spiders/ puedes escribir lo siguiente:

import scrapy

class IpSpider(scrapy.Spider):
    name = "ip_spider"
    start_urls = ["http://httpbin.io/ip"]
    def parse(self, response):
        # Extract and print the IP address from the response
        ip = response.json().get("origin")
        self.log(f"IP Address: {ip}")

Esta clase instancia toda la araña e imprime la respuesta en cada petición.

Paso 4: Ejecutar el script

Para lanzar el script, tienes que usar el nombre de la clase IpSpider() -que es ip_spider:

scrapy crawl ip_spider

Los datos devueltos por Scrapy en la CLI son particularmente completos. Por lo tanto, si todo ha ido bien, entre la otra información, usted encontrará algo como esto:

2025-02-18 14:55:17 [rotating_proxies.expire] DEBUG: Proxy <http://PROXY_1:PORT_X> is GOOD
2025-02-18 14:55:17 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://httpbin.io/robots.txt> (referer: None)
2025-02-18 14:55:24 [rotating_proxies.middlewares] INFO: Proxies(good: 1, dead: 0, unchecked: 2, reanimated: 0, mean backoff time: 0s)

Limitaciones de los enfoques anteriores para la rotación de proxy en Python

Los métodos de rotación de proxy mencionados anteriormente son útiles, pero tienen algunas limitaciones:

  • Requieren que recupere y gestione manualmente una lista de proxies.
  • Implican código repetitivo.
  • Aún así, pueden dar lugar a bloqueos de IP si no utilizas servidores proxy de alta calidad.

Si está buscando una forma más eficiente y eficaz de manejar la rotación de proxies en Python, Bright Data ofrece algunos de los mejores proxies rotatorios del mercado. Con una sola URL de proxy, puede integrarlos en su cliente HTTP o biblioteca de scraping. Esto elimina la necesidad de código repetitivo y la gestión manual de la rotación.

Otras ventajas clave de este planteamiento son:

  • Rotación automática de IP con IP fijas configurables
  • Acceso a más de 150 millones de IP residenciales
  • Control de geolocalización de las ubicaciones de los servidores proxy
  • Compatibilidad con los protocolos HTTP, HTTPS y SOCKS

Simplifique la gestión de sus proxies: ¡descubra nuestros proxies auto-rotativos!

Conclusión

En este artículo, aprendiste cómo rootear proxies en Python usando tres librerías diferentes: Requests, AIOHTTP, y Scrapy. Como se demostró en las secciones guiadas anteriores, el proceso no es complejo y requiere sólo unas pocas líneas de código.

Sin embargo, este enfoque presenta algunos inconvenientes:

  • El código está repleto de plantillas, lo que hace que el script sea menos fácil de mantener.
  • Necesita gestionar y proporcionar acceso a una amplia lista de servidores proxy.

Afortunadamente, puede saltarse todas esas molestias con los proxies auto-rotativos de Bright Data, una solución más eficiente para rotar proxies en Python.

Bright Data controla los mejores servidores proxy del mundo y presta servicio a empresas de la lista Fortune 500 y a más de 20.000 clientes. Su oferta incluye una amplia gama de tipos de proxy:

Cree hoy mismo una cuenta gratuita en Bright Data para probar nuestros proxies y soluciones de scraping.

No se requiere tarjeta de crédito