如何解决PyCharm调用外部API时出现的「NewConnectionError: Failed to establish new connection [Errno 11001]」错误
嘿,我完全懂你这种被公司代理折腾到崩溃的感觉——毕竟我之前也跟这种问题死磕过好几天!让我们一步步拆解你的问题,找出解决办法:
问题复盘
你目前的困境是:
- 直接在
requests.get()里传代理参数,抛出NewConnectionError: Failed to establish new connection [Errno 11001],说明请求要么没正确走代理,要么代理地址解析失败 - 改设环境变量后出现407代理错误,证明请求走了代理,但缺少认证信息
- 但curl能正常执行,说明代理本身是可用的,问题出在Python请求的代理配置细节上
针对性解决方案
1. 先修正代理字典的基础错误
你写的proxies字典有两个小问题:
- 键名应该是小写的
http/https(requests的规范) - 代理地址里的空格要删掉!
"http:// <proxy_ip>:proxy_port"里<proxy_ip>前面的空格会直接导致解析失败
修正后的代码:
import requests headers = { 'Authorization': 'bearer <token>', 'Accept' : 'application/scim+json' } # 注意键名小写,地址无多余空格,端口号替换成实际数字 proxy = { "http": "http://<proxy_ip>:<proxy_port>", "https": "http://<proxy_ip>:<proxy_port>" } r = requests.get("<URL>", headers=headers, proxies=proxy)
很多公司的HTTP和HTTPS代理是同一个地址,所以两个都写上更稳妥。
2. 解决407代理认证问题
如果公司代理需要用户名密码认证,不管用哪种方式配置代理,都必须带上认证信息:
- 用
proxies参数的格式:
proxy = { "https": "http://<你的域账号>:<密码>@<proxy_ip>:<proxy_port>" }
- 用环境变量的话,要设置大写的
HTTP_PROXY和HTTPS_PROXY(你之前设的https是错的):
import os os.environ['HTTP_PROXY'] = 'http://<你的域账号>:<密码>@<proxy_ip>:<proxy_port>' os.environ['HTTPS_PROXY'] = 'http://<你的域账号>:<密码>@<proxy_ip>:<proxy_port>' # 之后再发送请求 r = requests.get("<URL>", headers=headers)
3. 匹配curl的自动代理行为
既然curl能正常跑,大概率是它自动读取了系统代理(比如Windows的IE代理设置),而requests默认不会这么做。如果你的公司用的是域账号自动认证代理,可以安装requests-negotiate-sspi(Windows专属),让requests自动对接系统代理和认证:
import requests from requests_negotiate_sspi import HttpNegotiateAuth session = requests.Session() session.trust_env = True # 开启读取系统代理 session.auth = HttpNegotiateAuth() # 自动用当前Windows域账号做代理认证 r = session.get("<URL>", headers=headers)
这个方法不用手动输密码,非常适合企业域环境。
4. 最后排查细节
- 确认
<proxy_ip>是正确的IP或主机名,没有拼写错误 - 端口号要写纯数字,不要加引号
- 如果代理是SOCKS类型,要改成
socks5://开头,但你curl能用,应该还是HTTP代理
验证小技巧
改完配置后,可以打印请求的详细信息,确认代理是否生效:
print("请求URL:", r.request.url) print("请求头:", r.request.headers)
内容的提问来源于stack exchange,提问作者Abed Ahmed
相关产品推荐
相关产品推荐

