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:
- Rotación por petición. Cada petición recibe una nueva dirección de salida. Esto encaja con grandes rastreos de muchas páginas no relacionadas, donde ninguna página necesita la anterior.
- Sesiones fijas. Se mantiene una dirección durante un tiempo fijo, a menudo unos minutos, o hasta que la liberas. Esto encaja con cualquier cosa que necesite estado: un inicio de sesión, un carrito de compra, una lista paginada donde importan las cookies.
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:
- Usa el mismo proxy para la petición de la página y para la resolución del captcha cuando el sitio comprueba la dirección. Mezclar direcciones puede hacer fallar el token.
- Los tokens caducan rápido. Solicita el token justo antes de enviar el formulario, no mucho antes. Consulta caducidad del token de captcha.
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
- Lee el
robots.txty los términos de los sitios que scrapees. - Usa proxies para repartir una carga legítima, no para saltarte una restricción que el propietario haya puesto.
- Usa solo servicios de proxy cuyas direcciones se obtengan con consentimiento. Enrutar a través de dispositivos de personas que no han dado su acuerdo no es aceptable.
- Mantén las credenciales fuera del código y de los registros.
Próximos pasos
- Proxies residenciales frente a datacenter
- Scrapea sin que te bloqueen
- Captcha con proxy o sin proxy
- Reintentos y manejo de errores que aguantan en producción
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.