備忘録としてメモ。 やりたいことは、REST API提供されているデータを取得して、保存することです。
また使用しているpythonの環境は、以下。
python --version Python 3.4.3 :: Anaconda 2.2.0 (x86_64)
使用するデータは、e-StatのAPIから取得します。 APIを使用するに歳しては、まずユーザ登録をして、アプリケーションIDを発行しなくてはなりません。
提供されている機能としては5種類あります。 主に使いそうなものとしては、下記の2点になるかと思います。
- 使いたいデータの政府統計コードを使って、「統計表情報取得」機能から利用したい統計表IDを取得
- 「統計データ取得」機能からデータを取得
今回は、2点目の機能を利用。 平成22年国税調査 速報集計(0003033021)を例として、取得してみました。
#! /usr/bin/env python #-*- coding: utf-8 -*- import urllib.request, urllib.parse import json, sys def getEStatData(): jsonUrl = "http://api.e-stat.go.jp/rest/2.0/app/json" apiKey = "(YOUR API KEY)" statId = "0003033021" # 平成22年国税調査 速報集計 statsDataUrl = "%s/getStatsData?appId=%s&statsDataId=%s" url = (statsDataUrl % (jsonUrl, apiKey, statId)) print(url) f = urllib.request.urlopen(url) jsonData = json.loads(f.read()) print (jsonData) file = open('StatsData.json', 'w') json.dump(jsonData, file, sort_keys=True, indent=4) file.close() if __name__ == '__main__': sys.exit(getEStatData())
urlib.request.urlopen
がbyte型を返すことに注意(参考; http://docs.python.jp/3/library/urllib.request.html)。
TypeError: the JSON object must be str, not 'bytes'
下記のようにutf-8にデコードすると日本語のままデータが取得できますが、このようにデコードした場合でもERROR_MSG":"\u6B63\u5E38\u306B\u7D42\u4E86\u3057\u307E\u3057\u305F\u3002"
とUnicodeエスケープされてしまう場合があったのですが、そんなときにはunicode-escape
を指定することで、回避していました。(正直、違いがわからない)。
jsonData = json.loads(f.read().decode('utf-8')) print (jsonData)
一方で、出力したjsonファイルの方は、Unicodeエスケープされてしまいます。
これはjson.dumps
の引数であるensure_ascii
がデフォルトでTrue
になっており、入ってくるデータをエスケープする仕様になっていることに起因します。
従って、それをFalse
にすることで、ファイルに書き出したときも日本語が保つことができます。
file = open('StatsData.json', 'w') json.dump(jsonData, file, sort_keys=True, indent=4, ensure_ascii=False) file.close() if __name__ == '__main__': sys.exit(getEStatData())