快速回答
如何将 Python Requests 与静态代理一起使用?
要将 Python Requests 与静态代理一起使用,请用你的 IP 的主机、端口、用户名和密码构建代理 URL。将其同时传给 proxies= 的 http 和 https 键,设置超时,并在 api.ipify.org 检查出口 IP。SteadyProxy 截至 2026 年 10 月,静态 IP 30 天的价格为 US$2.24,无需 KYC,支持加密货币支付。
关键信息有哪些?
| 安装 | python -m pip install requests(SOCKS5:requests[socks]) |
|---|---|
| HTTP 代理 URL | http://USERNAME:PASSWORD@host:port, for both the http and https keys |
| SOCKS5 代理 URL | socks5h://USERNAME:PASSWORD@host:port(默认 SOCKS5 端口 7778) |
| 特殊字符 | 使用 urllib.parse.quote 对用户名和密码进行 URL 编码 |
| 环境代理 | session.trust_env = False 会忽略在别处设置的 HTTP_PROXY |
| 超时 | (10, 30):10 秒用于连接,30 秒用于读取,在我们的示例中 |
| 测试情况 | Python 3.14 和 Requests 2.34,2026 年 10 月 19 日,通过一个受密码保护的测试代理 |
如何通过一个静态代理发送请求?
每个静态 IP 在你的仪表盘中都有各自的主机、端口、用户名和密码。请将它们放入环境变量,而不是代码中。下面的脚本会构建代理 URL,向 api.ipify.org 发送一个请求,如果出口 IP 不是你预期的那个就停止。然后它从 ipinfo.io 读取网络名称。如果密码错误,Requests 会抛出 ProxyError,其中提到 407 Proxy Authentication Required,正如我们的测试所示。
"""Python Requests through one static proxy, with a check of the exit IP.
Install: python -m pip install requests
"""
import os
from urllib.parse import quote
import requests
HOST = os.environ.get("PROXY_HOST", "gw.steadyproxy.com")
PORT = os.environ.get("PROXY_PORT", "7777")
USER = quote(os.environ.get("PROXY_USER", "USERNAME"), safe="")
PASSWORD = quote(os.environ.get("PROXY_PASS", "PASSWORD"), safe="")
EXPECTED_IP = os.environ.get("EXPECTED_IP") # the static IP listed in your dashboard
# The proxy URL starts with http:// even for https:// sites (Requests opens a CONNECT tunnel)
PROXY = "http://" + USER + ":" + PASSWORD + "@" + HOST + ":" + PORT
PROXIES = {"http": PROXY, "https": PROXY}
with requests.Session() as session:
session.trust_env = False # ignore HTTP_PROXY / HTTPS_PROXY set elsewhere on the machine
response = session.get("https://api.ipify.org?format=json", proxies=PROXIES, timeout=(10, 30))
response.raise_for_status()
exit_ip = response.json()["ip"]
print("Exit IP:", exit_ip)
if EXPECTED_IP and exit_ip != EXPECTED_IP:
raise SystemExit("Exit IP differs from the static IP you expected")
page = session.get("https://ipinfo.io/json", proxies=PROXIES, timeout=(10, 30))
page.raise_for_status()
print("Network:", page.json().get("org"), "-", page.json().get("country"))
为什么 https:// 站点的代理 URL 是 http://?
proxies 字典的键是目标站点的协议;值是代理的地址。对于 https:// 站点,Requests 要求 HTTP 代理打开一个 CONNECT 隧道,然后通过它向站点运行 TLS。代理永远看不到解密后的页面。因此两个键都指向同一个 http:// 代理 URL。保持证书检查开启:绝不要为了让代理错误消失而设置 verify=False。
如何为每个账户分配各自的静态 IP?
将每个账户或任务映射到一个 IP,并为每个映射构建一个 Session。Session 会保留 cookie 并复用连接,并且在 trust_env = False 的情况下,其 proxies 设置不会被环境变量替换。下面的示例每行读取一个 IP,顺序为 host、port、username、password,你可以从仪表盘中的四个值复制。
"""One static IP per account or per job with Python Requests.
Each line holds the four values shown for one IP in your dashboard:
host:port:username:password
"""
import os
from urllib.parse import quote
import requests
STATIC_IPS = {
"store-uk": os.environ.get("PROXY_STORE_UK", "gw.steadyproxy.com:7777:USERNAME:PASSWORD"),
"store-de": os.environ.get("PROXY_STORE_DE", "gw.steadyproxy.com:7777:USERNAME:PASSWORD"),
}
def session_for(name):
host, port, user, password = STATIC_IPS[name].split(":", 3)
proxy = "http://" + quote(user, safe="") + ":" + quote(password, safe="") + "@" + host + ":" + port
session = requests.Session()
session.trust_env = False
session.proxies = {"http": proxy, "https": proxy}
return session
for account in STATIC_IPS:
with session_for(account) as s:
ip = s.get("https://api.ipify.org", timeout=(10, 30)).text
print(account, "->", ip)
如何使用 SOCKS5 而不是 HTTP?
安装 requests[socks],将 http:// 替换为 socks5h://,并将 HTTP 端口替换为 SOCKS5 端口。h 让代理解析主机名,因此 DNS 答案与 IP 所在国家一致。其余代码保持不变。完整、经过测试的示例见 SOCKS5 静态代理指南。一个静态 IP 的两个端口都通向同一个出口 IP。
常见错误是什么意思?
每个错误都指向一个层面。
- 带 407 的 ProxyError:用户名或密码错误,或此机器不在你的允许列表中。
- ConnectTimeout:主机或端口错误,或你这一侧的防火墙阻止了到代理端口的出站流量。
- ReadTimeout:目标或路径缓慢;稍后重试并保留读取超时。
- SSLError:目标或你机器上的证书问题;不要禁用验证。
- 来自目标的 403 或 429:站点拒绝或对请求进行了限速;放慢速度。
如果一个 IP 一小时内每个请求都失败,请联系支持。我们的替换规则:如果某个 IP 无法使用,请联系客服:在库存允许的情况下,我们会修复它,或用同一国家/地区的另一个 IP 替换。
关于 Python 和静态代理,人们还问什么?
为什么我要同时设置 http 和 https 键?
Requests 根据目标 URL 的协议选择代理。没有 https 键,对 https:// 站点的请求将直接从你自己的 IP 发出。将两个键都设置为同一个代理 URL,会将每个请求都通过静态 IP 发送。脚本中的 api.ipify.org 检查会立即发现缺失的键。
为什么对用户名和密码进行 URL 编码?
@、: 和 / 等字符在 URL 中有特定含义。否则,包含 @ 的密码会被读取为登录部分的结尾。urllib.parse.quote 配合 safe='' 会对它们进行编码,Requests 在将登录信息发送给代理之前会对其进行解码。这对 HTTP 和 socks5h:// URL 都有效。
为什么将 trust_env 设置为 False?
Requests 默认从环境读取 HTTP_PROXY、HTTPS_PROXY 和 NO_PROXY,文档警告环境代理可能会覆盖 Session 的 proxies 设置。VPN 或企业设置可能会将某些请求路由到别处。trust_env = False 使代码仅使用你传入的代理。
我可以在 httpx 或 aiohttp 中使用相同的代码吗?
可以,思路相同:用 host、port、username 和 password 构建代理 URL,再加上超时和出口 IP 检查。参数名称因库和版本而异,因此请遵循该库的代理文档。每个静态 IP 保持一个客户端,就像 Requests 中的 Session 一样。
如何将凭据排除在仓库之外?
从环境变量或密钥管理器读取它们,如示例所做,绝不要提交包含真实值的 .env 文件。不要在日志中打印代理 URL,因为它包含密码。使用 IP 允许列表方法时,允许列表机器上的脚本完全不需要代理密码。
在 Python 中一个静态 IP 可以处理多少请求?
代理按 IP 和 30 天计费,而不是按 GB。按 IP 和每 30 天计费,不按 GB 计费;适用合理使用政策。真正的限制是目标站点,它可能对一个 IP 进行限速。每个 IP 保持适度的并发,添加延迟,并遵循每个站点的条款。对于一个任务需要更多流量,将工作分散到多个 IP;见 我需要多少个静态 IP?。
本指南使用了哪些来源? (3)
- Requests 高级用法:proxies、SOCKS、timeouts — Requests (2026-10-19)
- urllib.parse:quote — Python Software Foundation (2026-10-19)
- ipify API — ipify (2026-10-19)