Respuesta rápida
¿Cómo uso un proxy móvil en Python con rotación de IP?
Pasa la URL del proxy http://USERNAME:[email protected]:7777 a requests o httpx, luego llama a POST /api/v1/mobile/{portId}/rotate con tu clave API cuando quieras una nueva IP del operador. Espera la respuesta, que suele tardar 5–15 segundos, y respeta el intervalo de 30 segundos entre rotaciones. CellMast puertos dedicados 4G/5G desde $2.63/día, sin KYC, se puede pagar con criptomonedas.
Lo que necesitas
| Python | 3.10 o superior |
|---|---|
| Librerías | requests (HTTP), requests[socks] o httpx[socks] para SOCKS5 |
| Gateway | gw.cellmast.com, puerto HTTP 7777, puerto SOCKS5 7778 |
| Credenciales del puerto | Usuario y contraseña desde el área del cliente; después que soporte mueve un puerto, lee de nuevo su host, puertos y contraseña en el área del cliente, porque pueden cambiar |
| Clave API | Con el ámbito proxies, para rotación |
| Usuario para pool rotativa | USERNAME-country-{cc}-session-{id}-ttl-{minutes} |
¿Cómo envío una solicitud a través de un puerto móvil?
Configura la misma URL del proxy para http y https. Para objetivos HTTPS, requests abre un túnel CONNECT a través de la pasarela, así el objetivo ve la IP del operador y tu TLS permanece de extremo a extremo.
import requests
PROXY = "http://USERNAME:[email protected]:7777"
proxies = {"http": PROXY, "https": PROXY}
r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=30)
print(r.json()) # {'ip': '<carrier IP>'}import requests
# socks5h: the proxy resolves the hostname, not your machine
PROXY = "socks5h://USERNAME:[email protected]:7778"
r = requests.get("https://api.ipify.org", proxies={"http": PROXY, "https": PROXY}, timeout=30)
print(r.text)¿Cómo rotar la IP desde Python?
Envuelve la llamada de rotación en una función auxiliar que entienda la respuesta 429. El asistente a continuación espera Retry-After cuando rotas demasiado pronto, luego verifica que el operador realmente haya asignado una dirección nueva.
import time
import requests
API = "https://cellmast.com/api/v1"
KEY = "API_KEY"
def rotate(port_id: str, tries: int = 3) -> str:
"""Ask the modem for a new carrier IP and return it."""
for _ in range(tries):
r = requests.post(f"{API}/mobile/{port_id}/rotate",
headers={"Authorization": f"Bearer {KEY}"}, timeout=60)
if r.status_code == 429: # rotation_too_soon
time.sleep(int(r.headers.get("Retry-After", "30")))
continue
r.raise_for_status()
data = r.json()
if data["ip"] != data.get("previousIp"):
return data["ip"]
time.sleep(30) # same IP from the carrier: wait and try again
raise RuntimeError("no new IP after several tries")
print("new IP:", rotate("PORT_ID"))¿Cómo rotar entre trabajos, no dentro de ellos?
Ejecuta todo un trabajo con una sola dirección y rota antes del siguiente. Esto mantiene las cookies y sesiones iniciadas consistentes dentro de un trabajo y da a cada trabajo una dirección fresca.
import requests
PROXY = "http://USERNAME:[email protected]:7777"
def run_job(urls):
with requests.Session() as s:
s.proxies = {"http": PROXY, "https": PROXY}
for url in urls:
resp = s.get(url, timeout=30)
print(resp.status_code, url)
jobs = [["https://example.com/a", "https://example.com/b"],
["https://example.com/c"]]
for urls in jobs:
run_job(urls)
rotate("PORT_ID") # helper from the previous example¿Cómo usar la piscina rotativa con sesiones persistentes en httpx?
En la piscina por GB no hay llamada de rotación: el nombre de usuario decide. Sin un ID de sesión, cada nueva conexión recibe una IP nueva. Los clientes HTTP mantienen las conexiones abiertas (keep-alive), así que para una IP nueva por solicitud abre un cliente nuevo para cada solicitud, o envía Connection: close. Con session-<id>-ttl-<minutes>, las solicitudes mantienen una IP durante ese tiempo.
import uuid
import httpx
def pool_client(country: str = "us", minutes: int | None = None) -> httpx.Client:
user = f"USERNAME-country-{country}"
if minutes:
user += f"-session-{uuid.uuid4().hex[:8]}-ttl-{minutes}"
proxy = f"http://{user}:[email protected]:7777"
return httpx.Client(proxy=proxy, timeout=30)
with pool_client("gb", minutes=10) as c: # same UK mobile IP for 10 minutes
print(c.get("https://api.ipify.org").text)
print(c.get("https://api.ipify.org").text)¿Qué errores debe manejar mi script?
- HTTP 429 de la API de rotación: rotaste hace menos de 30 segundos. Espera
Retry-After. - HTTP 409
port_not_active: el puerto expiró o está suspendido. Revisa el área de cliente. - Errores de conexión proxy justo después de rotar: normal; el módem se está reconectando. Reintenta tras una pausa corta.
- HTTP 407 de la pasarela: usuario o contraseña erróneos para el puerto.
- Objetivos que responden 403 o 429: reduce la velocidad primero, luego rota una vez. Las IPs móviles son compartidas y un ritmo más calmado soluciona la mayoría.
Python y proxies móviles: preguntas
¿Debo usar HTTP o SOCKS5 en Python?
HTTP es más simple y funciona con requests puro. SOCKS5 requiere el extra de requests[socks] pero soporta cualquier tráfico TCP, y socks5h:// resuelve DNS del lado del proxy en vez de tu máquina. Ambos alcanzan el mismo módem CellMast: HTTP en el puerto 7777, SOCKS5 en el puerto 7778.
¿Puedo usar asyncio con un proxy móvil?
Sí. httpx.AsyncClient(proxy=...) y aiohttp aceptan ambos una URL HTTP del proxy. Mantén la concurrencia moderada en un solo puerto dedicado: es un módem con una conexión de operador, así que docenas de solicitudes paralelas comparten el mismo enlace radio.
¿Cómo hago que Selenium o Playwright usen el puerto?
En Playwright, pasa proxy={"server": "http://gw.cellmast.com:7777", "username": "USERNAME", "password": "PASSWORD"} a launch() o new_context(). Las opciones de proxy de Selenium no aceptan contraseña: responde la autenticación del proxy con Selenium 4 BiDi, o usa Playwright. Rota entre contextos del navegador, nunca mientras se carga una página.
Obtén un puerto y una clave API
Puertos 4G/5G dedicados de $2.63/día, datos móviles rotativos de 1,50 US$/GB. Pagar con criptomonedas.