Python脚本用代理时,最常见的问题不是“字典怎么写”,而是把Requests示例直接套到HTTPX、异步客户端或不同版本。两个库的代理参数、环境变量处理和连接池接口会随版本演进,生产代码应以当前安装版本官方文档为准。
下面重点讲不容易过时的配置思路:作用域、凭据、超时、连接复用和验证。
一、先确认使用哪个客户端
| 场景 | Requests | HTTPX |
|---|---|---|
| 同步请求 | Session与请求函数 | Client与请求函数 |
| 异步请求 | 非核心能力 | AsyncClient |
| 环境变量 | 通常读取标准代理变量 | 可按配置控制环境信任 |
| SOCKS支持 | 需要对应可选依赖 | 需要当前版本支持的可选依赖 |
二、不要在源码写完整代理URL
用户名密码写进Python文件,会进入Git历史、镜像、日志和异常回溯。使用环境变量、密钥管理或运行平台Secrets,并只在创建客户端时读取。
日志中记录节点版本ID,不输出URL的userinfo部分。
三、Requests会话为什么重要
requests.Session 可以复用连接、统一头部和代理配置。频繁调用顶层函数会失去部分连接复用优势。结构示意:
import requests
session = requests.Session()
session.proxies.update({
"http": proxy_url,
"https": proxy_url,
})
response = session.get(health_url, timeout=(5, 20))
response.raise_for_status()示例中的超时和URL必须按业务设置。注意“https目标”不代表代理URL一定使用https方案,取决于代理服务和客户端支持。
四、HTTPX同步与异步不要混用
HTTPX提供同步Client和异步AsyncClient。异步代码应在生命周期内复用AsyncClient,并正确关闭,避免每次请求新建连接池。代理参数名称和挂载方式要查看当前版本文档,不用旧博客的过期接口。
五、环境变量什么时候会覆盖代码
HTTP_PROXY、HTTPS_PROXY、ALL_PROXY 和 NO_PROXY 可能影响库行为。HTTPX有控制是否信任环境的选项;Requests也有Session环境处理。测试时明确:
- 是否允许读取宿主环境;
- 代码显式代理和环境变量谁优先;
- NO_PROXY是否命中目标;
- 大小写变量是否冲突;
- 容器或CI是否注入了额外变量。
六、SOCKS依赖和DNS解析
使用SOCKS通常需要安装库的可选依赖。不同URL方案可能表示本地解析或把主机名交给代理解析,具体行为以对应实现为准。
DNS路径会影响内部域名、IPv6和信息暴露。不要只验证公网IP。
七、超时要分阶段设置
连接超时和读取超时含义不同。连接阶段包括到代理和可能的上游隧道,读取超时则是连接建立后等待数据。HTTPX还可能提供更细的写入、连接池等超时。
通用阶段说明见代理连接、读取与TLS超时区别。
八、遇到502或504能否重试
读取请求可对部分短暂网络错误做有限退避;写请求必须先解决幂等和状态查询。不要在库级别把所有异常统一自动重试。
安全恢复方法见代理请求重试、幂等键与对账。
九、TLS证书错误不能verify=False
代理环境出现证书不受信时,先检查系统时间、域名、SNI、证书链和企业TLS策略。测试代码也不应形成可复制到生产的 verify=False 模式。
完整排查见HTTPS代理TLS证书错误指南。
十、切换代理为什么要新建客户端
连接池可能继续复用旧代理连接。切换节点、凭据或路由时,停止分配新请求到旧客户端,等待在途请求完成,再关闭旧会话并创建新客户端。
不要在共享客户端被多线程使用时直接修改代理字典。
十一、最小验证代码应该测什么
- 访问自有HTTPS健康端点;
- 确认状态码和TLS验证;
- 低频核对出口IP;
- 测试NO_PROXY内部地址;
- 模拟连接超时、407和502;
- 关闭客户端,确认资源释放。
十二、常见问题
| 现象 | 原因方向 |
|---|---|
| 浏览器正常,Python超时 | Python不读取浏览器代理 |
| SOCKS方案报缺模块 | 可选依赖未安装 |
| 内部API走代理 | NO_PROXY或环境信任配置 |
| 切节点后出口没变 | 连接池复用旧连接 |
| 异步连接泄漏 | AsyncClient未正确关闭 |
生产代理配置应封装成明确的客户端工厂和生命周期,而不是在每个请求旁边拼接一串带密码的URL。






