【Python 3.x】e-StatからのデータをAPIで取得
e-Statは政府が提供している統計データですが、ものによってはAPIを提供しているため、Pythonで気軽に取得することが可能です。
www.e-stat.go.jp
例えば、国勢調査の男女別人口及び人口性比に関しては、以下のページからWebで確認することができます。
www.e-stat.go.jp
このページの左端にある表示項目選択を開くと、表示する項目を選択することができます。
選択後、ページ右にあるAPIボタンを押すことでXML/JSON/CSVのそれぞれの形式でファイルが取得できるAPIを取得することが可能。
今回は以下のような条件で取得
・表彰項目:人口、人口性比
・男女_時系列:男、女
・地域_時系列:都道府県全て(全国、人口集中地区、人口集中地区以外の地区は除外)
・時間軸(調査年):全て
Pythonのプログラムで取得する場合は、以降に記載するプログラムのように組めば行けます。
requestsモジュールを使うため、入れてない場合はpipで導入することをお勧めします。
python -m pip install requests
ちなみに、APIを利用する場合は、appIdを利用する必要があります。appIdはe-statでユーザ登録しないと入手できないため、あらかじめ登録作業が必要になります。
詳しくはこちら。
www.e-stat.go.jp
APIの仕様は以下に記載されています(現在は3.0)。
www.e-stat.go.jp
テストフォームを利用して、あらかじめAPIの確認も可能です。
https://www.e-stat.go.jp/api/sample/testform3-0/
というわけでプログラム。
import requests import sys # --CSVファイルパス CSV_PATH = r"C:\Users\hoge\Desktop" + "\\" url = "http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData" cdArea="01000,02000,03000,04000,05000,06000,07000,08000,09000,10000,11000,12000,13000,14000,15000,16000,17000,18000,19000,20000,21000,22000,23000,24000,25000,26000,27000,28000,29000,30000,31000,32000,33000,34000,35000,36000,37000,38000,39000,40000,41000,42000,43000,44000,45000,46000,47000" cdCat01="110,120" cdTab="020" appId="testtesttesttesttesttesttesttesttesttesttesttesttesttesttest" lang="J" statsDataId="0003410379" metaGetFlg="N" cntGetFlg="N" explanationGetFlg="N" annotationGetFlg="N" sectionHeaderFlg="2" replaceSpChars="0" # --HTTPリクエスト実行 def request() : params = { 'cdArea':cdArea , 'cdCat01':cdCat01 , 'cdTab':cdTab , 'appId':appId , 'lang':lang , 'statsDataId':statsDataId , 'metaGetFlg':metaGetFlg , 'cntGetFlg':cntGetFlg , 'explanationGetFlg':explanationGetFlg , 'annotationGetFlg':annotationGetFlg , 'sectionHeaderFlg':sectionHeaderFlg , 'replaceSpChars':replaceSpChars } filename = 'kokusei.csv' response = requests.get(url, params=params) #GETメソッドで情報を取得 response.encoding = response.apparent_encoding res_list = [] res_list = response.text.split() #print(response.text) if "STATUS" in res_list[1]: # 2行目にSTATUS文字列が入っていた場合(返却がエラーの場合) # print(f'{res_list[1]}:{res_list[2]}') return #print('API実行、データ取得完了') f = open(CSV_PATH + filename, 'w', newline='', encoding='utf8') f.write(response.text) f.close() # table_insert(filename, date) return try: request() except Exception as e: # logger.error(f'エラー要因:{str(e)}') sys.exit()
問題なくCSVに吐き出されると以下のような内容で取得できます。
"tab_code","表章項目","cat01_code","男女_時系列","area_code","地域_時系列","time_code","時間軸(調査年)","unit","value" "020","人口","110","男","01000","北海道","1920000000","1920年","人","1244322" "020","人口","110","男","01000","北海道","1925000000","1925年","人","1305473" "020","人口","110","男","01000","北海道","1930000000","1930年","人","1468540" "020","人口","110","男","01000","北海道","1935000000","1935年","人","1593845" <||