Eda*_*aor 10 python urllib urllib2 urlopen
我使用urllib2的urlopen功能,试图从StackOverflow的API获取JSON结果.
我正在使用的代码:
>>> import urllib2
>>> conn = urllib2.urlopen("http://api.stackoverflow.com/0.8/users/")
>>> conn.readline()
Run Code Online (Sandbox Code Playgroud)
结果我得到了:
'\x1f\x8b\x08\x00\x00\x00\x00\x00\x04\x00\xed\xbd\x07`\x1cI\x96%&/m\xca{\x7fJ\...
Run Code Online (Sandbox Code Playgroud)
我对urllib相当新,但这似乎不是我应该得到的结果.我已经在其他地方尝试过了,我得到了我的期望(与使用浏览器访问地址一样:JSON对象).
urlopen在其他网站上使用(例如" http://google.com ")工作正常,并给我实际的HTML.我也试过使用urllib,它给出了相同的结果.
我很困难,甚至不知道在哪里寻找解决这个问题.有任何想法吗?
Omn*_*ous 10
这几乎看起来像你要腌制的东西.也许urllib2发送的User-Agent字符串或Accepts标头中的某些内容导致StackOverflow发送除JSON之外的其他内容.
一个方法是查看conn.headers.headersContent-Type标题所说的内容.
而这个问题,来自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'
Run Code Online (Sandbox Code Playgroud)
是的,你肯定会得到gzip编码数据.
因为你似乎在使用相同版本的Python的不同机器上获得不同的结果,并且通常看起来urllib2 API会要求你做一些特殊的事情来请求gzip编码数据,我的猜测是你在那里有一个透明的代理某个地方.
我在2009年看到了EFF在CodeCon上的演示.他们正在进行端到端的连接测试,以发现各种各样的脏ISP技巧.他们在进行此测试时发现的一件事是,令人惊讶的消费级NAT路由器添加随机HTTP标头或进行透明代理.您的网络上可能有一些设备正在添加或修改Accept-Encoding标头,以使您的连接看起来更快.
| 归档时间: |
|
| 查看次数: |
985 次 |
| 最近记录: |