当将方法read_html用于HTTPS资源时,Pandas引发ssl.CertificateError

时间:2018-06-21 13:19:07

标签: python pandas ssl python-requests urllib

我有一个使用URL地址读取网页内容的代码。

以前,我的代码运行良好,现在站点安全证书存在问题。为了解决IE的问题,我已将证书导入到受信任的站点中,并且问题已解决。

但是当我运行这段代码时:

df = pd.read_html(i,header=0)[0]

我得到一个错误:

Traceback (most recent call last):
  File "D:\Distrib\Load_Data_from_Flat_ver_1.py", line 95, in <module>
    df = pd.read_html(i,header=0)[0]
  File "C:\Program Files\Python36\lib\site-packages\pandas\io\html.py", line 915, in read_html
    keep_default_na=keep_default_na)
  File "C:\Program Files\Python36\lib\site-packages\pandas\io\html.py", line 749, in _parse
    raise_with_traceback(retained)
  File "C:\Program Files\Python36\lib\site-packages\pandas\compat\__init__.py", line 385, in raise_with_traceback
    raise exc.with_traceback(traceback)
ssl.CertificateError: hostname '10.89.174.12' doesn't match 'localhost'

有人可以帮助我解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

什么是错误

阅读ssl软件包的PSL文档,您会发现一个发生此特定错误的示例。

>>> cert = {'subject': ((('commonName', 'example.com'),),)}
>>> ssl.match_hostname(cert, "example.com")
>>> ssl.match_hostname(cert, "example.org")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/home/py3k/Lib/ssl.py", line 130, in match_hostname
ssl.CertificateError: hostname 'example.org' doesn't match 'example.com'

在检查服务器公用名时,第二次检查失败。这正是您的情况。

Python路径

参考熊猫documentation

  

io:str或类似文件的文件       URL,类似文件的对象或包含HTML的原始字符串。       请注意,lxml仅接受http,ftp和文件url协议。如果你       具有以“ https”开头的URL,您可以尝试删除“ s”。

您无法使用read_html方法从HTTPS读取内容。

要解决此问题,请先使用PSL over HTTPS下载资源,而不验证SSL上下文:

from urllib import request
import ssl

url="https://example.com/data.html"
context = ssl._create_unverified_context()
response = request.urlopen(url, context=context)
html = response.read()

然后用熊猫处理它:

import pandas as pd
df = pd.read_html(html)

创建有效上下文

@AlastairMcCormack指出:

  

context = ssl._create_unverified_context()仅应用于本地主机或测试。

如果在不验证SSL上下文的情况下访问资源可以解决您的问题,那么现在是创建有效上下文introsnippets)以便安全获取的时候了您的资源。

服务器路径

您还可以在“公用名”与服务器域(或其IP)匹配的地方创建新证书。这里的localhost似乎来自发送到生产服务器的开发证书,该证书无法正常工作。

无论如何,read_html不能处理HTTPS连接,这一点还是无法解决。