Python请求库SSL错误:[Errno 2]没有这样的文件或目录

时间:2016-08-19 22:21:37

标签: python ssl python-requests

首先提问: 我得到了以下结果:

  

文件" D:\ Anaconda \ Lib \ site-packages \ requests \ api.py",第70行,获取   退货请求(' get',url,params = params,** kwargs)

     

文件" D:\ Anaconda \ Lib \ site-packages \ requests \ api.py",第56行,in   请求返回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行,   在send r = adapter.send(request,** kwargs)

     

文件" D:\ Anaconda \ Lib \ site-packages \ requests \ adapters.py",第497行,   in send raise 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)

我已经广泛研究了这个问题,并得出结论,它实际上是request / urllib3库本身的一个问题。

首先,我尝试了验证=' false'修复here。它没有用。有人here说要安装新的openSSL和certifi,它们似乎已在我的系统上安装和更新。 发现该错误在here上有很好的写法。我看不到任何解决方案。 它已在github上被识别为已知问题here

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

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

谢谢!

1 个答案:

答案 0 :(得分:4)

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

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

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

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