Python调用MLB Stats API遇SSL证书验证失败问题求助
问题描述
运行以下MLB statsapi代码时触发SSLCertVerificationError,错误提示certificate verify failed: unable to get local issuer certificate,同时Conda更新等网络操作也出现同类SSL证书验证失败问题:
import pandas as pd from pandas import DataFrame import statsapi box_score = statsapi.boxscore(565997) print(box_score)
已尝试升级certifi库,了解到可通过ssl_verify指定证书文件但无法找到对应文件,不想使用verify=False的不安全临时方案,寻求安全有效的解决办法。
安全解决方法
1. 更新系统根证书
这类问题大多因系统根证书库未包含目标网站的签发机构证书,优先更新系统根证书:
- Windows:打开「设置」→「更新和安全」→「Windows更新」,检查并安装所有更新(包括可选的根证书更新);或手动安装微软官方提供的根证书更新包
- macOS:打开「系统设置」→「通用」→「关于本机」→「软件更新」,安装系统更新;或在「钥匙串访问」中选择「系统根证书」,右键点击缺失/过期证书选择「更新证书」
- Linux(Debian/Ubuntu):执行以下命令更新证书库:
sudo apt update && sudo apt install --reinstall ca-certificates sudo update-ca-certificates - Linux(RHEL/CentOS):执行以下命令:
sudo yum update ca-certificates sudo update-ca-trust extract
2. 让Python/Conda使用系统根证书
Python配置
Python默认使用certifi库自带的证书,可强制其使用系统根证书:
- 设置环境变量(永久生效可添加到系统配置文件):
# Linux/macOS终端 export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt export REQUESTS_CA_BUNDLE=/etc/ssl/certs/ca-certificates.crt # Windows命令提示符 set SSL_CERT_FILE=C:\Windows\System32\certificates\root\ca-bundle.pem set REQUESTS_CA_BUNDLE=C:\Windows\System32\certificates\root\ca-bundle.pem # Windows PowerShell $env:SSL_CERT_FILE = "C:\Windows\System32\certificates\root\ca-bundle.pem" $env:REQUESTS_CA_BUNDLE = "C:\Windows\System32\certificates\root\ca-bundle.pem" - 或在代码中挂载自定义SSL上下文(以Linux为例):
import ssl import statsapi import requests # 替换为对应系统的根证书路径 ssl_context = ssl.create_default_context(cafile='/etc/ssl/certs/ca-certificates.crt') # 为statsapi的请求会话挂载SSL上下文 statsapi.session.mount('https://', requests.adapters.HTTPAdapter(ssl_context=ssl_context)) box_score = statsapi.boxscore(565997) print(box_score)
Conda配置
修改Conda配置,让其使用系统根证书:
- 编辑
.condarc文件(Linux/macOS路径为~/.condarc,Windows路径为C:\Users\<你的用户名>\.condarc),添加或修改:ssl_verify: true # 也可直接指定系统证书路径,例如: # ssl_verify: /etc/ssl/certs/ca-certificates.crt # Linux # ssl_verify: C:\Windows\System32\certificates\root\ca-bundle.pem # Windows - 或通过命令行设置:
conda config --set ssl_verify true # 若需指定路径: # conda config --set ssl_verify /etc/ssl/certs/ca-certificates.crt
3. 手动导出目标网站证书并指定
若系统更新后仍未解决,可手动导出MLB statsapi目标网站的证书:
- 打开浏览器访问
https://statsapi.mlb.com,点击地址栏的锁形图标,选择「证书」 - 切换到「详细信息」标签页,点击「复制到文件」,选择Base64编码的X.509格式,保存为
mlb_cert.pem - 在Python代码中指定该证书:
import ssl import statsapi import requests ssl_context = ssl.create_default_context(cafile='./mlb_cert.pem') statsapi.session.mount('https://statsapi.mlb.com', requests.adapters.HTTPAdapter(ssl_context=ssl_context)) box_score = statsapi.boxscore(565997) print(box_score)
- 对于Conda,可将证书路径配置到
ssl_verify:
conda config --set ssl_verify ./mlb_cert.pem
内容的提问来源于stack exchange,提问作者Mmcmanu
相关产品推荐
相关产品推荐

