Cuando trabajas con proxies para hacer scraping de marketplaces, automatización de redes sociales o recolección de datos, el problema más común son las solicitudes colgadas y la pérdida de datos. Un servidor proxy puede no responder a tiempo, la conexión puede interrumpirse y tu script puede colgarse durante varios minutos. Como resultado, pierdes tiempo, datos y dinero.
En esta guía, te mostraré cómo configurar correctamente el timeout y la lógica de reintentos para trabajar con proxies. Aprenderás qué valores de timeout usar para diferentes tareas, cómo reconectarte automáticamente en caso de errores y cómo no perder ninguna solicitud. El artículo es adecuado tanto para quienes escriben código en Python como para quienes utilizan herramientas de scraping listas para usar.
Por qué el timeout es críticamente importante al trabajar con proxies
Imagina la situación: has lanzado un scraper de precios de Wildberries para 10,000 productos. El script funciona a través de un proxy para no ser bloqueado. Todo va bien, pero en la solicitud 523, el servidor proxy deja de responder — puede que esté sobrecargado o temporalmente no disponible. Sin un timeout configurado, tu script esperará la respuesta indefinidamente (o hasta que se agote el timeout del sistema de 2-5 minutos). Como resultado, el scraping se detiene, pierdes tiempo y, para cuando te des cuenta del problema, pueden haber pasado varias horas.
El timeout es el tiempo máximo de espera para recibir una respuesta del servidor. Si el servidor no responde en ese tiempo, la solicitud se interrumpe, y puedes repetirla a través de otro proxy o registrar el error en el log. Esto es especialmente importante al trabajar con proxies porque:
- Los servidores proxy pueden ser inestables — especialmente los públicos o baratos. Incluso los proxies residenciales de calidad a veces pierden la conexión porque el usuario real se desconectó de Internet.
- El sitio objetivo puede bloquear la IP — si el proxy es bloqueado, no responderá en absoluto o responderá muy lentamente (dando un captcha o redirigiendo).
- Las latencias de red son impredecibles — especialmente al usar proxies de otros países. La solicitud puede pasar por varios nodos intermedios.
- Las operaciones masivas requieren estabilidad — si estás scrapeando 100,000 páginas o gestionando 50 cuentas de Instagram, incluso un 1% de solicitudes colgadas = 1,000 operaciones perdidas.
Sin timeouts configurados correctamente, tu script gastará tiempo esperando proxies no disponibles en lugar de cambiar a los que funcionan. Esto afecta directamente la velocidad de operación y la estabilidad del resultado.
Tipos de timeouts: connect, read y total timeout
Existen tres tipos principales de timeouts que debes entender y configurar por separado. Muchos desarrolladores principiantes y usuarios de scrapers solo configuran un timeout general, lo que lleva a problemas.
1. Connect timeout (timeout de conexión)
Este es el tiempo que se asigna para establecer una conexión con el servidor proxy. Si no se establece la conexión en ese tiempo, la solicitud se interrumpe. El connect timeout es responsable del apretón de manos inicial (TCP handshake) entre tu cliente y el proxy.
Cuándo se activa: El servidor proxy no está disponible, está sobrecargado o la IP está bloqueada por un firewall.
Valores recomendados:
- Para proxies de centros de datos rápidos: 3-5 segundos
- Para proxies residenciales: 5-10 segundos
- Para proxies móviles: 10-15 segundos (el internet móvil es más lento)
2. Read timeout (timeout de lectura)
Este es el tiempo de espera para recibir una respuesta del servidor objetivo después de que ya se ha establecido la conexión con el proxy. Si el servidor no comienza a enviar datos en ese tiempo, la solicitud se interrumpe. El read timeout protege contra situaciones en las que el servidor aceptó la solicitud, pero se "colgó" y no devuelve respuesta.
Cuándo se activa: El sitio objetivo procesa lentamente la solicitud, está sobrecargado o intencionalmente ralentiza solicitudes sospechosas.
Valores recomendados:
- Para hacer scraping de páginas simples (HTML): 10-15 segundos
- Para hacer scraping con renderizado JavaScript: 30-60 segundos
- Para solicitudes API: 5-10 segundos
- Para descargar archivos grandes: 120+ segundos
3. Total timeout (timeout total)
Este es el tiempo máximo para ejecutar toda la solicitud de principio a fin, incluyendo la conexión, el envío de la solicitud, la recepción y la lectura de la respuesta. El total timeout es un "interruptor de emergencia" que garantiza que ninguna solicitud se ejecute durante más tiempo del establecido.
Cuándo usar: Cuando es importante que cada solicitud se ajuste a un marco de tiempo estricto (por ejemplo, al hacer scraping en tiempo real para arbitraje).
Fórmula: Total timeout = Connect timeout + Read timeout + margen del 20-30%
Importante: No todas las bibliotecas y herramientas admiten la configuración separada de los timeouts de connect y read. Por ejemplo, la biblioteca requests en Python permite especificar ambos valores como una tupla: timeout=(5, 15), donde 5 es connect, 15 es read.
Valores óptimos de timeouts para diferentes tareas
Los valores correctos de los timeouts dependen de tu tarea, tipo de proxy y sitio objetivo. Los timeouts demasiado cortos llevarán a un gran número de errores falsos (el proxy funciona, pero lo descartas). Los demasiado largos resultarán en pérdida de tiempo esperando proxies muertos.
| Tarea | Connect timeout | Read timeout | Comentario |
|---|---|---|---|
| Scraping de Wildberries, Ozon | 5-7 seg | 15-20 seg | Los marketplaces pueden tardar en cargar páginas con muchos productos |
| Scraping de Avito, Yandex.Market | 5-7 seg | 10-15 seg | Generalmente son sitios rápidos, pero pueden bloquear IP sospechosas |
| Automatización de Instagram, TikTok | 7-10 seg | 20-30 seg | Usa proxies móviles — son más lentos, pero más estables |
| Trabajo con Facebook Ads API | 5 seg | 10-15 seg | Las APIs suelen ser rápidas, pero pueden ralentizarse con el rate limiting |
| Scraping a través de Selenium/Puppeteer | 10 seg | 60-120 seg | El renderizado de JavaScript requiere tiempo, especialmente en proxies lentos |
| Verificación masiva de proxies | 3-5 seg | 5-7 seg | Verificación rápida de disponibilidad, se descartan proxies lentos |
Consejo: Comienza con timeouts conservadores (más largos) y disminúyelos gradualmente, analizando los logs de errores. Si ves muchos errores de timeout en proxies que funcionan, aumenta los valores. Si el script se ralentiza debido a proxies lentos, disminúyelos.
Lógica de reintentos: cómo configurar correctamente los reintentos
El timeout resuelve el problema de las solicitudes colgadas, pero no resuelve la pérdida de datos. Si el proxy no respondió, simplemente recibirás un error y perderás esa solicitud. Por eso, la lógica de reintentos es críticamente importante.
La lógica de reintentos es la repetición automática de una solicitud en caso de error. Los principios básicos para una configuración correcta son:
1. Define qué errores requieren un reintento
No todos los errores necesitan ser reintentados. Por ejemplo:
- Reintentar: Timeout, Connection refused, Proxy error, 502/503/504 (errores temporales del servidor), Rate limiting (429)
- No reintentar: 404 (página no encontrada), 403 (acceso prohibido permanentemente), 401 (autenticación incorrecta), errores de validación de datos
2. Configura el número de intentos
El número óptimo de reintentos depende de la criticidad de los datos:
- Para tareas no críticas (scraping para análisis): 2-3 intentos
- Para tareas importantes (monitoreo de precios de competidores): 3-5 intentos
- Para tareas críticas (trabajo con cuentas publicitarias): 5-10 intentos
3. Usa exponential backoff (retraso exponencial)
No repitas la solicitud de inmediato — esto puede agravar el problema (por ejemplo, si el servidor está sobrecargado). Usa un retraso creciente entre intentos:
- 1er intento: inmediatamente
- 2do intento: después de 1-2 segundos
- 3er intento: después de 4-5 segundos
- 4to intento: después de 10-15 segundos
Fórmula: retraso = retraso_base * (2 ^ número_intento). Por ejemplo: 1 seg, 2 seg, 4 seg, 8 seg, 16 seg.
4. Rotación de proxies en los reintentos
La regla más importante: al reintentar, usa un PROXY DIFERENTE de tu grupo. Si un proxy no pudo ejecutar la solicitud, la probabilidad de que funcione en el reintento es baja. Pero otro proxy tiene una alta probabilidad de éxito.
Esto es especialmente importante al trabajar con proxies residenciales, donde tienes un grupo de cientos o miles de direcciones IP. En cada reintento, toma una nueva IP aleatoria del grupo.
Ejemplos de configuración de timeout y retry en Python
Veamos ejemplos prácticos de implementación de timeout y lógica de reintentos en Python utilizando bibliotecas populares.
Ejemplo 1: Configuración básica con requests
La biblioteca requests es la más popular para solicitudes HTTP en Python. Aquí te mostramos cómo configurar el timeout y un simple retry:
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
# Configuración de la lógica de reintentos
retry_strategy = Retry(
total=5, # Máximo 5 intentos
backoff_factor=1, # Retraso: 1, 2, 4, 8, 16 segundos
status_forcelist=[429, 500, 502, 503, 504], # Códigos de error para reintentos
allowed_methods=["HEAD", "GET", "POST", "PUT", "DELETE"]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session = requests.Session()
session.mount("http://", adapter)
session.mount("https://", adapter)
# Configuración del proxy
proxies = {
'http': 'http://username:password@proxy.example.com:8080',
'https': 'http://username:password@proxy.example.com:8080'
}
# Ejecución de la solicitud con timeout
try:
response = session.get(
'https://www.wildberries.ru/catalog/electronics',
proxies=proxies,
timeout=(5, 15) # connect timeout 5 seg, read timeout 15 seg
)
print(f"¡Éxito! Estado: {response.status_code}")
print(f"Tamaño de la respuesta: {len(response.content)} bytes")
except requests.exceptions.Timeout:
print("Error: se superó el timeout")
except requests.exceptions.ProxyError:
print("Error: problema con el proxy")
except requests.exceptions.RequestException as e:
print(f"Error de solicitud: {e}")
En este ejemplo, configuramos un retry automático a nivel de sesión. En caso de errores 429, 500, 502, 503, 504, la biblioteca repetirá automáticamente la solicitud hasta 5 veces con un retraso exponencial.
Ejemplo 2: Rotación de proxies en los reintentos
Un ejemplo más avanzado con rotación de proxies del grupo en cada intento:
import requests
import random
import time
# Grupo de proxies (reemplaza con tus proxies reales)
PROXY_POOL = [
'http://user:pass@proxy1.example.com:8080',
'http://user:pass@proxy2.example.com:8080',
'http://user:pass@proxy3.example.com:8080',
'http://user:pass@proxy4.example.com:8080',
]
def make_request_with_retry(url, max_retries=5, base_delay=1):
"""
Realiza una solicitud con retry y rotación de proxies
"""
for attempt in range(max_retries):
# Selecciona un proxy aleatorio del grupo
proxy = random.choice(PROXY_POOL)
proxies = {'http': proxy, 'https': proxy}
try:
response = requests.get(
url,
proxies=proxies,
timeout=(5, 15),
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'}
)
# Verifica el código de estado
if response.status_code == 200:
return response
elif response.status_code in [429, 500, 502, 503, 504]:
# Error temporal - reintenta
print(f"Intento {attempt + 1}: código {response.status_code}, reintentando...")
else:
# Error permanente - detiene
print(f"Error {response.status_code}, deteniendo intentos")
return None
except (requests.exceptions.Timeout,
requests.exceptions.ProxyError,
requests.exceptions.ConnectionError) as e:
print(f"Intento {attempt + 1}: error {type(e).__name__}, reintentando...")
# Si no es el último intento - espera con retraso exponencial
if attempt < max_retries - 1:
delay = base_delay * (2 ** attempt)
print(f"Esperando {delay} segundos antes del siguiente intento...")
time.sleep(delay)
print("Se han agotado todos los intentos")
return None
# Uso
result = make_request_with_retry('https://www.ozon.ru/category/smartfony-15502/')
if result:
print(f"¡Éxito! Se recibieron {len(result.content)} bytes de datos")
else:
print("No se pudo realizar la solicitud")
Este código selecciona un nuevo proxy aleatorio del grupo en cada intento, lo que aumenta significativamente la probabilidad de éxito de la solicitud.
Ejemplo 3: Uso de la biblioteca tenacity
Para un control más flexible de la lógica de reintentos, puedes usar la biblioteca especializada tenacity:
from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type
import requests
@retry(
stop=stop_after_attempt(5), # Máximo 5 intentos
wait=wait_exponential(multiplier=1, min=1, max=30), # Retraso exponencial de 1-30 seg
retry=retry_if_exception_type((requests.exceptions.Timeout,
requests.exceptions.ProxyError,
requests.exceptions.ConnectionError))
)
def fetch_with_proxy(url, proxy):
"""
Función con retry automático a través de un decorador
"""
proxies = {'http': proxy, 'https': proxy}
response = requests.get(url, proxies=proxies, timeout=(5, 15))
response.raise_for_status() # Lanzará una excepción en caso de error HTTP
return response
# Uso
try:
result = fetch_with_proxy(
'https://www.avito.ru/rossiya/telefony',
'http://user:pass@proxy.example.com:8080'
)
print(f"¡Éxito! Estado: {result.status_code}")
except Exception as e:
print(f"No se pudo realizar la solicitud después de todos los intentos: {e}")
La biblioteca tenacity ofrece opciones de configuración de retry muy flexibles a través de decoradores. Instalación: pip install tenacity
Soluciones listas para scraping sin código
Si no eres programador o quieres ahorrar tiempo en desarrollo, existen herramientas de scraping listas para usar con soporte integrado para timeout y lógica de reintentos. No necesitas escribir código, solo configurar los parámetros en la interfaz gráfica.
Octoparse
Un popular scraper visual para Windows y Mac. Configuración de timeout y retry:
- Abre la configuración de la tarea → Opciones avanzadas
- Page Load Timeout: establece 20-30 segundos
- Ajax Timeout: 10-15 segundos para contenido dinámico
- Retry Times: 3-5 intentos en caso de error
- En la configuración de proxy puedes cargar una lista y habilitar la rotación automática
ParseHub
Un scraper en la nube con un plan gratuito. Configuración:
- Settings → Advanced → Page Load Delay: 5-10 segundos
- Request Timeout: 30 segundos
- Retry Failed Requests: habilitar, 3 intentos
- Soporta proxies a través de la configuración del proyecto
Apify
Una plataforma para automatizar tareas web con actores (scripts) listos para hacer scraping de sitios populares. Muchos actores para scraping de marketplaces (Wildberries, Ozon) ya tienen configuraciones óptimas integradas para timeout y retry. Solo necesitas:
- Seleccionar un actor listo para el sitio deseado
- Indicar el proxy (soporta integración con proveedores de proxies)
- Iniciar la tarea — todo lo demás se configura automáticamente
Navegadores anti-detección para automatización
Si trabajas con redes sociales o plataformas publicitarias a través de Dolphin Anty, AdsPower o Multilogin, el timeout se configura en el perfil del navegador:
- Dolphin Anty: Configuración del perfil → Proxy → Timeout: 10-15 segundos
- AdsPower: Proxy Settings → Connection Timeout: 10 segundos, Read Timeout: 20 segundos
- Multilogin: Browser Profile → Network → Proxy Timeout: 15 segundos
Al automatizar a través de estos navegadores (por ejemplo, con scripts de Selenium), el timeout del proxy se hereda de la configuración del perfil, pero también puedes establecer timeouts adicionales a nivel de script.
Errores comunes al configurar timeouts
Incluso los desarrolladores experimentados y los especialistas en scraping cometen errores típicos al trabajar con timeouts y reintentos. Aquí están los más comunes:
Error 1: Ausencia de timeout
Muchas bibliotecas no establecen un timeout por defecto o establecen un valor muy alto (varios minutos). Si no has especificado un timeout explícitamente, tu script puede colgarse durante mucho tiempo.
Solución: Siempre especifica explícitamente el timeout en cada solicitud. Es mejor obtener un error después de 15 segundos que esperar 5 minutos.
Error 2: Mismo proxy en todos los reintentos
Si el proxy no respondió la primera vez, la probabilidad de éxito en el reintento con el mismo proxy es muy baja. Muchos olvidan rotar los proxies entre intentos.
Solución: Usa un nuevo proxy del grupo en cada reintento. Esto es crítico para una alta tasa de éxito.
Error 3: Timeouts demasiado cortos para proxies lentos
Los proxies móviles y algunos residenciales pueden ser más lentos que los de centros de datos. Si estableces un timeout de 5 segundos para un proxy móvil, recibirás muchos errores falsos en IPs que funcionan perfectamente.
Solución: Ten en cuenta el tipo de proxy. Para móviles, usa un timeout de al menos 10-15 segundos.
Error 4: Reintentos infinitos sin límite
Algunos implementan reintentos en un ciclo while True sin limitar el número de intentos. Si el problema está del lado del sitio objetivo (por ejemplo, está completamente caído), el script intentará indefinidamente.
Solución: Siempre limita el número de reintentos (máximo 3-10 intentos) y registra las solicitudes fallidas para análisis posterior.
Error 5: Ignorar el tipo de error
No todos los errores necesitan ser reintentados. Por ejemplo, si recibes un 404 (página no encontrada), el reintento no tiene sentido, simplemente la página no existe. Pero un 503 (servicio temporalmente no disponible) tiene sentido reintentarlo después de unos segundos.
Solución: Analiza el tipo de error y reintenta solo problemas temporales (timeout, error de conexión, 429, 500, 502, 503, 504).
Error 6: Falta de registro
Sin logs, no entenderás por qué las solicitudes fallan: ¿es un problema con el proxy, con los timeouts o con el sitio objetivo?
Solución: Registra cada error indicando: qué proxy se utilizó, qué timeout hubo, cuántos intentos se hicieron, qué error ocurrió exactamente. Esto ayudará a optimizar la configuración.
Consejo sobre la elección de proxies: Si a menudo enfrentas errores de timeout incluso con configuraciones correctas, puede que el problema esté en la calidad de los proxies. Los proxies públicos baratos o compartidos a menudo están sobrecargados y responden lentamente. Para un funcionamiento estable, recomendamos usar proxies residenciales de calidad con uptime garantizado.
Conclusión
La configuración correcta de timeout y lógica de reintentos no es solo un detalle técnico, sino un factor críticamente importante para la estabilidad y eficiencia al trabajar con proxies. Sin timeouts, tus scripts se colgarán en proxies muertos, perdiendo tiempo. Sin lógica de reintentos, perderás datos ante errores temporales. Y sin rotación de proxies en los reintentos, obtendrás una baja tasa de éxito incluso con un buen grupo de IPs.
Principales conclusiones de esta guía:
- Siempre establece el timeout explícitamente: connect timeout 5-10 segundos, read timeout 10-30 segundos dependiendo de la tarea
- Usa lógica de reintentos con un límite de 3-5 intentos y retraso exponencial
- Rota los proxies en cada reintento — esta es la clave para una alta tasa de éxito
- Repite solo errores temporales (timeout, 429, 500, 502, 503, 504), no gastes intentos en errores permanentes (404, 403)
- Registra todos los errores para análisis y optimización de configuraciones
- Ten en cuenta el tipo de proxy: los móviles son más lentos que los de centros de datos, aumenta los timeouts en consecuencia
Si trabajas con scraping de marketplaces (Wildberries, Ozon, Avito), automatización de redes sociales o plataformas publicitarias, la estabilidad de los proxies afecta directamente tu resultado. Usa proxies de calidad con alto uptime y configura correctamente los timeouts y reintentos — esto te ahorrará horas de tiempo y miles de solicitudes perdidas.
Para tareas que requieren la máxima estabilidad y un mínimo de errores de timeout, recomendamos probar proxies de centros de datos — ofrecen alta velocidad de respuesta y conexión estable, lo que es especialmente importante en scraping masivo y automatización.