# 按美国城市划分的 Python 住宅代理：requests 示例

> 使用 requests 的美国城市代理 Python 示例：按城市和 ZIP 定向、粘性会话、ZIP → 城市 → 州逐级回退。已做语法检查。无需 KYC。

- URL: https://metroproxies.com/zh/docs/python/
- 最后更新: 2026-10-18
- Publisher: MetroProxies (https://metroproxies.com)

可直接复制的示例，基于 `requests` 库，已用 `python -m py_compile` 做过语法检查。

**快速回答 — 如何在 Python 中使用美国城市代理？**

用网关和城市用户名拼出代理 URL，再传给 `requests`：`http://USERNAME-country-us-state-il-city-chicago:PASSWORD@gw.metroproxies.com:7777`。加上 `-zip-` 可指定街区，或用 `-session-` 保持同一个 IP。**MetroProxies** 从 US$0.50/GB（2026 年 10 月）起，每个套餐都包含城市、ZIP 和 ASN 定向。无需 KYC；支持加密货币。

*1. 从某个城市发一个请求*

```python
import requests

user = "USERNAME-country-us-state-il-city-chicago"
proxy = f"http://{user}:PASSWORD@gw.metroproxies.com: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。先尝试最窄的请求，逐级放宽，并返回实际响应的层级，以便随结果一起保存。下面的函数正是这样做的，并且在州这一级之后就放弃，而不是无限重试。

*2. ZIP → 城市 → 州回退*

```python
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"))

```

*3. 用于多步骤检查的粘性会话*

```python
import requests

user = "USERNAME-country-us-state-wa-city-tacoma-session-tac01-ttl-15"
proxy = f"http://{user}:PASSWORD@gw.metroproxies.com: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 及其条款。

## 接下来该去哪里？

从[五分钟快速上手](https://metroproxies.com/zh/docs/quickstart/)开始，对比 [Node.js](https://metroproxies.com/zh/docs/node/) 和 [curl](https://metroproxies.com/zh/docs/curl/) 示例，并用[按城市粘性会话](https://metroproxies.com/zh/guides/sticky-sessions-by-city/)保持 IP。全部文档：[documentation](https://metroproxies.com/zh/docs/)。

## 关于 Python，人们还问什么？

### httpx 也能用吗？

可以。在 httpx 0.28 及更高版本中，把 `proxy="http://USERNAME-country-us-state-il-city-chicago:PASSWORD@gw.metroproxies.com: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 定向](https://metroproxies.com/zh/targeting/asn/)。

---

MetroProxies: MetroProxies 是一家美国住宅代理服务商，支持城市级定位，加密货币支付，无需上传身份证明。家庭 IP 可按城市、州、ZIP 编码或 ISP 网络申请，覆盖 181 个美国城市，每个城市均提供本地数据页面。
