在 Python requests 库中,通过向请求方法传递 proxies 参数指定代理地址,可以实现网络出口切换。适用场景包括合规的数据采集、接口测试或网络环境受限时的请求转发。风险边界在于无效代理会导致连接超时,且频繁切换可能触发目标服务器的风控机制。
先说结论:配置 requests 代理需使用 proxies 字典指定协议和地址,重点在于确保代理可用性和协议匹配。
- 适合:需要切换出口 IP 的合规爬虫或 API 调用场景
- 先准备:获取稳定的 http 或 https 代理地址及端口
- 验收:通过外部接口验证当前请求出口 IP 是否变更
命令速用版
直接在请求方法中传入 proxies 字典即可生效,无需额外配置全局环境。
import requests
proxies = {
'http': 'http://127.0.0.1:8080',
'https': 'http://127.0.0.1:8080',
}
response = requests.get('https://httpbin.org/ip', proxies=proxies)
print(response.text)为什么会这样
服务器通常基于 IP 频率和信誉进行访问限制,切换代理可分散请求压力。requests 库底层基于 urllib3,支持通过 proxies 参数将请求转发至指定中间节点。若代理地址不可达或协议不匹配,库会抛出 ConnectionError 或 Timeout 异常。
分步处理
按顺序完成代理获取、代码配置和异常处理,确保请求链路完整。
步骤 1:获取代理地址
从可信渠道获取 http 或 https 格式的代理地址,格式通常为 ip:port 或 user:pass@ip:port。公开资料中没有看到可靠的量化数据表明免费代理的可用性比例,建议优先测试连通性。
步骤 2:配置 proxies 字典
在代码中定义字典,键名为协议类型,键值为代理地址。注意 http 和 https 需分别配置,避免混合协议导致请求失败。
步骤 3:添加超时与异常捕获
设置 timeout 参数防止无限等待,使用 try-except 块捕获 requests.exceptions 相关错误。无效代理会导致程序阻塞,超时设置是必要的止损措施。
try:
response = requests.get(url, proxies=proxies, timeout=5)
response.raise_for_status()
except requests.exceptions.RequestException as e:
print(f"请求失败:{e}")怎么验证是否生效
通过访问返回 IP 信息的公共接口,对比本地 IP 与响应 IP 是否一致。
使用 httpbin.org/ip 或 ipapi.co/json 等接口,打印响应内容中的 IP 字段。若响应 IP 与本地出口 IP 不同,说明代理配置已生效。若请求直接失败或返回本地 IP,则代理未生效或地址无效。
常见坑
代理配置中容易忽略协议前缀、认证信息和会话持久化问题。
- 协议前缀缺失:地址必须包含 http:// 或 https://,仅写 ip:port 会导致解析错误
- 认证信息错误:若代理需要密码,需按 user:password@host:port 格式填写
- Session 复用:使用 requests.Session() 可避免重复配置,但需注意代理是否随会话持久化
- HTTPS 兼容:部分代理仅支持 http 转发,访问 https 目标时需确认代理支持 CONNECT 方法
常见问题
如何设置全局代理?
可以通过环境变量或 requests 会话对象实现全局配置。设置 HTTP_PROXY 和 HTTPS_PROXY 环境变量后,requests 会自动读取,或在 Session 对象中统一赋值 proxies 属性。
代理超时怎么办?
降低 timeout 阈值并增加重试机制。使用 tenacity 或 requests 自带的适配器配置重试策略,避免单个无效代理阻塞整个任务。
免费代理能用吗?
公开资料中没有看到可靠的量化数据支持免费代理的稳定性。免费地址通常延迟高、存活时间短,仅适合测试,生产环境建议使用付费或自建服务。
参考来源
- Requests 官方文档 - Proxies 章节,https://docs.python-requests.org/zh_CN/latest/user/advanced.html#proxies
- urllib3 文档 - Proxy Support,https://urllib3.readthedocs.io/en/stable/reference/urllib3.poolmanager.html