phi*_*344 1 python ssl urllib pandas python-requests
我有一个使用 url 地址读取网页内容的代码。
之前我的代码运行良好,现在站点安全证书有问题。为了解决IE的问题,我把证书导入可信站点,问题解决了。
但是当我运行这段代码时:
df = pd.read_html(i,header=0)[0]
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
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'
Run Code Online (Sandbox Code Playgroud)
谁能帮我解决这个问题?
什么是错误
阅读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'
Run Code Online (Sandbox Code Playgroud)
检查服务器公用名称时,第二次检查失败。这正是您的情况。
蟒蛇路径
参考熊猫文档:
io : str 或类似文件的 URL、类似文件的对象或包含 HTML 的原始字符串。请注意,lxml 只接受 http、ftp 和文件 url 协议。如果您的 URL 以“https”开头,则可以尝试删除“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()
Run Code Online (Sandbox Code Playgroud)
然后用 Pandas 处理它:
import pandas as pd
df = pd.read_html(html)
Run Code Online (Sandbox Code Playgroud)
创建有效的上下文
正如@AlastairMcCormack 指出的那样:
context = ssl._create_unverified_context()应该只用于本地主机或测试。
如果在不验证 SSL 上下文的情况下访问资源解决了您的问题,那么是时候创建一个有效的上下文(intro、snippets)以安全地获取您的资源。
服务器路径
您还可以创建一个新证书,其中 Common Name 与服务器域(或其 IP)匹配。这里localhost似乎来自发送到生产服务器的开发证书,这无法正常工作。
无论如何,这一点并不能解决read_html不处理 HTTPS 连接的事实。
| 归档时间: |
|
| 查看次数: |
1573 次 |
| 最近记录: |