在 Python Requests 中使用代理 IP
在 Requests 中明确指定单次请求的代理路由,选对端点协议,并处理超时和 HTTPS 隧道失败。
项目中已有 Requests 时,可以向调用传入代理映射:
import requests
proxies = {
"http": "http://127.0.0.1:8080",
"https": "http://127.0.0.1:8080",
}
response = requests.get(
"https://example.com/",
proxies=proxies,
timeout=(5, 15),
)
response.raise_for_status()
print(response.status_code)
将回环端点换成正在运行的代理,或从HTTP 代理列表挑选一个用本次请求测试的候选端点。键表示目标 URL 的协议:http 对应 HTTP URL,https 对应 HTTPS URL。值描述代理监听端。如果网络需要分开的路由,可以使用不同的端点。
把 http:// 代理值放在 https 键下是有意的。Requests 会向 HTTP 监听端申请 CONNECT 隧道,再通过它与目标建立 TLS,仍受代理的目标地址和端口策略限制。将值改成 https://,请求的就是到代理本身的 TLS 连接;如果监听端只接受明文 HTTP,就可能失败。
两个超时数值分别表示什么
timeout=(5, 15) 设置连接超时和读取超时,并不是十五秒的总截止时间。定期到来的数据、多个地址及多次连接尝试都可能延长实际耗时。省略这个设置时,Requests 不提供通用超时,因此应按响应情况选择限值;如果任务需要严格的总时间预算,还要在应用层加上截止时间。
在实际发生失败的阶段处理问题
try:
response = requests.get(
"https://example.com/",
proxies=proxies,
timeout=(5, 15),
)
response.raise_for_status()
except requests.exceptions.ProxyError as error:
print("Proxy setup failed:", type(error).__name__)
except requests.exceptions.Timeout:
print("A configured timeout expired")
except requests.exceptions.HTTPError as error:
print("HTTP status:", error.response.status_code)
CONNECT 被拒绝时,可能在尚未收到目标响应前就抛出 ProxyError。HTTPError 分支对应已经收到错误状态响应的情况;Timeout 表示配置的某项时限已到。在本地检查连接建立阶段的异常链,分享前先移除带凭据的端点和私有 URL。
保持证书验证开启。如果获授权的网络使用私有 CA 或受管流量拦截,应提供预期的信任材料,而不是禁用验证。
显式的单次请求配置控制这里提供的路由,但未列出的协议仍可能受环境代理自动发现影响。将调用迁移到可复用的 Session 时,要决定环境变量、Session 默认设置与单次请求覆盖如何配合;连接复用与路由策略是两项不同的选择。