快速回答
如何在 Python 中使用美国城市代理?
用网关和城市用户名拼出代理 URL,再传给 requests:http://USERNAME-country-us-state-il-city-chicago:[email protected]:7777。加上 -zip- 可指定街区,或用 -session- 保持同一个 IP。MetroProxies 从 US$0.50/GB(2026 年 10 月)起,每个套餐都包含城市、ZIP 和 ASN 定向。无需 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。先尝试最窄的请求,逐级放宽,并返回实际响应的层级,以便随结果一起保存。下面的函数正是这样做的,并且在州这一级之后就放弃,而不是无限重试。
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()会保持连接打开,因此轮换模式在整个会话中只给一个 IP。若要轮换,请使用普通的requests.get()调用,或为每个请求新建一个Session。 - SOCKS5: 安装
pip install "requests[socks]"并使用socks5h://,让代理来解析主机名,而不是你的机器。端口 7778。 - 密码中的特殊字符: 用
urllib.parse.quote(password, safe="")进行 URL 编码。 - 超时: 一定要设置;住宅出口可能比数据中心出口慢。
- 保持礼貌: 对每个站点的请求频率保持适度,并遵守 robots.txt 及其条款。
接下来该去哪里?
从五分钟快速上手开始,对比 Node.js 和 curl 示例,并用按城市粘性会话保持 IP。全部文档:documentation。
关于 Python,人们还问什么?
httpx 也能用吗?
可以。在 httpx 0.28 及更高版本中,把 proxy="http://USERNAME-country-us-state-il-city-chicago:[email protected]:7777" 传给 httpx.Client()。旧版本使用 proxies 参数。
这些示例是针对网关运行的吗?
它们已用 python -I -m py_compile 在 Python 3.10+ 上做过语法检查,其中 USERNAME 和 PASSWORD 为占位符。请用你自己的凭据运行。
如何获取出口 IP 的 ASN?
ipinfo.io 回复中的 org 字段以它开头(例如 Comcast 的 "AS7922 ...")。如需 ASN 定向,请在用户名后加上 -asn-7922;参见 ASN 定向。