我在用着 urllib2' urlopen 函数尝试从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对象)。

使用 urlopen 在其他站点(例如”http://google.com”)工作正常,并给了我实际的HTML。我也尝试使用 urllib 它给出了相同的结果。

我很困惑,甚至不知道该如何解决这个问题。有任何想法吗?

有帮助吗?

解决方案

这几乎看起来像是您要喂给泡菜的东西。也许在用户代理字符串或接受Urllib2发送的标题中,可能导致stackoverflow发送JSON以外的其他内容。

一个明显的是看 conn.headers.headers 查看内容类型标题的内容。

这个问题, API调用的奇数字符串格式结果, ,可能有您的答案。基本上,您可能必须通过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标头或进行透明的代理。您可能在网络上有一些设备,这些设备正在添加或修改 Accept-Encoding 标题以使您的连接看起来更快。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top