Die [API-Spezifikationen] von e-Stat (http://www.e-stat.go.jp/api/api-spec/) wurden aktualisiert.
Ich habe ein Skript erstellt, das Version 2 entspricht, indem ich mich auf den Beitrag meines Vorgängers (Python 2.7) bezog.
Verwenden wir die API des allgemeinen Fensters für Regierungsstatistiken (e-Stat)
Das Skript vor dem Bearbeiten enthält die API-ID im Argument, aber es ist schwierig, sie jedes Mal einzugeben, daher habe ich sie in den Code geschrieben.
Außerdem wird Government Statistics Code in stats_code eingegeben.
getStatsListSample2015.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib
import urllib2
from lxml import etree
import sys
import codecs
def main(argvs, argc):
if argc != 3:
print ("Usage #python %s api_key search_kind stats_code" % argvs[0])
return 1
api_key = '' #Geben Sie die erhaltene API-ID ein
search_kind = argvs[1]
stats_code = argvs[2]
stats_code = urllib.quote(stats_code.encode('utf-8'))
url = ('http://api.e-stat.go.jp/rest/2.0/app/getStatsList?appId=%s&lang=J&statsCode=%s&searchKind=%s' % (api_key, stats_code, search_kind))
req = urllib2.Request(url)
opener = urllib2.build_opener()
conn = opener.open(req)
cont = conn.read()
parser = etree.XMLParser(recover=True)
root = etree.fromstring(cont, parser)
result = root.find('RESULT')
data_list = root.find('DATALIST_INF')
table_infs = data_list.xpath('./TABLE_INF')
for table_inf in table_infs:
print ((u'--------------').encode('utf-8'))
for iterator in table_inf.getiterator():
if iterator.text is not None:
itag = iterator.tag.encode('utf-8')
itext = iterator.text.encode('utf-8')
if iterator.items() is not None:
if iterator.get('id') is not None:
print itag,iterator.get('id').encode('utf-8'),itext
elif iterator.get('code') is not None:
print itag,iterator.get('code').encode('utf-8'),itext
elif iterator.get('no') is not None:
print itag,iterator.get('no').encode('utf-8'),itext
else:
print itag,itext
if __name__ == '__main__':
argvs = sys.argv
argc = len(argvs)
sys.exit(main(argvs, argc))
Anwendungsbeispiel:
python getStatsListSample2015.py 1 00200521 > gSLS00200521.dat
Ergebnis:
gSLS00200521.dat
--------------
TABLE_INF 0000030001
STAT_NAME 00200521 Volkszählung
GOV_ORG 00200 Ministerium für innere Angelegenheiten und Kommunikation
STATISTICS_NAME 1980 Volkszählung 1. Basic Total National Edition
TITEL 00101 Geschlecht (Geschlecht) (3), Alter 5 Jahre (23), Bevölkerung im ganzen Land / Stadt / Landkreis / Präfektur (47), Gesamtgebiet / Bevölkerungskonzentrationsgebiet
CYCLE -
SURVEY_DATE 198010
OPEN_DATE 2007-10-05
SMALL_AREA 0
MAIN_KATEGORIE 02 Bevölkerung / Haushalt
SUB_KATEGORIE 01 Bevölkerung
OVERALL_TOTAL_NUMBER 3651
UPDATED_DATE 2008-03-19
--------------
TABLE_INF 0000030002
STAT_NAME 00200521 Volkszählung
GOV_ORG 00200 Ministerium für innere Angelegenheiten und Kommunikation
STATISTICS_NAME 1980 Volkszählung 1. Basic Total National Edition
TITEL 00102 Geschlecht (Geschlecht) (3), Altersgruppe (103), Bevölkerung im ganzen Land / Stadt / Landkreis / Präfektur (47), Gesamtgebiet / Bevölkerungskonzentrationsgebiet
CYCLE -
SURVEY_DATE 198010
OPEN_DATE 2007-10-05
SMALL_AREA 0
MAIN_KATEGORIE 02 Bevölkerung / Haushalt
SUB_KATEGORIE 01 Bevölkerung
OVERALL_TOTAL_NUMBER 16365
UPDATED_DATE 2008-03-19
--------------
・
・
・
export_csv2015.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import urllib2
from lxml import etree
import csv
def export_statical_data(writer, api_key, stats_data_id, class_object, start_position):
"""
Statistiken exportieren
"""
url = ('http://api.e-stat.go.jp/rest/2.0/app/getStatsData?limit=10000&appId=%s&lang=J&statsDataId=%s&metaGetFlg=N&cntGetFlg=N' % (api_key, stats_data_id))
if start_position > 0:
url = url + ('&startPosition=%d' % start_position)
req = urllib2.Request(url)
opener = urllib2.build_opener()
conn = opener.open(req)
cont = conn.read()
parser = etree.XMLParser(recover=True)
root = etree.fromstring(cont, parser)
row = []
datas = {}
value_tags = root.xpath('//STATISTICAL_DATA/DATA_INF/VALUE')
for value_tag in value_tags:
row = []
for key in class_object:
val = value_tag.get(key)
if val in class_object[key]['objects']:
level = '';
if 'level' in class_object[key]['objects'][val]:
if class_object[key]['objects'][val]['level'].isdigit():
level = ' ' * (int(class_object[key]['objects'][val]['level']) - 1)
text = ("%s%s" % (level , class_object[key]['objects'][val]['name']))
row.append(text.encode('utf-8'))
else:
row.append(val.encode('utf-8'))
row.append(value_tag.text)
writer.writerow(row)
next_tags = root.xpath('//STATISTICAL_DATA/TABLE_INF/NEXT_KEY')
if next_tags:
if next_tags[0].text:
export_statical_data(writer, api_key, stats_data_id, class_object, int(next_tags[0].text))
def get_meta_data(api_key, stats_data_id):
"""
Holen Sie sich Meta-Informationen
"""
url = ('http://api.e-stat.go.jp/rest/2.0/app/getMetaInfo?appId=%s&lang=J&statsDataId=%s' % (api_key, stats_data_id))
req = urllib2.Request(url)
opener = urllib2.build_opener()
conn = opener.open(req)
cont = conn.read()
parser = etree.XMLParser(recover=True)
root = etree.fromstring(cont, parser)
class_object_tags = root.xpath('//METADATA_INF/CLASS_INF/CLASS_OBJ')
class_object = {}
for class_object_tag in class_object_tags:
class_object_id = class_object_tag.get('id')
class_object_name = class_object_tag.get('name')
class_object_item = {
'id' : class_object_id,
'name' : class_object_name,
'objects' : {}
}
class_tags = class_object_tag.xpath('.//CLASS')
for class_tag in class_tags:
class_item = {
'code' : class_tag.get('code'),
'name' : class_tag.get('name'),
'level' : class_tag.get('level'),
'unit' : class_tag.get('unit')
}
class_object_item['objects'][class_item['code']] = class_item
class_object[class_object_id] = class_object_item
return class_object
def export_csv(api_key, stats_data_id, output_path):
"""
Exportieren Sie die angegebenen Statistiken in die CSV.
"""
writer = csv.writer(open(output_path, 'wb'),quoting=csv.QUOTE_ALL)
class_object = get_meta_data(api_key, stats_data_id)
row = []
for key in class_object:
title = class_object[key]['name']
row.append(title.encode('utf-8'))
row.append('VALUE')
writer.writerow(row)
export_statical_data(writer, api_key, stats_data_id, class_object, 1)
def main(argvs, argc):
if argc != 2:
print ("Usage #python %s api_key stats_data_id output_path" % argvs[0])
return 1
api_key = '' #Geben Sie die erhaltene API-ID ein
stats_data_id = argvs[1]
output_path = 'e-stat' + argvs[1] + '.csv'
export_csv(api_key, stats_data_id, output_path)
if __name__ == '__main__':
argvs = sys.argv
argc = len(argvs)
sys.exit(main(argvs, argc))
Anwendungsbeispiel:
python export_csv2015.py 0000030001
Ergebnis:
e-stat0000030001.csv
"Fläche / Konzentration 030002","Alter 5 Jahre Klasse A030002","Männer und Frauen A030001","Zeitachse(Jährlich)","Nationale Präfektur 030001","VALUE"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Bundesweit","117060396"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Nationale Stadt","89187409"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","National County","27872987"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Hokkaido","5575989"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Aomori","1523907"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Iwate","1421927"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Miyagi","2082320"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Akita","1256745"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Yamagata","1251917"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Fukushima","2035272"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Ibaraki","2558007"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Tochigi","1792201"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Gunma","1848562"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Saitama","5420480"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Chiba","4735424"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Tokio","11618281"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Kanagawa","6924348"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Niigata","2451357"
"Ganze Fläche","Gesamtzahl","男女Gesamtzahl","1980","Präfektur Toyama","1103459"
・
・
・
Es wird nur funktionieren, wenn es Python 2.7 ist. Wenn Sie also nur Python 3 haben, erstellen wir eine Umgebung.
Erstellen einer Python 3.x-Umgebung mit Pyenv (CentOS, Ubuntu)
Recommended Posts