Python Requests和HTTPX怎么配代理?会话、超时与环境变量

别把Requests示例直接套给HTTPX,先控制环境变量、客户端生命周期和连接池
发布于
3

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_PROXYHTTPS_PROXYALL_PROXYNO_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证书错误指南

十、切换代理为什么要新建客户端

连接池可能继续复用旧代理连接。切换节点、凭据或路由时,停止分配新请求到旧客户端,等待在途请求完成,再关闭旧会话并创建新客户端。

不要在共享客户端被多线程使用时直接修改代理字典。

十一、最小验证代码应该测什么

  1. 访问自有HTTPS健康端点;
  2. 确认状态码和TLS验证;
  3. 低频核对出口IP;
  4. 测试NO_PROXY内部地址;
  5. 模拟连接超时、407和502;
  6. 关闭客户端,确认资源释放。

十二、常见问题

现象 原因方向
浏览器正常,Python超时 Python不读取浏览器代理
SOCKS方案报缺模块 可选依赖未安装
内部API走代理 NO_PROXY或环境信任配置
切节点后出口没变 连接池复用旧连接
异步连接泄漏 AsyncClient未正确关闭

生产代理配置应封装成明确的客户端工厂和生命周期,而不是在每个请求旁边拼接一串带密码的URL。

常见问题(FAQ)

Requests和HTTPX的代理参数可以直接通用吗?
不能假定通用。两者API和版本演进不同,应按当前安装版本官方文档配置。
Python代理URL可以写在源码里吗?
不应。使用环境变量或密钥系统,并避免日志、异常和Git历史暴露用户名密码。
切换代理后为什么出口没变?
Session或Client连接池可能继续复用旧连接,应排空在途请求并创建新客户端。
代理证书错误可以设置verify=False吗?
不应。应检查时间、域名、SNI、证书链、信任库和企业TLS检查,保留严格验证。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600

做合规数据采集,爬虫挂上住宅代理IP是基本操作。这篇用 Python 的 requests 和 httpx 两个库,把鲸云IP的独享住宅代理接进去,代码直接能跑。 先拿到代理地址 鲸云IP家庭区、定制区都支持 http 和 socks 导出