Python 遭遇 ProxyError 问题记录 (3)

继续看代码:

elif os.name == 'nt': def getproxies(): """Return a dictionary of scheme -> proxy server URL mappings. Returns settings gathered from the environment, if specified, or the registry. """ return getproxies_environment() or getproxies_registry()

在 Windows 系统中,先从环境变量获取,如果没有则从注册表获取。

getproxies_environment 的逻辑比较简单,基本和 Linux 系统是一致的,就是环境变量配置成啥样就是啥样。这里我并没有配置环境变量,自然结果是空,最终的结果要看 getproxies_registry。按照其中的代码,从注册表中获取的配置如下:

image-20210207124727405

代码里有两个处理逻辑:

proxyServer = str(winreg.QueryValueEx(internetSettings, 'ProxyServer')[0]) if '=' in proxyServer: # Per-protocol settings for p in proxyServer.split(';'): protocol, address = p.split('=', 1) # See if address has a type:// prefix if not re.match('(?:[^/:]+)://', address): address = '%s://%s' % (protocol, address) proxies[protocol] = address else: # Use one setting for all protocols if proxyServer[:5] == 'http:': proxies['http'] = proxyServer else: proxies['http'] = 'http://%s' % proxyServer proxies['https'] = 'https://%s' % proxyServer proxies['ftp'] = 'ftp://%s' % proxyServer

其中第一种是「每种协议各自配置」,下面第二种情况是「所有协议一个配置」。

在第二种情况中,如果带了 http: 就只配置 http 协议,否则(也就是我们现在的场景),针对同一个 proxyServer,添加 3 种协议。

在 Windows 中如何配置代理

第一种方法:通过环境变量设置

image-20210207130112079

结果:

>>> getproxies() {'https': 'http://127.0.0.1:7890', 'http': 'http://127.0.0.1:7890'}

一旦设置了环境变量,程序就直接从环境变量获取,系统的配置也就失效了。

第二种方法:按照上面的代码倒推出来系统配置

image-20210207131015338

其中的地址框里的内容是:

http=http://127.0.0.1:1080;https=http://127.0.0.1

其中最后的端口只对最后面的那个地址有效,分号前面的地址需要加上端口。

对应的注册表中的值是:

image-20210207131206485

显然这种方式有点诡异和麻烦,目前也没看到有相关的说明,不确定是否会影响其它程序的判断。

如此看来,还是第一种方法比较靠谱,就是不能利用系统配置有点遗憾。

我的疑惑

那么,在用户只给出了代理服务器的 IP 和 端口的情况下,原有的处理逻辑是不是错误,我也不敢断言。

回到最初犯错的地方:

HTTP_PROXY=http://proxy_ip:proxy_port HTTPS_PROXY=https://proxy_ip:proxy_port

我现在还有一个疑惑点是,真的会存在一个代理服务器,能够在同一个端口同时支持 http 和 https 么?如果是那样的话,为啥平常的 web 服务器还要有 80 和 443 两个端口对应不同的服务。

反过来,如果一个端口不可以同时支持两个协议的话,那么上面的配置的错误则更加明显,处理逻辑也就很有问题。

你对此有什么看法和理解,欢迎在评论区讨论!

总结

通过解决代理服务器错误,对 Python 是如何处理代理服务器配置有了更深入的了解。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwdzxx.html