首先提问: 我得到了以下结果:
文件" 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吗?
谢谢!
答案 0 :(得分:4)
res = requests.get(loginpageURL, verify='false', ...
验证采用布尔值(即True或False)或路径,然后将其用作信任库的路径。您的规范'false'
是一个字符串而不是布尔值,因此它会尝试将文件false
用作CA存储。无法找到此文件,从而导致No such file or directory
。
要解决此问题,您必须使用verify=False
,即使用布尔值。
除了禁用验证是一个坏主意,只应该进行测试或TLS提供的安全性与程序完全无关。对于像您的情况一样的登录页面,禁用验证可能是一件坏事,因为中间人可以轻易地嗅探用户名和密码。