Skip to main content
 首页 » 编程设计

Python 请求库 SSL 错误 : [Errno 2] No such file or directory

2025年05月04日22oomusou

第一个问题: 我得到以下结果:

File "D:\Anaconda\Lib\site-packages\requests\api.py", line 70, in get return request('get', url, params=params, **kwargs)

File "D:\Anaconda\Lib\site-packages\requests\api.py", line 56, in request return session.request(method=method, url=url, **kwargs)

File "D:\Anaconda\Lib\site-packages\requests\sessions.py", line 475, in request resp = self.send(prep, **send_kwargs)

File "D:\Anaconda\Lib\site-packages\requests\sessions.py", line 596, in send r = adapter.send(request, **kwargs)

File "D:\Anaconda\Lib\site-packages\requests\adapters.py", line 497, in send raise SSLError(e, request=request)

requests.exceptions.SSLError: [Errno 2] No such file or directory

这可以追溯到这里的一行代码:

import requests, os, bs4, calendar #, sys 
import urllib.request 
 
while not year>2016: 
    print('Downloading page {}...'.format(url)) 
 
    res = requests.get(loginpageURL, verify='false', auth=('username', 'password')) #this is the line that doesn't work 
    res = requests.get(url, verify='false') #but I have tried it without that line and this line also doesn't work 
    res.raise_for_status() 
 
    soup = bs4.BeautifulSoup(res.text) 
    print(soup) 

我对这个问题进行了广泛的研究,得出的结论是,这实际上是 requests/urllib3 库本身的问题。

起初,我尝试了 verify='false' 修复 here .它没有用。有人here据说要安装新的 openSSL 和 certifi,它们似乎已在我的系统上安装并且是最新的。 发现该错误在 here 上有很好的描述.我所看到的没有解决方案。 它已在 github 上确定为已知问题 here .

当,根据this回答,我尝试将 verify='false' 更改为 verify='cacert.pem' (我将其包含在项目目录中),它抛出了这个错误: requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:645)

现在我坐在这里只是想让这个代码片段运行 - 我正在尝试从网站批量下载几百个 zip 文件 - 尽管库存在已知问题。我对 python 比较陌生,但对网络抓取尤其陌生,所以这对我来说是一个陡峭的学习曲线。任何帮助,将不胜感激。我需要走那么远吗 scrapping requests ?

谢谢!

请您参考如下方法:

res = requests.get(loginpageURL, verify='false', ... 

Verify 采用 bool 值(即 True 或 False)或随后用作信任库路径的路径。您的规范 'false' 是一个字符串而不是 bool 值,因此它将尝试使用文件 false 作为 CA 存储。找不到该文件,因此导致 No such file or directory。

要解决此问题,您必须使用 verify=False,即使用 bool 值。

除此之外,禁用验证是一个坏主意,只应在测试时或在 TLS 提供的安全性与程序完全无关时才应这样做。对于像您这样的登录页面,禁用验证可能是一件坏事,因为中间人可以轻松嗅探用户名和密码。