Guía de Python · 2 min de lectura

Cómo rotar proxies en Python (requests y aiohttp)

La rotación es la diferencia entre un scraper que tiene una IP prohibida y uno que distribuye la carga entre muchas. Aquí hay un rotador funcional tanto para solicitudes síncronas como para aiohttp asíncrono, con verificaciones de salud y jubilación automática de salidas muertas.

Lo que realmente resuelve la rotación

Los sitios limitan y prohíben por IP. Si cada solicitud proviene de una sola dirección, alcanzas el límite rápidamente y una sola prohibición detiene todo el trabajo. La rotación distribuye las solicitudes a través de un grupo de salidas, por lo que la carga por IP se mantiene por debajo del umbral y una salida muerta o bloqueada solo te cuesta un reintento, no la ejecución. Dos diseños cubren casi todo: round-robin (circular a través del grupo en orden, predecible y uniforme) y aleatorio (elegir por solicitud, simple y sin estado).

The pool itself can come from two places. You can list several s4m endpoints and ports and rotate across them, or, for quick low-stakes tests, pull live entries from the free public proxy list — filtered by country, protocol and anonymity, though those third-party proxies are use-at-your-own-risk and die often. Production rotation should lean on authenticated datacenter proxies from s4m (SOCKS5 on 1080, HTTP on 3128, USER:PASS), which stay up and are metered so scaling the pool is cheap. This builds directly on scraping with requests.

Un rotador para solicitudes y aiohttp

Un grupo que hace round-robin, reintentos en caso de fallo y retira salidas que siguen fallando. Versiones síncronas y asíncronas. Reemplaza USER:PASS.

python
import asyncio, itertools, random
import requests, aiohttp
from aiohttp_socks import ProxyConnector  # pip install aiohttp-socks

USER, PASS, HOST = "USER", "PASS", "proxy.s4m.online"
POOL = [
    f"socks5h://{USER}:{PASS}@{HOST}:1080",
    f"http://{USER}:{PASS}@{HOST}:3128",
    # add more endpoints/ports here to widen the pool
]

# ---------- Synchronous: requests + round-robin + retirement ----------
class Rotator:
    def __init__(self, pool):
        self.alive = list(pool)
        self.fails = {p: 0 for p in pool}
        self._cycle = itertools.cycle(self.alive)

    def pick(self):
        return next(self._cycle)

    def retire(self, proxy):
        self.fails[proxy] += 1
        if self.fails[proxy] >= 3 and proxy in self.alive:
            self.alive.remove(proxy)
            self._cycle = itertools.cycle(self.alive or POOL)

def get(url, rot, retries=4):
    for _ in range(retries):
        proxy = rot.pick()
        try:
            r = requests.get(url, proxies={"http": proxy, "https": proxy},
                             timeout=(5, 20))
            r.raise_for_status()
            return r
        except requests.RequestException:
            rot.retire(proxy)
    raise SystemExit("pool exhausted")

rot = Rotator(POOL)
print(get("https://api.ipify.org", rot).text)

# ---------- Async: aiohttp, one connector per proxy ----------
async def fetch(url, proxy):
    connector = ProxyConnector.from_url(proxy)
    async with aiohttp.ClientSession(connector=connector) as s:
        async with s.get(url, timeout=aiohttp.ClientTimeout(total=25)) as r:
            return await r.text()

async def main():
    tasks = [fetch("https://api.ipify.org", random.choice(POOL))
             for _ in range(5)]
    for ip in await asyncio.gather(*tasks, return_exceptions=True):
        print(ip)

asyncio.run(main())

Decisiones de diseño que importan

Los controles que deciden si la rotación ayuda o solo añade rotación.

Round-robin vs aleatorio

Round-robin distribuye la carga de manera uniforme y es fácil de razonar; aleatorio es sin estado y simple. Ambos superan a una salida fija única: elige round-robin cuando la distribución uniforme importa.

Retirar salidas muertas

Cuenta fallos consecutivos por proxy y elimina una salida después de unos pocos intentos, para que el grupo se auto-repare en lugar de intentar un cadáver para siempre.

Verificación de salud antes de usar

Accede periódicamente a un punto final de eco IP a través de cada proxy y mantén solo los que responden. Esencial cuando el grupo incluye entradas de lista gratuita volátiles.

Retrocede, no corras

La rotación no es una licencia para inundar. Añade retrasos por host y retroceso exponencial para que te mantengas bajo los límites en lugar de luchar contra ellos a través de muchas IPs.

Sesiones persistentes y límites honestos

La rotación no siempre es lo que deseas. Algunos flujos — un inicio de sesión, un carrito, un formulario de varios pasos — necesitan la misma IP durante toda la sesión, o el sitio ve a un usuario teletransportándose entre direcciones y lo bloquea. Eso es una sesión persistente: rota entre trabajos, mantente fijo dentro de uno. Cuando un flujo de trabajo necesita una dirección garantizada y estable, añade una IP personal dedicada en lugar de rotar.

Sé honesto sobre el límite. Los proxies s4m son de datacenter, así que rotarlos ayuda con los límites de tasa e incluso con la carga, pero no disfrazará las IPs de datacenter de un sistema anti-bot que bloquea todo el rango. La rotación tampoco hace nada sobre las huellas digitales del navegador o los patrones de solicitud. Úsalo como una capa: combínalo con encabezados realistas, retroceso y respeto por las reglas de cada sitio. Para las piezas asíncronas necesitarás aiohttp-socks para soporte de SOCKS5; valida las salidas con las herramientas y automatiza el manejo de credenciales a través de la API.

FAQ

Preguntas, respondidas

¿Cómo rotar proxies con solicitudes?

Mantén una lista de URLs de proxy y elige una por solicitud — round-robin o aleatorio — pasándola como argumento de proxies. Retira una salida después de algunos fallos consecutivos para que el grupo se auto-repare. El ejemplo anterior muestra un rotador completo.

¿Cómo rotar proxies con aiohttp?

aiohttp establece el proxy por solicitud para HTTP, pero para SOCKS5 construyes un ProxyConnector (de aiohttp-socks) por proxy y creas una sesión con él. Distribuye tareas a través del grupo con asyncio.gather.

¿Cuándo NO debo rotar proxies?

Cuando un flujo de trabajo necesita una identidad consistente: inicios de sesión, carritos, formularios de varios pasos. Cambiar de IP a mitad de sesión parece sospechoso y se bloquea. Usa una sesión persistente o una IP dedicada para esos flujos.

¿Los proxies de centro de datos rotativos evitarán todos los bloqueos?

No. La rotación distribuye la carga y evita los límites de tasa por IP, pero los rangos de centros de datos aún pueden ser marcados en su totalidad por sistemas anti-bot agresivos, y la rotación no cambia tu huella digital del navegador ni su comportamiento.

Rotar a través de salidas reales

Amplía tu grupo con proxies SOCKS5 y HTTP de centro de datos autenticados en proxy.s4m.online, medidos para que escalar sea barato. Agrega una IP dedicada para los pasos de sesión persistente.

Las personas encontraron esta página buscando

Frases de búsqueda reales que esta página responde — los enlaces abren la página que las cubre en profundidad.