`
jianpx
  • 浏览: 168980 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

直接读取stackoverflow api 的返回值作为json串

阅读更多

今天遇到一个问题就是用python调用stackoverflow提供的api的时候,一开始老是不能直接将其解析为字符串,但是在chrome浏览器上面直接访问那个api却可以看到json串,在ff下面是返回一个json串的文件,要求下载,文件内容就是我想要的。然后查了下response 的header, 发现content-type是application/json的,看来chrome是智能一些,它试图去用解析这个文件并直接在浏览器上面显示而不需要下载。同时发现content-encoding是gzip的,接下来就好办了。直接用python的gzip + cStringIO来处理,代码如下。

 

#!/usr/bin/env python
#-*- coding:utf-8 -*-
import urllib
import simplejson as json
import gzip
import cStringIO

def run():
    url = 'http://api.stackoverflow.com/1.0/stats'
    c = urllib.urlopen(url).read()
    s = cStringIO.StringIO(c)
    gzfile = gzip.GzipFile(fileobj=s, mode='rb')
    content = gzfile.read()
    data = json.loads(content)
    print type(data)
    print data

run()

 

得到的是这样的json字符串:

 

{

  "statistics": [

    {

      "total_questions": 1154706,

      "total_unanswered": 210487,

      "total_accepted": 722309,

      "total_answers": 2880708,

      "total_comments": 4533614,

      "total_votes": 10049713,

      "total_badges": 1128935,

      "total_users": 427202,

      "questions_per_minute": 2.36,

      "answers_per_minute": 4.72,

      "badges_per_minute": 1.98,

      "views_per_day": 586548.96,

      "api_version": {

        "version": "1.0",

        "revision": "2010.12.15.1"

      },

      "site": {

        "name": "Stack Overflow",

        "logo_url": "http://sstatic.net/stackoverflow/img/logo.png",

        "api_endpoint": "http://api.stackoverflow.com",

        "site_url": "http://stackoverflow.com",

        "description": "Q&A for professional and enthusiast programmers",

        "icon_url": "http://sstatic.net/stackoverflow/img/apple-touch-icon.png",

        "aliases": [

          "http://www.stackoverflow.com"

        ],

        "state": "normal",

        "styling": {

          "link_color": "#0077CC",

          "tag_foreground_color": "#3E6D8E",

          "tag_background_color": "#E0EAF1"

        }

      }

    }

  ]

}

 

 

*思考: stackoverflow的服务器这样做(返回application/json这样的media type而不是以前经常遇到的text/plain)的原因可能是为了压缩数据,后面的content-encoding是gzip更加说明了这一点,这样可以减少网络IO,由此判断stackoverflow的访问量还是挺大的,之前有几次访问都出现”网站访问量过大,请稍后访问“的类似提示。。。

 

*补充: 如果想服务端返回application/json这样的media type,很简单,只需要在header里面设置content-type就行了。类似: headers = {'content-type': 'application/json'}, return Response(body, headers=headers)

 

 

1
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics