Python 遭遇 ProxyError 问题记录

news/2024/9/20 12:38:34

本内容复制知乎的一个贴子,在此只做下记录及参考和学习,原链接地址:

最近遇到的一个问题,在搞清楚之后才发现这么多年的 HTTPS_PROXY 都配置错了!

起因
想用 Python 在网上下载一些图片素材,结果 requests 报 requests.exceptions.ProxyError,具体的错误信息见下面。当然第一时间是把系统代理关了,结果访问就正常了。

如果只是这样,可能我就觉得是代理有问题,然后关了用就行了,但是偏偏想要下载的资源里是必须要走代理的,所以只能想办法解决。

下面先介绍一下具体的情况:

解决过程
操作系统:Windows 10

Python: 3.8(有虚拟环境)

requests 通过代理访问外网时报错如下:

Traceback (most recent call last):File "E:\code\Python\.venv\smalltools\lib\site-packages\urllib3\connectionpool.py", line 696, in urlopenself._prepare_proxy(conn)File "E:\code\Python\.venv\smalltools\lib\site-packages\urllib3\connectionpool.py", line 964, in _prepare_proxyconn.connect()File "E:\code\Python\.venv\smalltools\lib\site-packages\urllib3\connection.py", line 359, in connectconn = self._connect_tls_proxy(hostname, conn)File "E:\code\Python\.venv\smalltools\lib\site-packages\urllib3\connection.py", line 496, in _connect_tls_proxyreturn ssl_wrap_socket(File "E:\code\Python\.venv\smalltools\lib\site-packages\urllib3\util\ssl_.py", line 432, in ssl_wrap_socketssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls)File "E:\code\Python\.venv\smalltools\lib\site-packages\urllib3\util\ssl_.py", line 474, in _ssl_wrap_socket_implreturn ssl_context.wrap_socket(sock)File "C:\Users\Davy\AppData\Local\Programs\Python\Python38\lib\ssl.py", line 500, in wrap_socketreturn self.sslsocket_class._create(File "C:\Users\Davy\AppData\Local\Programs\Python\Python38\lib\ssl.py", line 1041, in _createself.do_handshake()File "C:\Users\Davy\AppData\Local\Programs\Python\Python38\lib\ssl.py", line 1310, in do_handshakeself._sslobj.do_handshake()
OSError: [Errno 0] Error

因为浏览器访问是没有问题的,代理本身应该没有问题。
按照这个错误信息在网上搜了一下,比较接近的帖子给的解决方案有安装 ssl 模块之类,都照着检查了一遍,问题还是没有解决。

因为网上的内容有些年头了,并且我觉得使用代理是非常常见的场景,既然没多少人报这个问题,那么很可能只是偶然的 bug,于是想着把版本再升级试试。

升级到 python 3.9 ,错误仍然存在,提示略有变化:

Traceback (most recent call last):File "C:\Users\Davy\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 696, in urlopenself._prepare_proxy(conn)File "C:\Users\Davy\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connectionpool.py", line 964, in _prepare_proxyconn.connect()File "C:\Users\Davy\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connection.py", line 359, in connectconn = self._connect_tls_proxy(hostname, conn)File "C:\Users\Davy\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\connection.py", line 496, in _connect_tls_proxyreturn ssl_wrap_socket(File "C:\Users\Davy\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\util\ssl_.py", line 432, in ssl_wrap_socketssl_sock = _ssl_wrap_socket_impl(sock, context, tls_in_tls)File "C:\Users\Davy\AppData\Local\Programs\Python\Python39\lib\site-packages\urllib3\util\ssl_.py", line 474, in _ssl_wrap_socket_implreturn ssl_context.wrap_socket(sock)File "C:\Users\Davy\AppData\Local\Programs\Python\Python39\lib\ssl.py", line 500, in wrap_socketreturn self.sslsocket_class._create(File "C:\Users\Davy\AppData\Local\Programs\Python\Python39\lib\ssl.py", line 1040, in _createself.do_handshake()File "C:\Users\Davy\AppData\Local\Programs\Python\Python39\lib\ssl.py", line 1309, in do_handshakeself._sslobj.do_handshake()
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:1122)

好歹错误信息有点变化,于是按照最下面 ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:1122) 去谷歌,并没有找到解决办法,但是发现有人在不久前遇到了相同的问题,并且通过降级 Python 3.7 解决了。

参见:
先重新安装 Python 3.7 试了一下果然可行,并且意外地发现在 Python 3.8 环境下也是可行的,也就是可以排除 Python 版本的问题,那么自然就怀疑是某个包引发的。

通过简单地对比和排除,很快就发现了问题所在:

模块 urllib3 的版本,报错的是 1.26.3,没报错的是 1.25.11

在原报错环境中使用下面命令重装低版本 urllib3:

pip install urllib3==1.25.11
然后测试果然就没问题了。

问题根源
先查了一下 urllib3 的更新日志,应该是 1.26.0 的修改导致的:

按照这个更新日志,明明应该是增加了 HTTPS 的支持,怎么反而让它失效了呢?

我一时搞不明白这个问题,但是想起了我最近遭遇到了另一个问题,然后意外地找到了真相:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/61038.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

白云龙期货投资-第二讲

K线图基本用途就是为了寻找“买卖点”,所有的进场点有K线配合能大大的提高进场的成功率。关键点位出现K线及组合配合。大胆进场(波浪理论第五浪。回调黄金分割率点,趋势线,颈线,整数关口等)。K线技术-一切技术之根本 K线图基本用途就是为了寻找“买卖点”,所有的进场点有K…

博客园主题皮肤

背景图:目前使用的是Awescnb主题的geek 参照:https://blog.csdn.net/zk_tww/article/details/141030258

用户验收测试指南0简介

0 简介 这是一本关于多种形式的用户验收测试(UAT)及其用途的。它汇集了有关测试、项目管理、质量管理、团队行为和完整的用户验收测试经验的其他相关材料,并将它们编织成一条牢固可靠的生命线,供用户验收测试新手指南或利益相关者参考。 本书是为满足三类不同人群的需求而编…

以太网PHY芯片详解

以太网PHY芯片详解 什么是phy phy的基本作用 收到MAC过来的数据(PHY没有帧的概念,都是数据而不管什么地址数据还是CRC),进行处理,然后把并行数据转化为串行流数据,再按照物理层的编码规则把数据编码,再变为模拟信号把数据送出去。 实现CSMA/CD(多点接入载波监听/冲突检…

pwnos1

文件泄露 80端口下存在文件读取 尝试读取用户列表 http://192.168.1.110/index1.php?help=true&connect=../../../../../../../etc/passwdroot:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh…

pwnos2

这台靶机要自行配置攻击机在10.10.10.0/24网段下 sql注入 80端口login处发现可以注入的地方,sqlmap能梭出来很多东西,但是好像都登录不了,--os-shell也是没回显的 sqlmap -u http://10.10.10.100/login.php --data="email=1&pass=1&submit=Login&submitted…

Java中的泛型

泛型的使用泛型是一种类型参数。将数据的类型,当做一个参数。1. 泛型的作用在创建集合对象的时候,限定集合存储元素的类型; 在编译的时候,就进行类型检查;2. 泛型的使用规则如果不指定泛型,默认是Object类型 泛型擦除:泛型应用于代码编译期,程序运行的后,泛型就被擦除…