Scraping

Web scraping a escala: cuándo y por qué usar proxies públicos

5 min read Published Updated 993 words

La rotación de proxies es un parche, no una solución. La mayoría de las operaciones de scraping fallan porque tratan las direcciones IP como la única señal que miden los sistemas antibot. La realidad es que los gestores de bots modernos (Akamai Bot Manager, Cloudflare Turnstile, Datadome) toman huellas digitales de mucho más que tu IP de origen. Un pool rotatorio de proxies públicos gratuitos apenas te sirve de algo contra esos sistemas y, a menudo, empeora las cosas.

La ilusión de la rotación de IP

Cuando rotas IPs en cada solicitud, te anuncias como un scraper. Los patrones de navegación humana muestran sesiones persistentes: una sola IP durante minutos u horas, huellas digitales de navegador consistentes e intervalos de solicitud predecibles. Herramientas como requests con un objeto Session y una lista rotatoria de proxies rompen todas esas señales. La cabecera X-Akamai-Device-Fingerprint de Akamai y la correlación cf-request-id de Cloudflare pueden vincular solicitudes de distintas IPs cuando los parámetros TLS, la configuración de HTTP/2 y los tiempos siguen siendo idénticos. El desafío JavaScript de Datadome detecta artefactos de navegadores headless que sobreviven a los cambios de proxy. Rotar IPs sin rotar la huella digital completa del cliente es como cambiar la matrícula pero conducir el mismo coche: las cámaras de peaje te siguen marcando.

Para scraping de bajo volumen y baja frecuencia contra sitios que solo usan limitación de velocidad básica por IP (por ejemplo, un límite de 10 solicitudes por minuto sin desafíos JavaScript), una sola IP residencial suele ser suficiente. He ejecutado scrapers durante años contra portales de datos gubernamentales y APIs públicas usando una IP estática y un time.sleep(2) educado. Sin necesidad de proxy. La regla es simple: si el sitio no muestra una página de desafío o un CAPTCHA después de 50 solicitudes, no necesitas rotación.

Más allá de la dirección IP: la huella digital

Los sistemas antibot ahora recopilan docenas de señales por solicitud. La cadena User-Agent es trivial de falsificar, pero Accept-Language, Sec-CH-UA, Connection y el orden de Accept-Encoding no lo son. Más críticamente, la huella digital TLS — estandarizada en el hash JA3 (ver JA3) — identifica la biblioteca cliente por el orden de los conjuntos de cifrado y la lista de extensiones TLS. La biblioteca requests de Python (a través de urllib3) produce un hash JA3 distinto al de Chrome 124. Tanto Cloudflare Turnstile como Datadome verifican JA3. Rotar IPs mientras se mantiene la misma pila TLS hace que cada solicitud parezca el mismo cliente automatizado, solo saltando entre nodos de salida. Los proxies gratuitos agravan esto porque a menudo ejecutan versiones obsoletas de OpenSSL o usan configuraciones TLS similares a las de bots que ya están en listas negras.

La huella digital HTTP/2 va más allá. El frame SETTINGS, los valores de actualización de ventana y los parámetros de concurrencia de flujo forman una "huella digital HTTP/2" única que el Bot Manager de Akamai rastrea entre sesiones. Un pool rotatorio de proxies que no rota también la implementación de HTTP/2 es trivial de agrupar. La única forma de evadir estas comprobaciones es usar un motor de navegador real (Puppeteer, Playwright) o una pila TLS/HTTP cuidadosamente diseñada que imite una versión específica del navegador — e incluso así, necesitas mantener la misma huella digital en todas las solicitudes de una sesión determinada.

La economía de los pools de proxies públicos gratuitos

Las listas de proxies públicos gratuitos tienen una tasa de fallo del 60–80 % en mis pruebas. La mayoría de los proxies están muertos al llegar, limitados por el anfitrión o ya marcados por los principales gestores de bots. La vida media de un proxy SOCKS5 gratuito extraído de un directorio público es inferior a 15 minutos. Mantener un pool rotatorio de 500 proxies significa quemar miles de IPs por hora, y el 80 % de tus solicitudes o bien agotan el tiempo de espera o devuelven un 403. El ancho de banda no es fiable, los picos de latencia son comunes y muchos proxies gratuitos inyectan anuncios o modifican los cuerpos de respuesta. Las redes de proxies residenciales de pago (por ejemplo, Bright Data, Oxylabs) ofrecen tasas de éxito superiores al 95 % y opciones de sesión persistente, pero a un coste de 10–20 USD por GB. A escala, las matemáticas favorecen a los proxies residenciales solo cuando necesitas sortear bloqueos basados en IP en objetivos de alto valor. Para todo lo demás, una sola IP limpia con un ritmo de solicitud adecuado supera a un pool gratuito caótico.

Cuándo funciona realmente la rotación

La rotación de proxies es efectiva contra una amenaza específica: los límites de velocidad basados en IP que se restablecen por IP. Si un sitio utiliza una comprobación X-Forwarded-For simple o un token bucket por IP, rotar después de cada solicitud sortea el límite. Esto es común en sitios de comercio electrónico pequeños y APIs heredadas que nunca actualizaron su detección de bots. En esos casos, incluso un pool de proxies gratuitos funciona, pero solo si implementas lógica de reintento que descarte los proxies fallidos y recorra rápidamente otros nuevos.

Aquí tienes un ejemplo mínimo en Python usando requests y un bucle de reintento con rotación. Asume una lista de URLs de proxy en proxy_list y un url objetivo:

import requests
from itertools import cycle

proxy_pool = cycle(proxy_list)
max_retries = 5

for attempt in range(max_retries):
    proxy = next(proxy_pool)
    try:
        resp = requests.get(
            url,
            proxies={"http": proxy, "https": proxy},
            timeout=10,
            headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ..."}
        )
        if resp.status_code == 200:
            break
    except (requests.ConnectionError, requests.Timeout):
        continue
else:
    raise RuntimeError("All proxies failed")

Este patrón funciona solo cuando la detección del sitio es puramente basada en IP. Añade un time.sleep(random.uniform(1,3)) entre solicitudes para imitar el tiempo humano. Para sitios que ejecutan Turnstile o Datadome, este código fallará siempre: la página de desafío devolverá un 403 o un CAPTCHA independientemente del proxy. En esos casos, necesitas un navegador headless con una huella digital real, no una lista rotatoria de IPs.

Las sesiones persistentes — mantener la misma IP para un conjunto de solicitudes relacionadas — suelen ser más efectivas que la rotación por solicitud. Muchos sitios de comercio electrónico esperan una sola IP para una sesión de navegación (por ejemplo, añadir artículos al carrito, pagar). Rotar en medio de la sesión activa banderas de fraude. Usa un pool de proxies pero asigna una IP por sesión, no por solicitud. Los proxies gratuitos rara vez admiten sesiones persistentes porque la misma IP es reutilizada por múltiples usuarios; verás contaminación cruzada de datos de sesión. Los proxies residenciales de pago ofrecen duraciones de sesión persistente (5–30 minutos) que se alinean con el comportamiento natural de navegación.

Elige la rotación solo cuando entiendas la pila de detección del objetivo. Prueba primero con una sola IP. Añade rotación solo si te encuentras con un límite de velocidad. Y nunca confíes en proxies gratuitos para producción: su tasa de fallo te costará más en tiempo de ingeniería y datos perdidos que un plan residencial barato.