Pandas调用read_csv下载CSV时出现SSL DH_KEY_TOO_SMALL错误如何解决?
出现该错误的原因是目标网站的SSL证书Diffie-Hellman密钥长度低于当前Python环境默认的安全校验要求,浏览器为了兼容性默认放低了校验规则所以可以正常访问。以下是可直接使用的解决方案:
方案1:借助requests下载后读取(兼容性最好,全版本通用)
这个方法直接利用你已经验证可行的requests配置,把下载到的内容直接转成文件对象传给pandas,无需修改pandas底层逻辑:
import pandas as pd import requests from io import BytesIO # 你已经验证过的加密套件配置 requests.packages.urllib3.util.ssl_.DEFAULT_CIPHERS = 'ALL:@SECLEVEL=1' url = 'https://info.gesundheitsministerium.gv.at/data/timeline-faelle-bundeslaender.csv' # 先请求获取内容 res = requests.get(url) # 把返回的二进制内容转为文件对象传给read_csv df = pd.read_csv(BytesIO(res.content))
这个方案是最稳妥的,不会影响其他请求的全局ssl配置,也不会因为pandas版本差异出现兼容问题。
方案2:修改全局urllib SSL配置(适合不想改下载逻辑的场景)
pandas 1.3及更早版本默认使用Python标准库的urllib拉取远程文件,因此直接修改urllib的全局ssl配置即可生效:
import pandas as pd import ssl # 调整全局SSL安全等级和加密套件 ctx = ssl.create_default_context() ctx.set_ciphers('ALL:@SECLEVEL=1') ssl._create_default_https_context = lambda: ctx url = 'https://info.gesundheitsministerium.gv.at/data/timeline-faelle-bundeslaender.csv' df = pd.read_csv(url)
注意这个方法会修改当前Python进程所有HTTPS请求的SSL配置,如果你有其他对安全性要求高的请求不建议使用。
方案3:使用pandas的storage_options参数(pandas≥1.2版本适用)
较高版本的pandas支持通过storage_options参数直接传递请求相关的配置给底层I/O模块,无需修改全局配置:
import pandas as pd url = 'https://info.gesundheitsministerium.gv.at/data/timeline-faelle-bundeslaender.csv' df = pd.read_csv( url, storage_options={ "ciphers": "ALL:@SECLEVEL=1" } )
内容的提问来源于stack exchange,提问作者fccoelho
相关产品推荐
相关产品推荐

