在有代理的服务器上用Python脚本下载文件出错

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值