1、假设有个 python 脚本 download_sth.py,在有代理的服务器上用 download_sth.py 脚本下载文件可能得到如下错误提示:
一般在有代理的服务器上下载东西才会得到 ssl 验证错误,解决办法就是修改 python 库源码强制屏蔽 ssl 验证。
2、如例子所示:根据错误信息,可以得出是在/root/anaconda3/envs/speechbrain/lib/python3.8/site-packages/requests/adapters.py 文件下运行 resp = conn.urlopen 这行代码导致出错:
3、打开/root/anaconda3/envs/speechbrain/lib/python3.8/site-packages/requests/adapters.py 文件,定位到 443 行,发现 resp = conn.urlopen 这行代码在 send() 函数下。观察 send() 函数,可得知该函数提供了屏蔽 ssl 验证参数 verify。那么肯定是 download_sth.py 代码中使用这个 send() 函数的时候,把 verify 设置为 True 了,我们在 download_sth.py 代码中可能找不到调用这个 send() 函数的地方,那么我们就强制把库源码 send() 函数的 verify 设置为 False。
4、在 send() 函数下添加几行代码,把 verify 参数强制设置为 False:
5、再次运行,即可下载文件。
6、修改完之后,每次下载会提示一些告警信息,定位到文件,屏蔽之:
打开/root/anaconda3/envs/speechbrain/lib/python3.8/site-packages/urllib3/connectionpool.py,修改如下:
7、此外,有时候下载文件并不一定会提示步骤 1 的错误,从而无法定位到引发错误的文件,如下图所示。但是一般来说下载文件不成功,只要修改上述两个文件后都可以下载。
下载文件时其它可能的错误:
8、如果修改这两个文件还是无法下载,那么智能根据 Traceback 的错误信息,逐个分词出错的文件和行数,看如何屏蔽验证。
其它案例分享 1:
如果使用 SSL 库,在导入 SSL 库的时候,添加一行代码,绕过 SSL 验证:
import ssl
ssl._create_default_https_context = ssl._create_unverified_context
报错信息:
通过分析这些报错文件,最后在/root/anaconda3/envs/pytorch.v1.8.1/lib/python3.7/site-packages/urllib3/util/ssl_.py 文件中导入 ssl 的地方,加上如上代码,可以成功下载。
其它案例分享 2:
如果使用 requests 库,可以添加参数 verify=False
requests.get(url=url,headers=headers,verify=False)