Python请求在某些站点上引发SSL错误

时间:2017-05-31 20:35:24

标签: python ssl web-scraping python-requests

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错误(这不是最安全的方法)它)。但正如您从我的代码片段中看到的那样,这对我没有帮助。

如果有人能够开展这项工作/提供去哪里的建议,我们将不胜感激。

2 个答案:

答案 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包。