Cómo Rotar Proxies en Python

Domina la rotación de proxies en Python para superar prohibiciones de IP y optimizar tu proceso de scraping 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é usarlos
  • Qué es la rotación de proxies y por qué podrías necesitarla
  • Cómo rotar proxies en Python
  • Limitaciones comunes al rotar proxies en Python

¡Vamos a profundizar!

¿Qué Es un Proxy?

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

¿Por Qué Usar Proxies en Python?

Cuando envías una solicitud a un sitio web usando un proxy, la solicitud primero pasa por el servidor proxy. Luego, el proxy reenvía tu solicitud al sitio web, recibe la respuesta y te la devuelve. Este proceso enmascara tu dirección IP ante el destino, haciendo que parezca que la solicitud proviene del servidor proxy en lugar de tu dispositivo.

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

¿Qué Es la Rotación de Proxies y Por Qué la Necesitas?

Si haces demasiadas solicitudes desde una sola dirección IP, los sitios web pueden bloquearte mediante limitación de velocidad o prohibiciones directas de IP. Aquí es donde la rotación de proxies mediante proxies resulta útil.

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

  • Evitar bloqueos de IP: Distribuye las solicitudes entre múltiples IPs, dificultando que los sitios web detecten y bloqueen tu actividad de scraping.
  • Evitar límites de velocidad: Los sitios web a menudo establecen límites de solicitudes por dirección IP dentro de un plazo específico. Rotar proxies te ayuda a seguir haciendo scraping incluso después de alcanzar estos límites en una IP.
  • Acceder a contenido restringido geográficamente: Algunos sitios web muestran contenido diferente según la ubicación geográfica. La rotación de proxies con proxies de diferentes países te permite acceder a contenido específico de 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 próximos párrafos te mostrarán cómo rotar proxies en Python usando diferentes enfoques y bibliotecas.

El sitio objetivo para todos los scripts será el endpoint /ip del proyecto HTTPBin. Este endpoint especial devuelve la dirección IP del llamador, haciéndolo perfecto para probar si la IP vista por el servidor está rotando.

¡Es hora de rotar algunos proxies en Python!

Requisitos

Para replicar los tutoriales de rotación de 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_rotation/. Al final de este paso, la carpeta tendrá la siguiente estructura:

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

Donde:

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

Puedes crear el directorio del entorno virtual venv/ así:

python -m venv venv

Para activarlo, en Windows, ejecuta:

venvScriptsactivate

De forma equivalente, en macOS y Linux, ejecuta:

source venv/bin/activate

Como requisito previo final, necesitas obtener una lista de proxies. Para este artículo, puedes usar nuestra lista de proxies gratuitos.

Cómo Rotar Proxies en Python Con Requests

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

Paso #1: Instalar Dependencias

En el entorno virtual activado, instala Requests con:

pip install requests

Paso #2: Definir la Lógica de Rotación

Para rotar proxies en Python con Requests, escribe 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)

Donde:

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

Paso #3: Lanzar el Script

Para lanzar el script, ejecuta:

python requests_file.py

A continuación se muestra 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 se han rotado como se deseaba.

Cómo Rotar Proxies en Python Con AIOHTTP

La principal limitación del enfoque aleatorizado usando la biblioteca Requests es que usa un proxy a la vez. Esto significa que necesitas esperar a que cada solicitud se complete antes de que se use el siguiente proxy.

Para evitar esa limitación, puedes usar AIOHTTP. Esta biblioteca te permite hacer solicitudes asíncronas, usando así múltiples proxies simultáneamente de forma no bloqueante. En otras palabras, te permite rotar los proxies de tu lista haciendo solicitudes asíncronas y paralelas al servidor objetivo. Mira AIOHTTP en acción en nuestra guía sobre scraping web asíncrono.

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

Paso #1: Instalar Dependencias

En el entorno virtual activado, instala AIOHTTP con:

pip install aiohttp

Paso #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 solicitudes tomando la sesión, un proxy y el número de intento. En particular, envía una solicitud GET al sitio web objetivo e imprime la respuesta.
  • La función main():
    • Crea una sesión con el método aiohttp.ClientSession() para gestionar conexiones HTTP.
    • Configura una lista de tareas para enviar múltiples solicitudes simultáneamente y el número de intentos.
    • Rota los proxies usando el operador módulo (i % len(proxies_list)) para asegurar que los proxies se reutilicen de forma rotativa si el número de solicitudes supera el número de proxies. Descubre más en nuestro tutorial sobre cómo configurar un proxy en AIOHTTP.
    • Usa el método asyncio.gather() para ejecutar todas las tareas simultáneamente.

Paso #3: Lanzar el Script

Para lanzar el script, ejecuta:

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 se 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 usando scrapy-rotating-proxies.

¡En esta sección guiada, aprenderás a hacerlo!

Paso #1: Instalar Dependencias

En el entorno virtual activado, instala las bibliotecas necesarias:

pip install scrapy scrapy-rotating-proxies

Paso #2: Crear un Nuevo Proyecto Scrapy

Dentro de la carpeta principal de tu repositorio (proxy_rotation/), instancia 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

Desde la carpeta principal (proxy_rotation/), muévete a scrapy_rotation/:

cd scrapy_rotation

Ahora puedes crear un nuevo spider que apunte al sitio web objetivo 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 de proxies puede gestionarse modificando el archivo settings.py con las siguientes configuraciones:

# 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 la rotación de proxies aquí es la opción rotating_proxies.middlewares.RotatingProxyMiddleware: 610 en DOWNLOADER_MIDDLEWARES. En particular, esta opción selecciona un proxy de 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 prohibida o bloqueada por el sitio web objetivo. Si una solicitud falla por esa razón, el middleware reintentará la solicitud con un nuevo proxy. Por lo tanto, esta opción trabaja estrechamente con RotatingProxyMiddleware para garantizar que los proxies prohibidos se eviten automáticamente.

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 todo el spider e imprime la respuesta en cada solicitud.

Paso #4: Lanzar el Script

Para lanzar el script, debes 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. Entonces, si todo salió bien, entre la otra información, encontrarás algo como esto:

2026-02-18 14:55:17 [rotating_proxies.expire] DEBUG: Proxy <http://PROXY_1:PORT_X> is GOOD
2026-02-18 14:55:17 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://httpbin.io/robots.txt> (referer: None)
2026-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 Proxies en Python

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

  • Requieren que recuperes y gestiones manualmente una lista de proxies.
  • Implican código repetitivo (boilerplate).
  • Pueden seguir resultando en prohibiciones de IP si no usas servidores proxy de alta calidad.

Si buscas una forma más eficiente y efectiva de gestionar la rotación de proxies en Python, Bright Data ofrece algunos de los mejores proxies rotativos del mercado. Con solo una URL de proxy, puedes integrarlos en tu cliente HTTP o biblioteca de scraping. Eso elimina la necesidad de código repetitivo y gestión manual de rotación.

Otros beneficios clave de este enfoque son:

  • Rotación automática de IP con IPs fijas configurables
  • Acceso a 400M+ monthly millones de IPs residenciales
  • Control de geolocalización sobre las ubicaciones de los servidores proxy
  • Soporte para protocolos HTTP, HTTPS y SOCKS

Simplifica tu gestión de proxies: ¡descubre nuestros proxies de auto-rotación!

Conclusión

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

Sin embargo, ese enfoque tiene algunos inconvenientes:

  • El código es muy repetitivo, haciendo tu script menos mantenible.
  • Necesitas gestionar y proporcionar acceso a una gran lista de servidores proxy.

Afortunadamente, puedes evitar todo ese inconveniente con los proxies de auto-rotación de Bright Data, una solución más eficiente para rotar proxies en Python.

Bright Data controla los mejores servidores proxy del mundo, sirviendo a empresas Fortune 500 y a 50,000+ clientes. Su oferta incluye una amplia gama de tipos de proxy:

¡Crea una cuenta de Bright Data hoy para probar nuestras soluciones de proxies y scraping!