【问题标题】:Python requests Library SSL error: [Errno 2] No such file or directoryPython 请求库 SSL 错误:[Errno 2] 没有这样的文件或目录
【发布时间】:2016-12-27 04:04:42
【问题描述】:

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

文件“D:\Anaconda\Lib\site-packages\requests\api.py”,第 70 行,在 get 返回请求('get', url, params=params, **kwargs)

文件“D:\Anaconda\Lib\site-packages\requests\api.py”,第 56 行,在 请求返回 session.request(method=method, url=url, **kwargs)

文件“D:\Anaconda\Lib\site-packages\requests\sessions.py”,第 475 行, 在请求 resp = self.send(prep, **send_kwargs)

文件“D:\Anaconda\Lib\site-packages\requests\sessions.py”,第 596 行, 在发送 r = adapter.send(request, **kwargs)

文件“D:\Anaconda\Lib\site-packages\requests\adapters.py”,第 497 行, 在发送中引发 SSLError(e, request=request)

requests.exceptions.SSLError: [Errno 2] 没有这样的文件或目录

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

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 和证书,它们似乎已在我的系统上安装并且是最新的。 发现该错误在here 上有很好的记录。从我所看到的没有解决方案。 它已在 github 上被识别为已知问题here

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

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

谢谢!

【问题讨论】:

  • 其实不确定,但我想我前段时间遇到过这个问题,发现缺少一些 SSL 模块。好问题顺便说一句。
  • 你可能是对的,这就是我的知识崩溃的地方。我已经尝试过使用 MechanicalSoup 库,当我尝试使用 get: requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645) 时,它会引发类似的错误。

标签: python ssl python-requests


【解决方案1】:
res = requests.get(loginpageURL, verify='false', ...

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

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

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

【讨论】:

  • 感谢 Steffen,正如您在上面看到的,我更改了该方法以指示 cacert.pem 的路径,它引发了 requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:645) 错误。
  • @DK.:这是一个不同的问题。但简而言之:要么该站点的根 CA 不在 cacert.pem 中,要么服务器未能提供链式证书。如果您的 cacert.pem 的 URL 和内容都已知,那么可能只能说这种情况。
猜你喜欢
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
相关资源
最近更新 更多