Requests 通过一个普通字典读取代理,任何请求方法都能接收。一个字典覆盖全部协议:
import requests
proxies = {
"http": "http://USER:PASS@GATEWAY:PORT",
"https": "http://USER:PASS@GATEWAY:PORT",
}
r = requests.get("https://api.ipify.org", proxies=proxies, timeout=15)
print(r.text) # 输出代理出口 IP
"https" 这个 key 不代表要用 HTTPS 代理——它的含义是「访问 https:// 目标时用这个代理」。普通 http:// 代理同样能处理 HTTPS 目标(走 CONNECT 隧道),与 cURL 行为一致。SOCKS5
SOCKS5 需要安装 socks 扩展(引入 PySocks):
pip install "requests[socks]"
proxies = {
"http": "socks5h://USER:PASS@GATEWAY:PORT",
"https": "socks5h://USER:PASS@GATEWAY:PORT",
}
和 cURL 一样优先 socks5h://——DNS 在代理侧解析,没有 DNS 泄露。
Session:复用连接与凭据
超过一次调用就该用 Session:它复用 TCP 连接池(走远程网关时提速明显),且代理只需设一次:
import requests
s = requests.Session()
s.proxies = {"http": "http://USER:PASS@GATEWAY:PORT",
"https": "http://USER:PASS@GATEWAY:PORT"}
s.headers.update({"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"})
r = s.get("https://target-site.com", timeout=(5, 20)) # (连接, 读取)
能在生产环境存活的超时与重试
代理会带来额外延迟和偶发卡死。连接与读取超时都要设,幂等 GET 一定要配重试:
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
retry = Retry(total=3, backoff_factor=1.5,
status_forcelist=[429, 500, 502, 503, 504],
allowed_methods=["GET", "HEAD"])
s.mount("https://", HTTPAdapter(max_retries=retry, pool_maxsize=20))
轮换模式
用轮换网关时,轮换发生在服务端——每个请求(或每个会话标记)拿到新出口 IP:
# 每请求换 IP(网关侧轮换)
for page in pages:
s.get(page, proxies=proxies, timeout=15)
# 粘性会话:一波请求固定同 IP,之后再换
sticky = proxies.copy()
sticky["http"] = sticky["http"].replace("USER", "USER-session-7f3a")
sticky["https"] = sticky["https"].replace("USER", "USER-session-7f3a")
在自建轮换层之前,先实测网关本身的轮换质量:从同一入口连发 50 个请求、数一下去重出口 IP 数——健康的池子长什么样,可以看 IPLight 公开的实时池深报告。
排错清单
ProxyError / 407——凭据错误;特殊字符要 URL 编码(@写成%40)- 仅走代理时
SSLError——不要关证书校验;改用 socks5h:// 或支持 TLS 的代理入口 ConnectTimeout——连接超时对跨区网关太小;用timeout=(5, 20)- 运行中 IP 突然掉线——住宅池的正常现象;重试适配器应能兜住
- 目标侧识别为机房 ASN——说明打到了机房池,换住宅池
常见问题
proxies 里 https 这个 key 需要 HTTPS 代理吗?
不需要。key 指的是目标协议而非代理协议,普通 http:// 代理通过 CONNECT 隧道就能处理 https:// 目标。
Requests 怎么用 SOCKS5?
先 pip install requests[socks],然后在 proxies 字典里用 socks5h://。socks5h 让 DNS 在代理侧解析,避免 DNS 泄露。
Requests 和 httpx 哪个更适合代理场景?
两者支持相同的 proxies 字典格式。httpx 额外支持 HTTP/2;Requests 生态更全。本文的代理概念对两者通用。
怎么验证代理真的在轮换?
从同一网关入口连发 50 个请求,统计去重后的出口 IP 数。IPLight 在实时池深报告里公开了实测池深。
IPLight 动态住宅池:21.5 万+ 在线 IP、170+ 国家,$1.20/GB 起——查看价格,或在实时池深报告验证池子。