项目中已有 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 默认设置与单次请求覆盖如何配合;连接复用与路由策略是两项不同的选择。

相关文章