クイック回答
Pythonで米国都市プロキシを使うには?
ゲートウェイと都市ユーザー名からプロキシURLを組み立て、requestsに渡します:http://USERNAME-country-us-state-il-city-chicago:[email protected]:7777。地区指定には-zip-を、1つのIPを維持するには-session-を追加します。MetroProxiesは$0.50/GBからの全プランで都市・ZIP・ASNターゲティングに対応(2026年10月)。KYC不要、暗号通貨対応。
import requests
user = "USERNAME-country-us-state-il-city-chicago"
proxy = f"http://{user}:[email protected]:7777"
r = requests.get("https://ipinfo.io/json", proxies={"http": proxy, "https": proxy}, timeout=30)
r.raise_for_status()
print(r.json().get("city"), r.json().get("org"))
ZIP→都市→州のフォールバックはどうやりますか?
小さな場所では、ある時点でオンラインのIPが存在しないことがあります。まず狭いリクエストを試し、1段階ずつ広げ、応答したレベルを返して結果と一緒に保存できるようにします。以下の関数はまさにそれを行い、州レベルまでで諦めて無限にリトライしません。
import requests
GATEWAY = "gw.metroproxies.com:7777"
USER, PASSWORD = "USERNAME", "PASSWORD"
def fetch_local(url: str, state: str, city: str | None = None, zip_code: str | None = None) -> tuple[str, requests.Response]:
levels = []
if city and zip_code:
levels.append(("zip", f"-state-{state}-city-{city}-zip-{zip_code}"))
if city:
levels.append(("city", f"-state-{state}-city-{city}"))
levels.append(("state", f"-state-{state}"))
last_error: Exception | None = None
for level, segment in levels:
proxy = f"http://{USER}-country-us{segment}:{PASSWORD}@{GATEWAY}"
try:
r = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=30)
r.raise_for_status()
return level, r
except requests.RequestException as e:
last_error = e
raise RuntimeError(f"no IP at zip, city or state level: {last_error}")
level, resp = fetch_local("https://ipinfo.io/json", "nm", city="albuquerque", zip_code="87102")
print(level, resp.json().get("city"))
import requests
user = "USERNAME-country-us-state-wa-city-tacoma-session-tac01-ttl-15"
proxy = f"http://{user}:[email protected]:7777"
with requests.Session() as s:
s.proxies = {"http": proxy, "https": proxy}
first = s.get("https://api.ipify.org", timeout=30).text
# step 1, step 2 ... on your own site, all from the same Tacoma IP
second = s.get("https://api.ipify.org", timeout=30).text
print(first, second, "same IP" if first == second else "IP changed: restart the flow")
Pythonでつまずきやすいポイントは?
- リクエストごとに新しいIP:
requests.Session()は接続を開いたままにするため、ローテーションモードではセッション全体で1つのIPになります。ローテーションするには、単純なrequests.get()呼び出しまたはリクエストごとに新しいSessionを使ってください。 - SOCKS5:
pip install "requests[socks]"をインストールし、socks5h://を使って、お使いのマシンではなくプロキシ側でホスト名を解決させます。ポートは7778。 - パスワードの特殊文字:
urllib.parse.quote(password, safe="")でURLエンコードしてください。 - タイムアウト: 必ず設定してください。レジデンシャルの出口はデータセンターより遅くなることがあります。
- 礼儀正しく: 各サイトへのリクエストレートは控えめにし、robots.txtとその利用規約に従ってください。
次にどこへ進むべきですか?
5分セットアップから始め、Node.jsとcurlの例と比較し、都市別スティッキーセッションでIPを維持しましょう。全ドキュメント:ドキュメント。
Pythonについて他に何がよく聞かれますか?
httpxも動きますか?
はい。httpx 0.28以降では、httpx.Client()にproxy="http://USERNAME-country-us-state-il-city-chicago:[email protected]:7777"を渡します。古いバージョンではproxies引数を使っていました。
これらの例はゲートウェイに対して実行されましたか?
Python 3.10+でpython -I -m py_compileにより構文チェック済みで、USERNAMEとPASSWORDはプレースホルダーです。ご自身の認証情報で実行してください。
出口IPのASNを取得するには?
ipinfo.ioの応答のorgフィールドがそれで始まります(Comcastなら"AS7922 ...")。ASNターゲティングには、ユーザー名に-asn-7922を追加します。ASNターゲティングをご覧ください。