【问题标题】:Pandas read_csv fails to download CSV with SSL ErrorPandas read_csv 无法下载 CSV 并出现 SSL 错误
【发布时间】:2021-12-01 09:03:34
【问题描述】:

这里是重现它的代码:

import pandas as pd
url = 'https://info.gesundheitsministerium.gv.at/data/timeline-faelle-bundeslaender.csv'
df = pd.read_csv(url)

它失败并返回以下回溯:

URLError: <urlopen error [SSL: DH_KEY_TOO_SMALL] dh key too small (_ssl.c:1129)>

这是一个link to check 的网址。如果您将链接嵌入 Jupyter 中的降价单元格,则可以从同一浏览器下载。

有什么想法可以让这个“正常工作”吗?

更新:

根据以下 Florin C. 提出的问题,

此解决方案解决了通过请求下载时的问题:

import requests
import urllib3
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ALL:@SECLEVEL=1'

requests.get(url)

这只是强迫 Pandas 以某种方式做同样的事情。

我的环境:

Python implementation: CPython
Python version       : 3.9.7
IPython version      : 7.28.0

requests  : 2.25.1
seaborn   : 0.11.2
json      : 2.0.9
numpy     : 1.20.3
plotly    : 5.4.0
matplotlib: 3.5.0
lightgbm  : 3.3.1
pandas    : 1.3.4

Watermark: 2.2.0

【问题讨论】:

  • 看起来和这个问题一样:stackoverflow.com/questions/38015537/…
  • 那是用请求下载,错误是一样的。但是 Pandas 应该能够透明地处理这个问题。
  • 在 Ubuntu 18 上运行的 Jupyter 中为我工作。先下载 csv 然后用 pandas 读取它的解决方法是否可以接受?否则,我建议您检查您的 OpenSSL 版本 - 显然该网站接受弱 DH 密钥,但较新的 OpenSSL 不接受。
  • 无法重现该问题..
  • 这很有趣,因为我的浏览器可以正常处理它(这是一个简单的解决方法),它应该使用与 Pandas 相同的 OS OpenSSL 版本。所以我认为这是关于它如何处理 SSL 的 Pandas 问题。 requests 给出了同样的错误。

标签: python pandas


【解决方案1】:

如果您需要自动化流程并且不想先下载 csv 然后从文件中读取,这是一个解决方案。

import requests
import urllib3
import io
requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ALL:@SECLEVEL=1'

res = requests.get(url)
pd.read_csv(io.BytesIO(res.content), sep=';')

应该注意,在操作系统级别将默认密码更改为SECLEVEL=1 可能不安全。不过这个临时改动应该没问题。

【讨论】:

    猜你喜欢
    • 2022-07-25
    • 1970-01-01
    • 2021-12-31
    • 2013-07-07
    • 2020-08-09
    • 2018-02-04
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    相关资源
    最近更新 更多