【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"
<||