Scarnox · Blog

Proxies rotatorios para scraping: configuración y errores comunes

Un proxy rotatorio cambia la dirección IP desde la que sale tu tráfico, ya sea en cada petición o tras un intervalo fijo. Es una de las herramientas más comunes en el web scraping, y una de las más mal usadas. Si rotas muy poco, una sola dirección recibe límites de velocidad. Si rotas demasiado, el tráfico no se parece en nada a un visitante. Esta guía explica los dos modelos de rotación, muestra una configuración de Python que funciona, con reintentos para proxies caídos, y explica cómo encaja un campo de proxy en la resolución de captchas.

Rotación frente a sesiones fijas

Un servicio de proxies rotatorios entrega direcciones de dos formas:

Un visitante real mantiene una dirección durante toda su visita. Las sesiones fijas imitan ese comportamiento, así que suelen ser el valor por defecto mejor cuando un sitio usa cookies o sesiones. Usa la rotación por petición para el rastreo sin estado.

Un pool rotatorio básico en Python

El ejemplo siguiente mantiene un pool de URLs de proxy, rota entre ellas y pasa a la siguiente cuando una falla. Guarda las credenciales en variables de entorno, nunca en el código fuente.

import itertools
import os
import requests

# Las URLs de proxy vienen del entorno, por ejemplo:
# PROXY_POOL="http://user:pass@203.0.113.10:8080,http://user:pass@203.0.113.11:8080"
PROXIES = [p.strip() for p in os.environ.get("PROXY_POOL", "").split(",") if p.strip()]
rotation = itertools.cycle(PROXIES)

def fetch(url: str, max_tries: int = 3) -> requests.Response:
    last_error = None
    for _ in range(max_tries):
        proxy = next(rotation)
        try:
            r = requests.get(
                url,
                proxies={"http": proxy, "https": proxy},
                timeout=30,
            )
            if r.status_code == 407:  # falló la autenticación del proxy
                raise requests.RequestException("proxy auth rejected")
            return r
        except requests.RequestException as exc:
            last_error = exc  # proxy caído o lento: prueba el siguiente
    raise RuntimeError(f"all attempts failed for {url}: {last_error}")

Dos detalles importan aquí. Primero, un proxy caído debe reintentarse con una dirección distinta, no con la misma. Segundo, una petición que falla por un error de autenticación debe detenerse e informarse, en lugar de consumir todo el pool.

Controla la salud de los proxies

Un round robin simple sigue enviando tráfico a un proxy que ha empezado a fallar. Lleva una puntuación sencilla para cada dirección: cuenta los fallos recientes y saca una dirección del pool durante un período de enfriamiento cuando supere un umbral. Vuelve a incorporarla más tarde y vigílala de nuevo. Así, tu scraper gasta sus peticiones en la parte sana del pool.

Registra el proxy usado con cada resultado. Cuando un sitio empiece a devolver bloqueos, querrás saber si la culpa es de una dirección, de una región o de todo el pool.

Dosifica el pool

La rotación reparte la carga entre direcciones, pero cada dirección sigue teniendo un límite de ritmo. Establece un retardo por dirección y un tope global de peticiones por segundo en todo el pool. La rotación no es una licencia para enviar más tráfico. Es una forma de mantener el tráfico de una dirección dentro de límites razonables.

Errores comunes

La mayoría de los problemas de rotación vienen de unos pocos hábitos. Rotar la dirección en mitad de un inicio de sesión o de un proceso de compra rompe la sesión y hace que el sitio sospeche. Una respuesta 429 es un límite de velocidad del sitio, no un proxy roto, así que cambiar a una dirección nueva y reintentar de inmediato solo extiende el problema. Cambiar la dirección en cada petición mientras se mantienen las mismas cookies también es incoherente, ya que las cookies se emitieron a otro visitante. Por último, un pool que nunca se revisa se llena en silencio de direcciones muertas, y tu tasa de error sube sin una causa evidente. Revisa el pool con un calendario y elimina lo que falle.

Proxies y resolución de captchas

Algunas tareas de captcha pueden usar el proxy que usa tu scraper. Lo pasas en el campo opcional proxy, con el formato http://user:pass@host:port, y la resolución se hace desde la misma ruta de red que tu petición de página. Las tareas sin proxy omiten ese campo por completo. Cuál elegir depende de si el sitio ata el captcha a la dirección de red, y ese compromiso se explica en captcha con proxy o sin proxy.

Dos puntos prácticos:

El tipo de captcha activo en Scarnox hoy es PopularCaptcha. La guía de PopularCaptcha en Python muestra la petición y cómo enviar el token devuelto.

Elige tus proxies

El tipo de dirección que rotas importa tanto como la propia rotación. Las direcciones de centros de datos son rápidas y baratas por petición, pero a menudo puntúan bajo. Las direcciones residenciales puntúan mejor y son más lentas. La guía sobre proxies residenciales frente a datacenter los compara en profundidad, y su consejo se aplica también al pool que construyas aquí.

Scrapea de forma responsable

Próximos pasos

Empieza con crédito de prueba gratis, sin tarjeta: crea una cuenta y prueba el flujo de PopularCaptcha con tu propio proxy. Para ver las tarifas actuales, consulta la página de precios.