用 Python 发起代理请求,最常用的方式是 requests 库的 proxies 参数:传入一个同时包含 http 与 https 键的字典,请求就会经由指定代理转发。requests 默认还会读取系统环境变量,也支持在代理 URL 中直接携带账号密码。本文从安装讲到 Session 复用、超时元组与异常分支处理,帮助你写出可运维的采集与接口调用代码。
环境准备与依赖安装
执行 pip install requests 即可完成安装,官方源与国内镜像源均可。若代理节点是 SOCKS5 协议,需要额外执行 pip install "requests[socks]",它会自动带上 PySocks 依赖;漏装的话请求时会抛出 Missing dependencies for SOCKS support 异常。建议使用 Python 3.8 以上版本,旧版本的 TLS 实现可能与部分服务端不兼容。
- 基础安装:pip install requests,满足 HTTP 与 HTTPS 代理需求。
- SOCKS5 支持:pip install "requests[socks]",额外引入 PySocks 依赖。
- 解释器版本:Python 3.8+,避免旧 TLS 栈带来的握手失败。
proxies 参数与 Session 的使用
proxies 字典的键是协议名(http 与 https),值是代理 URL,两个键都要填写,否则未覆盖的那类流量会直连目标。认证信息可以直接写进 URL,格式为 http://user:pass@host:port。requests 默认信任环境变量,HTTP_PROXY 与 HTTPS_PROXY 会被自动读取,若担心测试机的环境变量污染请求,可将 Session 的 trust_env 属性设为 False。复用 Session 不仅能减少握手开销,还能自动保持 cookie,模拟登录场景尤其有用。
完整代码示例
下面的例子把代理配置到 Session 上,并针对各类异常做了分支处理:
import requests
proxies = {
'http': 'http://user:[email protected]:8080',
'https': 'http://user:[email protected]:8080',
}
session = requests.Session()
session.proxies.update(proxies)
session.headers.update({'User-Agent': 'Mozilla/5.0'})
try:
resp = session.get('https://httpbin.org/ip', timeout=(5, 15))
resp.raise_for_status()
print(resp.json())
except requests.exceptions.ProxyError:
print('代理连接失败,请检查地址、端口与白名单')
except requests.exceptions.ConnectTimeout:
print('连接代理超时')
except requests.exceptions.ReadTimeout:
print('代理已连通,但读取响应超时')
except requests.exceptions.HTTPError as exc:
print('HTTP 错误:', exc)
timeout=(5, 15) 分别限制连接代理与读取响应的上限,建议始终显式传递——requests 默认不设超时,网络异常时程序会永久挂起。raise_for_status 会把 4xx、5xx 响应转成异常,配合统一的 except 分支可以让错误处理更清晰。
HTTPS 与 SOCKS5 代理的支持
对 https 目标,requests 自动经代理建立 CONNECT 隧道,证书校验默认开启;verify=False 仅适合临时调试抓包,长期关闭等于把明文流量交给中间人。SOCKS5 代理把 scheme 写成 socks5://,此时域名在本地解析;写成 socks5h:// 则由代理端解析域名,更适合本地 DNS 不可信或希望隐藏解析记录的环境。
常见报错与注意事项
- ProxyError:代理拒绝连接或不可达,先独立验证代理本身可用。
- ConnectTimeout 与 ReadTimeout:分别对应超时元组的两个阶段,按需调大或更换节点。
- SSLError:证书链问题,将自签 CA 文件路径传给 verify 参数。
- 407:认证失败或未绑定出口 IP,到代理控制台核对白名单设置。
Article ID: 31
(本文仅供技术交流,请遵守法律法规)