Resposta rápida
Como usar proxy móvel em Python com rotação de IP?
Passe a URL do proxy http://USERNAME:[email protected]:7777 para requests ou httpx e chame POST /api/v1/mobile/{portId}/rotate com sua chave API quando quiser um novo IP do provedor. Aguarde a resposta, que leva geralmente de 5 a 15 segundos, e respeite o intervalo de 30 segundos entre rotações. CellMast portas dedicadas 4G/5G a partir de $2,63/dia, sem KYC, pagar com cripto.
O que você precisa
| Python | 3.10 ou superior |
|---|---|
| Bibliotecas | requests (HTTP), requests[socks] ou httpx[socks] para SOCKS5 |
| Gateway | gw.cellmast.com, porta HTTP 7777, porta SOCKS5 7778 |
| Credenciais da porta | Usuário e senha na área do cliente; após suporte mover uma porta, confira host, portas e senha novamente na área do cliente, pois podem mudar |
| Chave API | Com escopo proxies, para rotação |
| Usuário de pool rotativo | USERNAME-country-{cc}-session-{id}-ttl-{minutes} |
Como envio uma requisição por uma porta móvel?
Configure a mesma URL de proxy para http e https. Para alvos HTTPS, requests abre um túnel CONNECT via gateway, assim o alvo vê o IP da operadora e seu TLS fica ponta a ponta.
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)Como faço para rotacionar o IP com Python?
Envolva a chamada de rotação em um helper que entenda a resposta 429. O helper abaixo espera Retry-After quando você rotacionar cedo demais, depois verifica se a operadora realmente forneceu um novo endereço.
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"))Como faço para rotacionar entre jobs, não dentro deles?
Execute um job inteiro em um único endereço, depois rotacione antes do próximo. Isso mantém cookies e logins consistentes dentro do job e dá a cada job um endereço novo.
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 exampleComo uso o pool rotativo com sessões sticky no httpx?
No pool por GB não existe chamada de rotação: o nome de usuário decide. Sem um ID de sessão, cada nova conexão recebe um novo IP. Clientes HTTP mantêm conexões abertas (keep-alive), então para um IP novo por requisição abra um cliente novo para cada requisição, ou envie Connection: close. Com session-<id>-ttl-<minutes>, as requisições mantêm um IP para esse tempo.
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)Quais erros meu script deve tratar?
- HTTP 429 da API de rotação: você rotacionou há menos de 30 segundos. Espere
Retry-After. - HTTP 409
port_not_active: a porta expirou ou está suspensa. Confira área do cliente. - Erros de conexão com proxy logo após rotação: normal; o modem está reconectando. Tente novamente após uma pausa curta.
- HTTP 407 do gateway: usuário ou senha errados para a porta.
- Alvos respondendo 403 ou 429: diminua o ritmo primeiro, depois rotacione uma vez. IPs móveis são compartilhados, e um ritmo mais calmo resolve a maioria.
Python e proxies móveis: perguntas
Devo usar HTTP ou SOCKS5 no Python?
HTTP é mais simples e funciona com requests puro. SOCKS5 precisa do extra requests[socks] mas carrega qualquer tráfego TCP, e socks5h:// resolve DNS no proxy em vez da sua máquina. Ambos alcançam o mesmo modem CellMast: HTTP na porta 7777, SOCKS5 na porta 7778.
Posso usar asyncio com proxy móvel?
Sim. httpx.AsyncClient(proxy=...) e aiohttp aceitam URL de proxy HTTP. Mantenha a concorrência moderada em uma porta dedicada: é um modem em uma conexão de operadora, então dezenas de requisições paralelas compartilham o mesmo link rádio.
Como fazer Selenium ou Playwright usarem a porta?
No Playwright, passe proxy={"server": "http://gw.cellmast.com:7777", "username": "USERNAME", "password": "PASSWORD"} para launch() ou new_context(). As opções de proxy do Selenium não aceitam senha: responda login do proxy via autenticação de rede Selenium 4 BiDi ou use Playwright. Rotacione entre contextos de navegador, nunca enquanto a página está carregando.
Adquira porta e chave API
Portas dedicadas 4G/5G da $2,63/dia, dados móveis rotativos da US$ 1,50/GB. Pague com cripto.