Szybka odpowiedź
Jak korzystać z mobilnego proxy w Python z rotacją IP?
Przekaż adres proxy http://USERNAME:[email protected]:7777 do requests lub httpx, następnie wywołaj POST /api/v1/mobile/{portId}/rotate z kluczem API, gdy chcesz nowe IP operatora. Poczekaj na odpowiedź, zwykle 5–15 sekund, i zachowaj 30-sekundową przerwę między rotacjami. CellMast dedykowane porty 4G/5G zaczynają się od 2,63 USD/dzień, bez KYC, płatne kryptowalutą.
Co potrzebujesz
| Python | 3.10 lub nowszy |
|---|---|
| Biblioteki | requests (HTTP), requests[socks] lub httpx[socks] dla SOCKS5 |
| Brama | gw.cellmast.com, port HTTP 7777, port SOCKS5 7778 |
| Dane portu | Nazwa użytkownika i hasło z panelu klienta; po każdej zmianie portu przez support sprawdź hosta, porty i hasło ponownie w panelu, bo mogą ulec zmianie |
| Klucz API | Z zakresem proxies, do rotacji |
| Nazwa użytkownika puli rotującej | USERNAME-country-{cc}-session-{id}-ttl-{minutes} |
Jak wysłać zapytanie przez port mobilny?
Ustaw ten sam URL proxy dla http i https. Dla celów HTTPS requests otwiera tunel CONNECT przez bramę, więc cel widzi adres IP operatora, a twoje TLS pozostaje end-to-end.
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)Jak rotować adres IP z Pythona?
Opakuj wywołanie rotacji w pomocniczą funkcję, która rozumie odpowiedź 429. Pomocnik poniżej czeka Retry-After, gdy próbujesz zbyt wcześnie rotować, a potem sprawdza, czy operator faktycznie przydzielił nowy adres.
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"))Jak rotować między zadaniami, a nie wewnątrz nich?
Wykonaj całe zadanie na jednym adresie, a przed kolejnym rotuj. Pozwala to na spójność ciasteczek i logowań w ramach zadania oraz zapewnia każdemu zadaniu świeży adres.
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 exampleJak użyć rotującej puli z sesjami sticky w httpx?
W puli rozliczanej za GB nie ma wywołania rotacji: decyduje nazwa użytkownika. Bez identyfikatora sesji każde nowe połączenie otrzymuje nowy IP. Klienci HTTP utrzymują połączenia otwarte (keep-alive), więc by wymusić nowy IP na każde zapytanie, otwórz nowego klienta dla każdego zapytania lub wyślij Connection: close. Z session-<id>-ttl-<minutes> zapytania zachowują ten sam IP przez ten czas.
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)Jakie błędy powinien obsłużyć mój skrypt?
- HTTP 429 z API rotacji: zrotowałeś mniej niż 30 sekund temu. Poczekaj
Retry-After. - HTTP 409
port_not_active: port wygasł lub jest zawieszony. Sprawdź panel klienta. - Błędy połączenia proxy zaraz po rotacji: normalne; modem się przełącza. Spróbuj ponownie po krótkiej przerwie.
- HTTP 407 z bramy: błędna nazwa użytkownika lub hasło do portu.
- Cele odpowiadające 403 lub 429: najpierw zwolnij tempo, potem rotuj raz. Mobilne IP są współdzielone, a spokojniejszy rytm rozwiązuje większość problemów.
Python i mobilne proxy: pytania
Czy w Pythonie używać HTTP czy SOCKS5?
HTTP jest prostszy i działa z prostym requests. SOCKS5 wymaga dodatkowego requests[socks], ale obsługuje dowolny ruch TCP, a socks5h:// wykonuje rozwiązywanie DNS po stronie proxy, a nie twojej maszyny. Oba trafiają na ten sam modem CellMast: HTTP na porcie 7777, SOCKS5 na porcie 7778.
Czy mogę używać asyncio z mobilnym proxy?
Tak. httpx.AsyncClient(proxy=...) i aiohttp oba akceptują URL proxy HTTP. Zachowaj umiarkowaną równoległość na pojedynczym dedykowanym porcie: to jeden modem na jedno łącze operatora, więc dziesiątki równoczesnych zapytań korzystają z tego samego łącza radiowego.
Jak sprawić, by Selenium lub Playwright używały portu?
W Playwright przekaż proxy={"server": "http://gw.cellmast.com:7777", "username": "USERNAME", "password": "PASSWORD"} do launch() lub new_context(). Opcje proxy w Selenium nie przyjmują hasła: autoryzuj proxy przez uwierzytelnianie sieciowe Selenium 4 BiDi lub użyj Playwright. Rotuj pomiędzy kontekstami przeglądarki, nigdy w trakcie ładowania strony.
Zdobądź port i klucz API
Dedykowane porty 4G/5G od 2,63 USD/dzień, rotujące mobilne dane od 1,50 USD/GB. Płać w kryptowalutach.