Windows系统Python urllib.urlopen SSL证书验证失败问题求助
解决Windows下Anaconda Python 3.6爬虫SSL证书验证失败问题
嘿,我来帮你搞定这个SSL证书报错的问题~你遇到的URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777),是因为你的Anaconda环境里缺少信任这些HTTPS网站的根证书,而http://fivethirtyeight.com/是HTTP协议,不需要证书验证所以能正常运行。
下面给你几个针对Windows Anaconda环境的解决方法,按推荐程度排序:
方法1:更新Anaconda的证书包(最安全推荐)
Anaconda自带的certifi包管理着信任的根证书,更新它就能解决大部分证书问题:
- 打开Anaconda Prompt(在开始菜单的Anaconda3文件夹里能找到)
- 运行以下命令安装/更新certifi:
conda install -c anaconda certifi - 按提示输入
y确认安装,完成后重启你的Python编辑器/终端,再运行爬虫代码试试。
方法2:手动指定证书路径
如果方法1没生效,可以手动指定Anaconda自带的证书文件路径:
- 找到你的Anaconda安装目录下的
cacert.pem文件,默认路径大概是:
替换C:\Users\[你的用户名]\Anaconda3\Lib\site-packages\certifi\cacert.pem[你的用户名]为你Windows账户的名字。 - 修改你的代码,添加SSL上下文指定证书:
import urllib.request import ssl import urllib3 from bs4 import BeautifulSoup urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 指定证书路径 ssl_context = ssl.create_default_context(cafile=r'C:\Users\[你的用户名]\Anaconda3\Lib\site-packages\certifi\cacert.pem') f = urllib.request.urlopen(url, context=ssl_context) print(f.read(300)) soup = BeautifulSoup(f, 'lxml')
方法3:临时禁用SSL验证(仅测试用,不推荐)
这个方法会跳过证书验证,虽然能解决问题,但会让你的请求处于不安全状态,适合临时测试:
修改代码使用不验证的SSL上下文:
import urllib.request import ssl import urllib3 from bs4 import BeautifulSoup urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 创建不验证SSL的上下文 ssl_context = ssl._create_unverified_context() f = urllib.request.urlopen(url, context=ssl_context) print(f.read(300)) soup = BeautifulSoup(f, 'lxml')
或者改用urllib3的请求方式:
import urllib3 from bs4 import BeautifulSoup urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) # 禁用证书验证 http = urllib3.PoolManager(cert_reqs='CERT_NONE') response = http.request('GET', url) print(response.data[:300]) soup = BeautifulSoup(response.data, 'lxml')
内容的提问来源于stack exchange,提问作者Amie




