首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Urllib在一些网站(例如StackApps api)上的urlopen中断:返回垃圾结果

Urllib在一些网站(例如StackApps api)上的urlopen中断:返回垃圾结果
EN

Stack Overflow用户
提问于 2010-06-12 18:58:16
回答 1查看 1K关注 0票数 10

我正在使用urllib2urlopen函数来尝试从StackOverflow应用程序接口获取JSON结果。

我使用的代码如下:

代码语言:javascript
复制
>>> import urllib2
>>> conn = urllib2.urlopen("http://api.stackoverflow.com/0.8/users/")
>>> conn.readline()

我得到的结果是:

代码语言:javascript
复制
'\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,它给出了同样的结果。

我被卡住了,甚至不知道去哪里解决这个问题。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-06-12 19:41:13

这看起来就像是你要喂泡菜的东西。也许User-Agent字符串或Accept报头中的某些内容导致StackOverflow发送urllib2以外的内容。

一个很有说服力的例子是查看conn.headers.headers,看看Content-Type头是怎么说的。

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

用下面的代码仔细检查:

代码语言:javascript
复制
>>> 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报头,以便使您的连接看起来更快。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3028426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档