使用 urllib3 连接代理 IP
HTTP 代理选择 ProxyManager,检查 urllib3 的响应字段,并注意重试与 SOCKS 的独立管理器。
做一个简短的 urllib3 代理诊断时,使用 ProxyManager 并关闭重试。这样会报告第一次尝试,而不是花更多时间反复请求已经失效的条目。在 uv 管理的项目中:
uv add urllib3将文档示例端点替换为你的服务提供的 HTTP 代理,或 HTTP 代理列表中的条目,再通过该管理器发起请求:
import urllib3
proxy = urllib3.ProxyManager(
"http://203.0.113.10:8080",
timeout=urllib3.Timeout(connect=5, read=10),
retries=False,
)
try:
response = proxy.request("GET", "https://example.com/")
print(response.status)
print(response.data.decode("utf-8", errors="replace")[:200])
finally:
proxy.clear()
先读取 response.status,再检查 response.data。这是 urllib3 的字段;Requests 风格的 status_code 和 text 不能代替它们。网站的拒绝响应也可能通过正常工作的代理返回。反之,响应前发生异常,表示请求未能完成。
retries=False 是诊断选择,不是生产环境的重试策略。5 秒连接和 10 秒读取设置分别约束各自阶段,并不构成保证的 15 秒总耗时上限。DNS 和响应进度都可能影响整体等待时间。
示例会预先加载响应体,并在最后清理管理器的连接池。如果需要经由同一端点反复请求,应保留该管理器直到任务结束,以便复用连接。切换为 preload_content=False 会改变这一生命周期:调用方必须读取并释放流式响应。
选择与监听端匹配的管理器。普通 PoolManager 不会因为其他地方存了一个 URL 就自动使用代理;SOCKS 使用 urllib3.contrib.socks.SOCKSProxyManager 及其可选依赖。上面的代码走的是 HTTP ProxyManager 路径。