Trả lời nhanh
Làm sao dùng proxy di động trong Python với xoay IP?
Truyền URL proxy http://USERNAME:[email protected]:7777 vào requests hoặc httpx, rồi gọi POST /api/v1/mobile/{portId}/rotate với API key khi cần IP nhà mạng mới. Chờ phản hồi thường 5–15 giây, tôn trọng khoảng cách 30 giây giữa các lần xoay. Các cổng riêng CellMast 4G/5G bắt đầu từ 2,63$/ngày, không cần KYC, trả bằng crypto.
Bạn cần gì
| Python | Phiên bản 3.10 trở lên |
|---|---|
| Thư viện | requests (HTTP), requests[socks] hoặc httpx[socks] cho SOCKS5 |
| Gateway | gw.cellmast.com, cổng HTTP 7777, cổng SOCKS5 7778 |
| Thông tin đăng nhập cổng | Tên người dùng và mật khẩu trong khu vực khách hàng; sau khi bộ phận hỗ trợ chuyển cổng, xem lại host, cổng và mật khẩu trong khu vực khách hàng vì có thể thay đổi |
| API key | Với phạm vi proxies, dùng cho xoay IP |
| Tên người dùng pool xoay IP | USERNAME-country-{cc}-session-{id}-ttl-{minutes} |
Làm thế nào để tôi gửi yêu cầu qua một cổng di động?
Đặt cùng một URL proxy cho http và https. Với các mục tiêu HTTPS, requests mở một kênh CONNECT qua cổng, nên mục tiêu sẽ thấy IP của nhà mạng và TLS của bạn vẫn là đầu cuối.
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)Làm thế nào để tôi xoay IP từ Python?
Đóng gói cuộc gọi xoay trong một trợ giúp hiểu được câu trả lời 429. Trợ giúp dưới đây chờ Retry-After khi bạn xoay quá sớm, sau đó kiểm tra xem nhà mạng có thực sự cung cấp địa chỉ mới.
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"))Làm thế nào để tôi xoay giữa các công việc, không xoay bên trong?
Chạy toàn bộ công việc trên một địa chỉ, rồi xoay trước công việc kế tiếp. Điều này giữ cookie và đăng nhập ổn định trong một công việc và cung cấp địa chỉ mới cho mỗi công việc.
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 exampleLàm thế nào để tôi sử dụng hồ bơi xoay với các phiên dính trong httpx?
Trên hồ bơi theo GB không có cuộc gọi xoay: tên người dùng quyết định. Nếu không có id phiên, mỗi kết nối mới được cấp IP mới. Các client HTTP giữ kết nối mở (keep-alive), nên mỗi yêu cầu IP mới hãy mở client mới cho mỗi yêu cầu, hoặc gửi Connection: close. Với session-<id>-ttl-<minutes>, yêu cầu giữ một IP trong thời gian đó.
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)Script của tôi nên xử lý lỗi nào?
- HTTP 429 từ API xoay: bạn đã xoay chưa đủ 30 giây. Chờ
Retry-After. - HTTP 409
port_not_active: cổng đã hết hạn hoặc bị tạm ngưng. Kiểm tra khu vực khách hàng. - Lỗi kết nối proxy ngay sau khi xoay: bình thường; modem đang kết nối lại. Thử lại sau một khoảng tạm dừng ngắn.
- HTTP 407 từ cổng: tên người dùng hoặc mật khẩu cổng sai.
- Mục tiêu trả lời 403 hoặc 429: giảm tốc trước, sau đó xoay một lần. IP di động được chia sẻ, và làm chậm lại sửa được đa số các lỗi này.
Python và proxy di động: các câu hỏi
Tôi nên dùng HTTP hay SOCKS5 trong Python?
HTTP đơn giản và làm việc với requests thuần túy. SOCKS5 cần thêm requests[socks] nhưng truyền mọi lưu lượng TCP, và socks5h:// phân giải DNS trên proxy thay vì máy của bạn. Cả hai tới cùng một modem CellMast: HTTP qua cổng 7777, SOCKS5 qua cổng 7778.
Tôi có thể dùng asyncio với proxy di động không?
Có. httpx.AsyncClient(proxy=...) và aiohttp đều chấp nhận URL proxy HTTP. Giữ độ đồng thời vừa phải trên một cổng chuyên dụng: đó là một modem trên một kết nối nhà mạng, nên hàng chục yêu cầu song song cùng chia sẻ kênh sóng.
Làm thế nào để tôi dùng Selenium hoặc Playwright với cổng này?
Trong Playwright, truyền proxy={"server": "http://gw.cellmast.com:7777", "username": "USERNAME", "password": "PASSWORD"} vào launch() hoặc new_context(). Tùy chọn proxy của Selenium không có mật khẩu: trả lời xác thực mạng proxy qua Selenium 4 BiDi, hoặc dùng Playwright. Xoay giữa các context trình duyệt, không xoay khi trang đang tải.
Nhận một cổng và một khóa API
Cổng 4G/5G chuyên dụng từ 2,63$/ngày, dữ liệu di động xoay từ 1,50 US$/GB. Thanh toán bằng crypto.