# Python Requests 代理：使用静态 ISP 代理 | ProxyJam

如何在 Python requests 中设置代理：按请求、按会话，以及使用远程 DNS 的 SOCKS5，附针对一个静态 ISP 地址测试过的代码。

- Canonical: https://proxyjam.com/zh/integrations/python-requests/
- Updated: 2026-10-23
- Language: zh

让 requests 通过一个静态 ISP 地址发出请求：一个位于具名互联网服务商网络上的 IP，在您付费的周期内保持不变。下面的代码在发布前已通过需要身份验证的代理实际运行。


传入一个同时包含 http 和 https 两个键的 proxies 字典，两个键都设为 http://USERNAME:PASSWORD@HOST:PORT，requests 就会通过代理发送请求；HTTPS 目标以隧道方式经过代理。如需 SOCKS5，请安装 requests[socks]，在订单上把代理切换为 SOCKS5，并使用 socks5h 协议，这样主机名由代理解析，而不是由您的机器解析。


## 在 Python requests 中设置代理

1. **从订单中复制四个值** 主机、端口、用户名和密码，来自控制台的“我的代理”或 API 中的订单。每个地址都有自己的四个值，没有共享网关。
2. **拼出一个代理 URL** `http://USERNAME:PASSWORD@HOST:PORT`。如果密码包含 `/`、`?`、`#` 或 `%`，请先用 `urllib.parse.quote(password, safe="")` 对其进行 URL 编码。
3. **为两种协议都设置** 把同一个 URL 同时交给 `http` 键和 `https` 键。如果只设置了 `http`，所有 HTTPS 请求都会绕过代理，从您自己的地址发出。
4. **检查一次出口地址** 请求一个显示调用方 IP 的页面，或通过同一个代理打开[“我的 IP 是什么”](/zh/what-is-my-ip/)，确认显示的是您购买的地址。
5. **带超时运行任务** 务必传入 `timeout=`：requests 默认会无限等待，连接卡住时脚本看起来就像挂起了。

## 测试过的 requests 代码

每个示例都通过带用户名和密码的 HTTP 代理连接，SOCKS5 示例除外：它需要先把代理切换为 SOCKS5，之后订单会显示新的端口和新的凭据供您使用。请把四处大写内容替换为您订单中的值。

### 按请求

为单次调用传入代理。

```
import requests

# The four values come with your order (dashboard or API)
proxy = "http://USERNAME:PASSWORD@HOST:PORT"

response = requests.get(
    "https://example.com/",
    proxies={"http": proxy, "https": proxy},
    timeout=30,
)
response.raise_for_status()
print(response.status_code)
```

### 会话

为会话中的每次调用统一设置代理。

```
import requests

proxy = "http://USERNAME:PASSWORD@HOST:PORT"

with requests.Session() as session:
    # HTTP_PROXY / HTTPS_PROXY in the environment would override
    # session.proxies; this makes the session use only its own setting.
    session.trust_env = False
    session.proxies.update({"http": proxy, "https": proxy})
    response = session.get("https://example.com/", timeout=30)
    response.raise_for_status()
    print(response.status_code)
```

### SOCKS5

由代理解析主机名的 SOCKS5。

```
# pip install "requests[socks]"
import requests

# Switch the proxy to SOCKS5 first; use the values the order then shows.
# socks5h: the proxy resolves the hostname, not your machine.
proxy = "socks5h://USERNAME:PASSWORD@HOST:PORT"

response = requests.get(
    "https://example.com/",
    proxies={"http": proxy, "https": proxy},
    timeout=30,
)
response.raise_for_status()
print(response.status_code)
```


## requests 中可以设置代理的位置

|  | 作用范围 | 凭据 | 适用场景 |
|---|---|---|---|
| 调用中的 proxies= | 仅这一次请求 | 写在 URL 中 | 只有少量调用的脚本 |
| Session.proxies | 会话中的每个请求 | 写在 URL 中 | 更长的任务，并把 trust_env 设为 False |
| HTTP_PROXY 和 HTTPS_PROXY | 进程中的每次 requests 调用 | 写在 URL 中 | 您无法修改的代码；NO_PROXY 列出要跳过的主机 |
| socks5h:// URL | 取决于它被设置在哪一层 | 写在 URL 中 | 需要由代理解析主机名时 |

依据 requests 文档整理，并用本页的代码示例在本地需要身份验证的代理上核对过。同时设置多处时，调用中的 proxies 参数优先于环境变量，环境变量又优先于 Session.proxies，除非会话把 trust_env 设为 False（会话示例就是这样做的）。


## requests 连接的是什么

- **协议:** HTTP（可承载 HTTPS）或 SOCKS5，在订单上切换
- **认证方式:** 用户名和密码，或通过 API 设置的 IP 白名单
- **地址:** 整个周期内一个静态 IP，位于具名互联网服务商的网络上
- **轮换:** 无：每个请求都使用同一个地址

## requests 与代理的常见问题

### 只设置了 http 键

键名指的是目标的协议，而不是代理的协议。只有 http 的字典会让普通 HTTP 走代理，而所有 HTTPS 调用都会直接发出，且没有任何错误提示。

### 本该用 socks5h 却用了 socks5

使用 socks5 时，由您的机器解析主机名，再把 IP 交给代理。使用 socks5h 时，由代理解析，因此查询及其结果都来自代理的网络，这对按地理位置返回内容的网站很重要。

### 密码破坏了 URL

密码中的斜杠、问号或井号会把 URL 截断，requests 在连到代理之前就会失败；百分号会被当作转义符解码。请对密码进行 URL 编码，或改用 IP 白名单身份验证，省去凭据。

### 忘了某个环境变量

除非在会话上把 trust_env 设为 False，requests 会读取 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY，而且这些变量会覆盖 Session.proxies。服务器上残留的旧变量可能把会话的流量发往您未预期的地方，或者绕过代理。


## 关于 Python requests 代理的问题

### 如何在 Python requests 中使用需要身份验证的代理？

把用户名和密码写进代理 URL，即 http://USERNAME:PASSWORD@HOST:PORT，并同时传给 http 和 https 两个键。requests 会把凭据发送给代理，凭据错误时代理会返回 407。如果密码包含保留字符，请先编码，或改用 IP 白名单。

### 如何在 requests 中使用 SOCKS5 代理？

用 pip install requests[socks] 安装扩展依赖，在订单上把代理本身切换为 SOCKS5，然后在 socks5h:// URL 中使用订单随后显示的端口和凭据。只改协议名是不够的：设为 HTTP 的地址在切换之前不会响应 SOCKS5。

### 可以用 IP 白名单身份验证代替密码吗？

可以。通过一次 API 调用 PUT /orders/ORDER_ID/whitelist，或通过 MCP 服务器，把运行脚本的公网 IPv4 地址加入代理的白名单；控制台目前还没有相应的设置项。之后代理会接受来自该地址的无凭据连接，HTTP 和 SOCKS5 均可，URL 变为 http://HOST:PORT。设置白名单期间，代理只接受列表中的地址，该订单的用户名和密码将不再起作用；发送一个空列表即可关闭白名单，密码登录随即恢复。

### 地址会在请求之间轮换吗？

不会。静态 ISP 代理在您付费的周期内就是一个地址，您通过它发送的每个请求都从这个地址发出。如果任务需要每个请求换一个地址，那需要的是轮换代理池，我们目前还不销售。

### 如何查看网站看到的是哪个 IP？

通过同一个代理请求一个回显调用方地址的页面，或在设置了该代理的浏览器中打开“我的 IP 是什么”。如果显示的是您自己的地址，很可能是缺少 https 键。

### 代理可以用来做什么？

按地区测试您自己的网站、质量检查、广告验证、价格和市场调研以及品牌保护，按照我们的可接受使用政策无需审核。代理无法绕过验证码、机器人检测、速率限制或账号封禁，政策也禁止尝试这样做。


静态地址适合每次都应从同一个地方到达的任务：监控、地区检查、把今天和上周进行比较的测试。在 [ISP 代理](/zh/isp-proxies/)页面为每个任务订购一个地址，查看[价格](/zh/pricing/)；如果同样的任务在浏览器中运行，[Selenium](/zh/integrations/selenium/) 和 [Playwright](/zh/integrations/playwright/) 指南会在那里设置同一个地址。



## 参考来源

- [Requests documentation, Proxies](https://requests.readthedocs.io/en/latest/user/advanced/#proxies)，proxies 参数、环境变量和 SOCKS 支持
- [RFC 1928, SOCKS Protocol Version 5](https://www.rfc-editor.org/rfc/rfc1928)，客户端如何按名称或按地址向 SOCKS5 代理请求目标
- [RFC 3986, URI Generic Syntax](https://www.rfc-editor.org/rfc/rfc3986#section-3.2.1)，URL 中的 userinfo 部分，以及其中必须编码的字符




Python requests 从一个字典中读取代理，这个字典把目标 URL 的协议映射到代理 URL。本指南为一个静态 ISP 地址设置这个字典，并展示它可以放在的三个位置：调用中、会话中或环境中。

## 使用用户名和密码的 Python requests 代理

大多数代理（包括我们的）都要求用户名和密码。requests 从代理 URL 中读取它们，并在每次连接时发送给代理。对于 HTTPS 目标，代理会打开一条隧道，永远看不到请求的内容。代码标签页展示了按请求和按会话两种写法。

