クイックアンサー
PythonでIPローテーション付きモバイルプロキシを使うには?
プロキシURL http://USERNAME:[email protected]:7777 を requests または httpx に渡し、新しいキャリアIPが欲しい時にAPIキーを添えて POST /api/v1/mobile/{portId}/rotate を呼び出します。応答は通常5〜15秒で、ローテーション間隔は30秒を守ってください。CellMastの専用4G/5Gポートは1日あたり2.63ドルから、KYC不要、暗号資産で支払い可能です。
必要なもの
| Python | 3.10以降 |
|---|---|
| ライブラリ | requests (HTTP), requests[socks] または httpx[socks] (SOCKS5) |
| ゲートウェイ | gw.cellmast.com、HTTPポート 7777、SOCKS5ポート 7778 |
| ポート認証情報 | クライアントエリアからのユーザー名とパスワード;サポートがポートを移動した後はホスト、ポート、パスワードを再度クライアントエリアで確認してください。変更されることがあります。 |
| APIキー | ローテーション用に proxies スコープ付き |
| ローテーティングプールのユーザー名 | USERNAME-country-{cc}-session-{id}-ttl-{minutes} |
モバイルポート経由でリクエストを送るには?
http と https に同じプロキシURLを設定してください。HTTPSターゲットの場合、requests はゲートウェイ経由でCONNECTトンネルを開くため、ターゲットにはキャリアIPが見え、TLSはエンドツーエンドで保護されます。
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)PythonでIPをローテーションするには?
ローテーション呼び出しを429レスポンスを理解するヘルパーでラップします。以下のヘルパーは、早すぎるローテーション時にRetry-Afterを待ち、キャリアが本当に新しいアドレスを割り当てたかどうかを確認します。
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"))ジョブ間で(ジョブ内ではなく)ローテーションするには?
1つのジョブを同じIPで完了させ、その後次のジョブ開始前にローテーションしてください。こうすることでジョブ内でクッキーやログイン状態が保持され、ジョブごとに新しいIPを得られます。
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 examplehttpxでスティッキーセッション付きローテーティングプールを使うには?
GB単位のプールにはローテーション呼び出しがなく、ユーザー名が決定要素です。セッションIDなしでは新しい接続ごとに新IPが割り当てられます。HTTPクライアントは接続を維持する(keep-alive)ため、リクエストごとに新IPが必要なら、新しいクライアントをリクエスト毎に開くか、Connection: closeを送信してください。session-<id>-ttl-<minutes>を使うと、その時間は同じIPを維持します。
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)スクリプトでどんなエラーを処理すべき?
- ローテーションAPIのHTTP 429: 30秒以内にローテーションしたため。
Retry-Afterまで待ってください。 - HTTP 409
port_not_active: ポートが期限切れか停止中。クライアントエリアを確認してください。 - ローテーション直後のプロキシ接続エラー: 通常。モデムが再接続中です。少し待ってリトライしてください。
- ゲートウェイからのHTTP 407: ポートのユーザー名またはパスワードが誤っています。
- ターゲットの403や429応答: まずは速度を落とし、その後一度ローテーションしてください。モバイルIPは共有されており、ペースを落とすだけで多くの問題が解消します。
Pythonとモバイルプロキシ:よくある質問
PythonでHTTPとSOCKS5どちらを使うべき?
HTTPはシンプルで普通のrequestsと動作します。SOCKS5はrequests[socks]が必要ですが、あらゆるTCPトラフィックを扱えて、socks5h://はDNS解決をあなたのマシンでなくプロキシ側で行います。両方とも同じCellMastモデムに接続します:HTTPはポート7777、SOCKS5はポート7778です。
モバイルプロキシでasyncioは使えますか?
はい。httpx.AsyncClient(proxy=...) と aiohttp はどちらもHTTPプロキシURLを受け入れます。専用ポート1つに対する同時接続数は控えめにしてください。これは1台のモデムとキャリア回線なので、何十もの並列リクエストは同じ無線リンクを共有します。
SeleniumやPlaywrightでポートを使うには?
Playwrightではproxy={"server": "http://gw.cellmast.com:7777", "username": "USERNAME", "password": "PASSWORD"}をlaunch()またはnew_context()に渡してください。Seleniumのプロキシオプションはパスワードに対応していないので、Selenium 4 BiDiのネットワーク認証でプロキシログインを処理するか、Playwrightを使ってください。ブラウザコンテキスト間でローテーションし、ページ読み込み中にローテーションしないでください。
ポートとAPIキーを手に入れる
1日あたり2.63ドルの専用4G/5Gポート、$1.50/GBのローテーティングモバイルデータ。暗号通貨で支払えます。