Python 遭遇 ProxyError 问题记录

news/2024/9/19 14:19:57/文章来源:https://www.cnblogs.com/rolandhe/p/18416438

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

最近遇到的一个问题,在搞清楚之后才发现这么多年的 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.hqwc.cn/news/798133.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

白云龙期货投资-第二讲

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…

urllib自定义opener对象设置代理IP

urllib.request.urlopen()源代码——urlopen()在干什么返回opener.open(url, data, timeout)方法的结果_opener = None # _opener被赋值为None def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,*, cafile=None, capath=None, cadefault=False, context=N…

成功塑造孩子的人生,这一步很关键!

塑造孩子行为极为重要 思维决定行为,行为决定习惯,这一理念在家庭教育中尤为重要。明智的家长如同经验丰富的指导者,细心关注并引领孩子塑造正确的行为。他们深知每个孩子都是独一无二的,拥有独特的性格与潜力,不可简单复制或预设。当孩子遭遇困难时,应及时给予支持引导其…

CSP 初赛要点复习

位运算 逻辑与、按位与之类的东西是不同的!“逻辑”的是判断两个数都不为 \(0\),“按位”的是判断两个数的每一个二进制位与的结果,是不同的。其他运算也类似。 运算符优先级如图所示:注意,~ 和 ! 是同级的。 加法位运算表示:a+b=(a^b)+((a&b)<<1)。

7、队列

1、链队#include<stdio.h> #include<malloc.h> #include<assert.h>#define ElemType inttypedef struct QueueNode{ElemType data;struct QueueNode* next; }QueueNode; typedef struct LinkQueue{QueueNode* front;//队头QueueNode* tail;//队尾 }LinkQueu…

内存对齐和缓冲区溢出攻击

.一、问候语 欢迎你来到我的博客! 二、什么是内存对齐计算机中内存空间都是按照字节(byte)进行划分的,所以从理论上讲对于任何类型的变量访问都可以从任意地址开始,但是在实际情况中,在访问特定类型变量的时候经常在特定的内存地址访问,所以这就需要把各种类型数据按照一定…