爬取维基百科调用pd.read_html报SSL证书过期错误如何修复
报错原因
抛出URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:1129)>异常的核心原因是HTTPS请求阶段的SSL证书校验未通过,常见触发场景包括:
- 本地Python环境内置的根证书库版本过旧,未收录维基百科当前使用的SSL证书对应的信任链,校验时误判定证书已过期
- 所处网络环境(公司内网、校园网、开启了HTTPS抓包的本地网络)存在流量代理,替换了维基百科站点的原始SSL证书,导致本地校验逻辑判定证书不可信
- pandas的
read_html方法默认调用urllib发起网络请求,默认强制开启SSL证书强校验,只要校验不通过就会直接抛出异常终止请求,不会继续拉取页面内容。
修复方案
按推荐优先级从高到低排列:
- 方案1:更新本地根证书库(最安全,无副作用,优先选择)
不同系统操作如下:- Mac系统:找到本地对应Python版本的安装目录,双击运行
Install Certificates.command脚本即可自动更新证书,脚本路径格式一般为/Applications/Python 3.x/Install Certificates.command,把3.x替换为你本地实际安装的Python版本号即可 - Windows/Linux系统:直接在终端执行以下命令升级证书依赖包:
pip install --upgrade certifi
- Mac系统:找到本地对应Python版本的安装目录,双击运行
- 方案2:临时关闭SSL证书校验(仅适合临时测试使用,存在流量被篡改、窃听的安全风险,不建议长期使用)
修改原有代码,在发起请求前全局关闭urllib的证书校验逻辑即可,修改后完整代码如下:import pandas as pd import ssl # 临时关闭SSL证书校验 ssl._create_default_https_context = ssl._create_unverified_context base_site = "https://en.wikipedia.org/wiki/List_of_national_capitals_by_population" tables = pd.read_html(base_site) # 提取到的tables[0]就是目标页面中按人口排序的各国首都表格 - 方案3:如果是网络代理导致的证书校验失败,不需要关闭校验,只需要把你当前网络代理的根证书导入到Python环境的certifi信任证书库中,即可正常通过校验。
内容的提问来源于stack exchange,提问作者Immanuel Peter
相关产品推荐
相关产品推荐

