gpt4 book ai didi

python - Urllib 的 urlopen 在某些站点上中断(例如 StackApps api): returns garbage results

转载 作者:太空狗 更新时间:2023-10-29 18:30:00 28 4
gpt4 key购买 nike

我正在使用 urllib2urlopen 函数尝试从 StackOverflow api 获取 JSON 结果。

我使用的代码:

>>> import urllib2
>>> conn = urllib2.urlopen("http://api.stackoverflow.com/0.8/users/")
>>> conn.readline()

我得到的结果:

'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\xed\xbd\x07`\x1cI\x96%&/m\xca{\x7fJ\...

我是 urllib 的新手,但这似乎不是我应该得到的结果。我已经在其他地方尝试过了,我得到了我所期望的结果(与使用浏览器访问地址相同:一个 JSON 对象)。

在其他站点(例如“http://google.com”)上使用 urlopen 效果很好,并为我提供了实际的 html。我也尝试过使用 urllib,它给出了相同的结果。

我很困惑,甚至不知道去哪里寻找解决这个问题的方法。有什么想法吗?

最佳答案

这看起来几乎就像是用来腌制的东西。也许 User-Agent 字符串中的某些内容或 urllib2 发送的 Accepts header 导致 StackOverflow 发送 JSON 以外的内容。

一个线索是查看 conn.headers.headers 以查看 Content-Type header 的内容。

这个问题,Odd String Format Result from API Call ,也许会有你的答案。基本上,您可能必须通过 gzip 解压缩器运行结果。

使用此代码仔细检查:

>>> req = urllib2.Request("http://api.stackoverflow.com/0.8/users/",
headers={'Accept-Encoding': 'gzip, identity'})
>>> conn = urllib2.urlopen(req)
>>> val = conn.read()
>>> conn.close()
>>> val[0:25]
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\xed\xbd\x07`\x1cI\x96%&/m\xca{\x7fJ'

是的,您肯定会得到 gzip 编码的数据。

因为您似乎在使用相同版本的 Python 的不同机器上得到不同的结果,而且通常看起来 urllib2 API 会要求您做一些特殊的事情来请求 gzip 编码的数据,我猜您有一个透明的在某个地方代理。

我在 2009 年的 CodeCon 上看到了 EFF 的演示。他们正在进行端到端连接测试以发现各种肮脏的 ISP 技巧。他们在进行此测试时发现的一件事是,数量惊人的消费者级 NAT 路由器会添加随机 HTTP header 或进行透明代理。您的网络上可能有一些设备正在添加或修改 Accept-Encoding header ,以使您的连接看起来更快。

关于python - Urllib 的 urlopen 在某些站点上中断(例如 StackApps api): returns garbage results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3028426/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com