# Sesiones persistentes y rotación de IP: IDs de sesión, TTL y reutilización de conexión

> Cómo funcionan las sesiones persistentes y la rotación de IP en una puerta de enlace proxy residencial: IDs de sesión, TTL, reutilización de conexión por biblioteca y una pool de sesiones.

- URL: https://crawlrelay.com/es/docs/sessions/
- Última actualización: 2026-10-13
- Publisher: CrawlRelay (https://crawlrelay.com)

La rotación ocurre por conexión, la persistencia por ID de sesión. Una vez que sabes cómo tu biblioteca reutiliza conexiones, puedes decidir cuándo cambia exactamente la IP.

**Respuesta rápida — ¿Cómo funcionan las sesiones persistentes y la rotación de IP en un proxy residencial?**

En **CrawlRelay**, un nombre de usuario sin ID de sesión obtiene una IP del pool en cada nueva conexión TCP, usualmente diferente, y `-session-<id>-ttl-<minutes>` mantiene una IP para ese ID durante hasta 30 minutos, aunque la IP puede cambiar antes. La rotación sigue las conexiones, no las solicitudes HTTP, así que el keep-alive decide cuándo cambia realmente tu IP. El tráfico residencial cuesta 0,50 US$/GB desde 50 GB. Se paga en criptomonedas, sin KYC.

## Reglas de sesión de un vistazo

| Atributo | Valor |
| --- | --- |
| Unidad de rotación | Una IP del pool por cada nueva conexión TCP, usualmente diferente |
| Sesión persistente | `-session-<id>-ttl-<minutes>` anexado al nombre de usuario |
| Duración de la sesión | hasta 30 minutos |
| ID de sesión | 1–32 letras o dígitos; un ID por flujo |
| Qué termina una sesión antes de tiempo | El dispositivo residencial que hay detrás queda offline |
| IDs compartidos | Los clientes que envían el mismo ID comparten la misma salida |
| Costo | Ninguno: las sesiones y la rotación están incluidas en el precio por GB |

## ¿Qué sucede en la puerta de enlace cuando envío un ID de sesión?

La puerta de enlace lee el nombre de usuario en cada nueva conexión. Sin una parte de sesión, selecciona una salida residencial que coincida con tu segmentación solo para esa conexión. Con una parte de sesión, mantiene la misma salida para ese ID hasta el TTL que configures.

Una IP fija es una conexión real de un hogar, por lo que puede desaparecer antes de que termine el TTL: el dispositivo se apaga, pierde Wi-Fi o cambia de red. Los flujos largos deben sobrevivir a eso, verificando la IP de salida en puntos de control y reiniciando desde un punto de control en lugar de fallar toda la tarea.

## ¿Cómo reutiliza conexiones cada biblioteca?

Si una biblioteca mantiene viva una conexión, cada solicitud en ella comparte una sola salida. Así es como se obtiene cada comportamiento a propósito.

| Biblioteca | Por defecto | Nueva IP por solicitud | Una IP para un flujo |
| --- | --- | --- | --- |
| Python requests | `Session` mantiene las conexiones activas | Encabezado `Connection: close`, o un nuevo `Session` por solicitud | Un `Session` con un ID de sesión en el nombre de usuario |
| httpx | El cliente agrupa conexiones | `httpx.Limits(max_keepalive_connections=0)` | Un cliente por ID de sesión |
| aiohttp | `TCPConnector` agrupa conexiones | `TCPConnector(force_close=True)` | ID de sesión en el nombre de usuario de la URL del proxy |
| Scrapy | Agrupaciones por credenciales y host del proxy | `meta={"proxy_session": "new"}` con nuestro [middleware](https://crawlrelay.com/es/docs/scrapy/) | Un `proxy_session` fijo para el flujo |
| Playwright / Puppeteer | Chrome agrupa por contexto | Nuevo contexto por página | Un contexto por ID de sesión |
| Node.js undici, axios, got | Los agentes mantienen los sockets activos | Nuevo agente por solicitud, o keep-alive desactivado | Un agente por ID de sesión |
| curl | Una conexión por comando | Ya es así | Mismo ID de sesión en cada comando |

## ¿Qué estrategia de sesión se ajusta a qué tipo de trabajo de scraping?

| Trabajo | Estrategia | TTL sugerido |
| --- | --- | --- |
| Páginas independientes de producto, artículo o listado | Rotar: sin ID de sesión | — |
| Paginación cuya página siguiente depende de una cookie o cursor | Una sesión sticky por listado | 10–30 min |
| Buscar, luego resultados, luego páginas de detalle | Una sesión sticky por búsqueda | 10–20 min |
| Navegador sin interfaz que renderiza varias páginas de un sitio | Una sesión sticky por contexto de navegador | La duración del contexto, hasta 30 min |
| Comprobar qué muestra una página en varias ciudades | Una sesión corta por comprobación de ciudad | 5 min |
| Volver a comprobar la misma página cada hora | Rotar | — |

## ¿Cómo gestiono un grupo de sesiones sticky en Python?

Un grupo pequeño distribuye la carga entre varios proxies móviles 4G estables y retira cada uno tras un número establecido de solicitudes o tras una señal de que su proxy está fallando, como un 502 o 503. Nota lo que no hace: no cambia IPs para pasar un 403 o un 429. Eso significa que el sitio quiere que reduzcas la velocidad, así que el grupo los eleva a tu código.

*Python: un grupo de sesiones sticky*

```python
import random
import uuid

import requests

GATEWAY = "gw.crawlrelay.com:7777"
BASE_USER, PASSWORD = "USERNAME-country-us", "PASSWORD"


class SlowDown(Exception):
    """The target asked us to slow down (403 or 429): back off, do not rotate."""


class StickySession:
    def __init__(self, ttl=15, max_requests=50):
        self.id = uuid.uuid4().hex[:10]
        self.max_requests, self.used = max_requests, 0
        user = "%s-session-%s-ttl-%d" % (BASE_USER, self.id, ttl)
        proxy = "http://%s:%s@%s" % (user, PASSWORD, GATEWAY)
        self.http = requests.Session()
        self.http.proxies = {"http": proxy, "https": proxy}


class SessionPool:
    EXIT_PROBLEMS = {502, 503, 504}

    def __init__(self, size=5, **options):
        self.options = options
        self.sessions = [StickySession(**options) for _ in range(size)]

    def _replace(self, i):
        self.sessions[i].http.close()
        self.sessions[i] = StickySession(**self.options)

    def get(self, url, **kwargs):
        i = random.randrange(len(self.sessions))
        s = self.sessions[i]
        s.used += 1
        try:
            r = s.http.get(url, timeout=(10, 30), **kwargs)
        except requests.exceptions.RequestException:
            self._replace(i)  # dropped exit or timeout: start a fresh session
            raise
        if r.status_code in (403, 429):
            raise SlowDown("%s returned %d" % (url, r.status_code))
        if r.status_code in self.EXIT_PROBLEMS or s.used >= s.max_requests:
            self._replace(i)
        return r


pool = SessionPool(size=5, ttl=15, max_requests=50)
print(pool.get("https://api.ipify.org").text)
```

## ¿Cómo sé si una IP sticky ha cambiado?

Pregunta. Solicita un servicio de eco de IP como `https://api.ipify.org` usando la misma sesión al inicio del proceso y en cada punto de control, y compara las respuestas. Un cambio significa que el proxy residencial detrás de la sesión cambió: reinicia el flujo desde su último punto de control o abre una nueva sesión. Regístralo con el ID de sesión para distinguir cambios de IP del comportamiento del sitio al hacer debug.

## ¿Cuáles errores en las sesiones cuestan más?

- **Rotar en cada solicitud de un flujo con varios pasos.** El sitio ve un carrito, cursor o token de búsqueda saltar entre países y lo reinicia.
- **Un ID de sesión para cada trabajador.** Una sesión es para un solo flujo; da a cada trabajador y flujo su propio ID.
- **Sesiones mucho más largas que el trabajo.** Un TTL de 30 minutos para un flujo de 2 minutos mantiene una IP ocupada inútilmente y complica los registros.
- **Tratar un 429 como problema de IP.** Una IP nueva no cambia la regla del sitio; reducir la velocidad sí. Consulta [429 Too Many Requests](https://crawlrelay.com/es/docs/errors/429-too-many-requests/).
- **Asumir rotación en cada solicitud.** Keep-alive mantiene el proxy; verifica la tabla arriba según tu biblioteca.

## Sesiones y rotación: preguntas

### ¿Cuánto dura una sesión sticky?

Las sesiones sticky mantienen la misma IP el tiempo que configures (ttl, en minutos), hasta 30 minutos. La IP puede cambiar antes, por ejemplo si el dispositivo residencial se desconecta.. Elige un TTL un poco más largo que el flujo que sirve y revisa el proxy en los puntos de control.

### ¿Cuesta más una sesión sticky que rotar?

No. CrawlRelay cobra el tráfico por GB, e incluye sesiones, rotación y segmentación en ese precio. Una sesión sticky incluso puede ahorrar tráfico, porque una conexión mantenida evita una nueva negociación TLS para cada solicitud.

### ¿Rotar en cada solicitud es mejor para scraping?

Para páginas independientes, rotar distribuye la carga y evita usar un proxy residencial en un sitio por horas. Para todo con estado, como paginación ligada a cookie, rompe el flujo. La mayoría de rastreos mezclan ambos: rotan entre ítems y permanecen sticky dentro de un flujo.

### ¿Puedo elegir la IP exacta que obtengo?

No. Un gateway residencial asigna proxies móviles 4G desde un grupo que cambia constantemente, según la segmentación en tu nombre de usuario. Puedes elegir país, ciudad, estado de EE. UU., código postal o ASN, y mantener una IP con una sesión sticky; no puedes reservar una dirección específica.

**Rotación y sesiones en todos los planes** 1,50 US$ por 1 GB, 0,50 US$/GB desde 50 GB. [Ver precios](https://crawlrelay.com/es/pricing/) · [Guía de concurrencia](https://crawlrelay.com/es/docs/concurrency/)

---

CrawlRelay: CrawlRelay es un servicio de proxies residenciales rotativos y proxies móviles 4G/5G para desarrolladores, ideal para scrapers y pipelines de datos de IA: tráfico prepago sin vencimiento desde 0,50 US$/GB, pagado con criptomonedas, sin subir documentos de identidad. Sin KYC — sin ID, sin selfie, sin documentos. Paga con criptomonedas.
