我一直在使用一个Python脚本来访问Sidra(IBGE)API并获取数据.它工作得非常好,但最近,在我没有任何更改的情况下,我开始遇到一个SSL错误.以下是我一直使用的代码:

import requests

url = 'https://servicodados.ibge.gov.br/api/v3/agregados'
response = requests.get(url)
print(response.json())

在运行代码时,我得到以下错误:

SSLError:HTTPSConnectionPool(host=‘servicodados.ibge.gov.br’,端口=443):超过了url:/api/v3/agregados的最大重试次数(由SSLError(1,‘[ssl:UNSAFE_LEGISTICE_RENECONTATION_DISABLED]不安全的旧版重新协商禁用(_ssl.c:1007)’)引起)

以下是我try 过的一些方法:

  1. 对quests.get()使用Verify=False选项.
  2. 更新请求和urllib3库.
  3. try 使用其他库,如HTTPX和aiohttp.
  4. 正在判断OpenSSL版本.

似乎没有什么能解决这个问题.我很困惑,因为代码过go 可以正常工作,没有任何问题.有没有人遇到过这种情况,并知道解决办法?

推荐答案

try :

import ssl

import requests


class TLSAdapter(requests.adapters.HTTPAdapter):
    def init_poolmanager(self, *args, **kwargs):
        ctx = ssl.create_default_context()
        ctx.set_ciphers("DEFAULT@SECLEVEL=1")
        ctx.options |= 0x4   # <-- the key part here, OP_LEGACY_SERVER_CONNECT
        kwargs["ssl_context"] = ctx
        return super(TLSAdapter, self).init_poolmanager(*args, **kwargs)


url = "https://servicodados.ibge.gov.br/api/v3/agregados"

with requests.session() as s:
    s.mount("https://", TLSAdapter())
    print(s.get(url).json())

打印:

[{'id': 'D5', 'nome': 'Áreas Urbanizadas', 'agregados': [{'id': '8418', 'nome': 'Áreas urbanizadas,

...

Python相关问答推荐

Python:记录而不是在文件中写入询问在多文件项目中记录的最佳实践

Python plt.text中重叠,包adjust_text不起作用,如何修复?

如何使用SubProcess/Shell从Python脚本中调用具有几个带有html标签的参数的Perl脚本?

Python会扔掉未使用的表情吗?

将输入管道传输到正在运行的Python脚本中

我如何使法国在 map 中完全透明的代码?

如何在Python数据框架中加速序列的符号化

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

迭代嵌套字典的值

Asyncio:如何从子进程中读取stdout?

使用groupby方法移除公共子字符串

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

幂集,其中每个元素可以是正或负""""

matplotlib图中的复杂箭头形状

从列表中获取n个元素,其中list [i][0]== value''

如何在Python中使用Iscolc迭代器实现观察者模式?

GPT python SDK引入了大量开销/错误超时

你能把函数的返回类型用作其他地方的类型吗?'

如何使用加速广播主进程张量?

将数字数组添加到Pandas DataFrame的单元格依赖于初始化