File "C:\Users\王慧慧\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\yfinance\utils.py", line 92, in wrapper result = func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\王慧慧\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\yfinance\data.py", line 239, in _get_cookie_and_crumb_basic if not self._get_cookie_basic(timeout): ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\王慧慧\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\yfinance\utils.py", line 92, in wrapper result = func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\王慧慧\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\yfinance\data.py", line 196, in _get_cookie_basic self._session.get( File "C:\Users\王慧慧\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\curl_cffi\requests\session.py", line 652, in get return self.request(method="GET", url=url, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\王慧慧\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\curl_cffi\requests\session.py", line 638, in request raise error(str(e), e.code, rsp) from e curl_cffi.requests.exceptions.SSLError: Failed to perform, curl: (77) error setting certificate verify locations: CAfile: C:\Users\王慧慧\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\certifi\cacert.pem CApath: none. See https://curl.se/libcurl/c/libcurl-errors.html first for more details.
时间: 2025-06-19 12:14:32 浏览: 17
<think>我们遇到了一个SSL证书验证错误,具体错误信息为:`curl_cffi.SSLError(77)certificateverifylocations:cacert.pem`。这个错误通常发生在Python3.11环境中使用`yfinance`库时,因为`yfinance`底层依赖的`requests`或`curl_cffi`库在尝试验证SSL证书时无法找到合适的证书颁发机构(CA)证书。###问题原因-错误代码77表示`CURLE_SSL_CACERT`(参见[cURL错误代码](https://curl.se/libcurl/c/libcurl-errors.html)),即无法加载SSL证书颁发机构(CA)文件。-在Python中,`requests`库(以及基于它的库)使用`certifi`包提供的CA证书包。但在某些环境下(尤其是Python3.11或某些操作系统),证书路径可能没有被正确设置。###解决方案####方法1:安装并更新`certifi`包首先尝试更新`certifi`包,确保你有最新的CA证书:```bashpipinstall--upgradecertifi```####方法2:设置环境变量指向证书文件如果更新后仍然有问题,可以手动设置`REQUESTS_CA_BUNDLE`环境变量指向`certifi`的证书文件:```pythonimportosimportcertifios.environ['REQUESTS_CA_BUNDLE']=certifi.where()os.environ['SSL_CERT_FILE']=certifi.where()```在代码中,你可以在导入`yfinance`之前设置这些环境变量。####方法3:在代码中禁用SSL验证(不推荐,仅用于测试)**警告**:这会降低安全性,仅用于测试环境。```pythonimportyfinanceasyf#在创建Ticker对象时禁用SSL验证stock=yf.Ticker('TSLA',verify_ssl=False)```####方法4:手动指定证书路径如果你知道系统中证书的位置(比如在Linux上通常是`/etc/ssl/certs/ca-certificates.crt`),可以设置环境变量指向该文件:```pythonimportosos.environ['REQUESTS_CA_BUNDLE']='/etc/ssl/certs/ca-certificates.crt'```###完整代码示例(包含SSL修复)以下代码在获取特斯拉期权数据之前设置了证书路径:```pythonimportosimportcertifiimportyfinanceasyfimportpandasaspd#修复SSL证书问题os.environ['REQUESTS_CA_BUNDLE']=certifi.where()os.environ['SSL_CERT_FILE']=certifi.where()#创建特斯拉股票对象ticker='TSLA'stock=yf.Ticker(ticker)#获取所有可用到期日exp_dates=stock.optionsprint(f"可用到期日:{exp_dates}")#选择最近的到期日selected_date=exp_dates[0]#获取期权链option_chain=stock.option_chain(selected_date)#提取看涨和看跌期权数据calls=option_chain.callsputs=option_chain.puts#添加期权类型列calls['optionType']='Call'puts['optionType']='Put'#合并数据all_options=pd.concat([calls,puts],ignore_index=True)#添加股票代码和到期日列all_options['ticker']=tickerall_options['expiration']=selected_date#导出到Exceloutput_file=f'TSLA_Options_{selected_date}.xlsx'withpd.ExcelWriter(output_file)aswriter:all_options.to_excel(writer,sheet_name='AllOptions',index=False)calls.to_excel(writer,sheet_name='Calls',index=False)puts.to_excel(writer,sheet_name='Puts',index=False)print(f"数据已成功导出到:{output_file}")```###补充说明1.**证书更新**:如果上述方法仍然无效,可能需要手动更新系统的根证书。在Ubuntu上可以运行:```bashsudoapt-getinstallca-certificates```2.**Python版本**:Python3.11在某些情况下可能有不同的SSL处理方式,确保你的Python环境是正确配置的。###相关问题§§相关问题§§1.如何更新Python的根证书?2.在Docker容器中如何解决SSL证书问题?3.如何为yfinance设置代理以避免连接问题?4.如何验证yfinance返回数据的完整性?</think>### 解决 yfinance SSL 证书验证错误 (Python 3.11)
当使用 `yfinance` 库时遇到 `curl_cffi.SSLError (77)` 错误,这通常是因为 Python 找不到 SSL 根证书文件。以下是完整的解决方案:
#### 1. **安装必要的依赖库**
```bash
pip install --upgrade yfinance certifi pyOpenSSL
```
#### 2. **在代码中设置证书路径**
```python
import os
import ssl
import certifi
import yfinance as yf
# 修复 SSL 证书路径问题
os.environ['REQUESTS_CA_BUNDLE'] = certifi.where()
ssl._create_default_https_context = ssl._create_unverified_context # 临时解决方案
# 现在可以正常使用 yfinance
ticker = yf.Ticker("TSLA")
option_chain = ticker.option_chain(ticker.options[0])
print(option_chain.calls.head())
```
#### 3. **永久解决方案(系统级修复)**
**Linux/macOS:**
```bash
sudo apt-get install ca-certificates # Debian/Ubuntu
sudo update-ca-trust # Fedora/CentOS
```
**Windows:**
1. 下载根证书包 https://curl.se/ca/cacert.pem
2. 将证书放入 Python 安装目录的 `ssl` 文件夹
3. 设置环境变量:
```python
import os
os.environ['SSL_CERT_FILE'] = 'C:/Python311/ssl/cacert.pem' # 你的实际路径
```
#### 4. **替代方案:使用自定义会话**
```python
import requests
import yfinance as yf
from requests.adapters import HTTPAdapter
from urllib3.util.ssl_ import create_urllib3_context
class SSLContextAdapter(HTTPAdapter):
def init_poolmanager(self, *args, **kwargs):
context = create_urllib3_context()
kwargs['ssl_context'] = context
return super().init_poolmanager(*args, **kwargs)
session = requests.Session()
session.mount('https://', SSLContextAdapter())
ticker = yf.Ticker("TSLA", session=session)
data = ticker.history(period="1mo")
```
### 错误原因说明
- **错误 77**:表示 OpenSSL 找不到证书颁发机构(CA)包
- **Python 3.11**:新版本使用更严格的 SSL 验证策略
- **yfinance 依赖**:底层使用 `curl_cffi` 处理 HTTPS 请求[^1]
- **证书位置**:默认在 `certifi.where()` 返回的路径
### 验证修复是否成功
```python
import ssl
print("证书路径:", ssl.get_default_verify_paths().openssl_cafile)
# 应显示类似: /usr/lib/ssl/certs/ca-certificates.crt
```
> **重要提示**:`ssl._create_unverified_context` 是临时解决方案,仅用于测试环境。生产环境应正确安装证书[^2]。
### 相关问题
阅读全文
相关推荐


















