EDIT - FIXED tldr,几年前安装的半旧版python有ssl包未更新以处理更新的SSL证书。在更新Python并确保ssl包是最新的之后,一切正常。
我是网络抓取的新手,想要抓一个网站,但由于某种原因,我在这个特定网站上使用Python的Requests包时遇到错误。
我正在进行安全登录以从我的用户个人资料中抓取数据。登录地址可在此处找到:https://secure.funorb.com/m=weblogin/loginform.ws?mod=hiscore_fo&ssl=0&expired=0&dest=
我现在只是尝试执行简单的任务,比如从get请求中打印文本。以下是我的代码。
import requests
req = requests.get('https://secure.funorb.com/m=weblogin/loginform.ws?mod=hiscore_fo&ssl=0&expired=0&dest=',verify=False)
print req.text
当我运行它时,会抛出错误:
File "/Library/Python/2.7/site-packages/requests/adapters.py", line 512, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:590)
我查看了这个文件,看看发生了什么。似乎罪魁祸首是
except (_SSLError, _HTTPError) as e:
if isinstance(e, _SSLError):
raise SSLError(e, request=request)
elif isinstance(e, ReadTimeoutError):
raise ReadTimeout(e, request=request)
else:
raise
我不太确定如何避免这种情况,我在调试极限。
我的代码在其他安全网站上运行得很好,例如https://bitbucket.org/account/signin/。我已经在堆栈交换和网络上看了很多解决方案,很多人声称添加可选参数“verify = False”应该修复这些类型的SSL错误(这不是最安全的方法)它)。但正如您从我的代码片段中看到的那样,这对我没有帮助。
如果有人能够开展这项工作/提供去哪里的建议,我们将不胜感激。
答案 0 :(得分:2)
...很多人声称在可选参数中添加" verify = False"应修复这些类型的SSL错误
添加verify=False
有助于在验证证书时防止错误,但不会对服务器的EOF,握手错误或类似情况有所帮助。
从SSLLabs可以看出,对于不支持TLS的客户,此特定服务器表现出简单关闭连接的行为(即" EOF违反协议") 1.2用现代密码。虽然您没有指定您使用的SSL版本,但我希望它的版本低于OpenSSL 1.0.1,OpenSSL的第一个版本支持TLS 1.2。
请检查ssl.OPENSSL_VERSION
以获取代码中使用的版本。如果我更正你唯一的解决方法是升级Python使用的OpenSSL版本。如何完成此操作取决于您的平台,但有关于它的现有帖子,如Updating openssl in python 2.7。
答案 1 :(得分:1)
在其他地方看到它。如果您尝试使用sessions,请执行以下操作:
import requests
sess = requests.Session()
adapter = requests.adapters.HTTPAdapter(max_retries = 20)
sess.mount('http://', adapter)
然后,使用requests.get()
sess.get()
如果您想继续处理请求,可能需要安装ndg-httpsclient包。