LoginSignup
1
2

More than 3 years have passed since last update.

【Node.js】e-Statを使った処理を考える

Last updated at Posted at 2019-10-20

はじめに

Node.jsの練習中です。空き時間をなんとか捻出して、少しでも何か作れないかと苦心しています。

今回の目的

REST APIを使って色々なデータを取得してみたいと考えています。
様々なプラットフォームからデータを得る⇨多種多様なデータ種が自分のプラットフォームに集まる⇨集まったデータを使っていろんな新しい価値に繋げる
こんな妄想をしています。

その練習として政府統計の総合窓口 e-Statから統計データを取得する実装してみます。
何か面白そうなAPIはないかと以下の記事を探して、今回のAPIを見つけました。
個人でも使える!おすすめAPI一覧

実装内容

早速ですが、以下のような実装をNode.jsで行いました。
今回は実装内容について記述をしたく、APIの仕様についてはかなり割愛します。(というかまだ勉強中)

getInfo.js
var req = require('request');
var urljoin = require('url-join');
var parser = require('fast-xml-parser');   

var url = 'https://api.e-stat.go.jp/rest/1.0/app/getStatsList';//統計表情報の取得API
var appId = 'XXXXXXXXXXXXX';//発行した個人のappId
var lang = 'ja';//言語を日本語に指定

//政府統計コード
var statsCode  = '00552010';
//クエリパラメータを結合してURL生成
var fullUrl = urljoin(url,'?appId='+appId,'?land='+lang,'?statsCode='+statsCode);
console.log(fullUrl);

var options = {
    url: fullUrl,
    method: 'GET'
}

req(options, function (error, response, body) {
    if (error) {
        console.log('Error: ' + error.message);
        return;
    }
    var xmlOption = {
        attributeNamePrefix : "",//Attribute名の先頭prefixを指定しない
        ignoreAttributes : false//XMLのattributeを取るためにはtrue
    }
    var jsonData = parser.parse(body,xmlOption);
    var listData = jsonData.GET_STATS_LIST.DATALIST_INF.LIST_INF;
    //console.log(listData);
    var spredData = listData[0];
    console.log(spredData);
    nextFunction(spredData);

})

function nextFunction(data){

    var url2 = 'https://api.e-stat.go.jp/rest/1.0/app/getStatsData';
    var statsDataId = data.id;
    var fullUrl2 = urljoin(url2,'?appId='+appId,'?land='+lang,'?statsDataId='+statsDataId);
    console.log(fullUrl2);
    var options = {
        url: fullUrl2,
        method: 'GET'
    }
    req(options, function (error, response, body) {
        if (error) {
            console.log('Error: ' + error.message);
            return;
        }
       var xmlOption = {
        attributeNamePrefix : "",//Attribute名の先頭prefixを指定しない
        ignoreAttributes : false//XMLのattributeを取るためにはtrue
        }
        var jsonData = parser.parse(body,xmlOption);
        console.log(jsonData.GET_STATS_DATA.STATISTICAL_DATA.DATA_INF.VALUE);
    })
}
  • 最初にコールするAPI(getStatsList)

    統計表の情報(表タイトルや提供省庁など)を取得するAPIです。今回は特許庁の知的財産活動調査の統計表情報を取得するため、政府統計コード(statsCode)を00552010を指定します。

  • 2回目にコールするAPI※nextFunction(getStatsData)

    上記で取得した統計表ID(statsDataId)を指定して統計データを取得します。

実装で悩んだこと

requestモジュールはオプションで下記みたいにjson:trueすることでレスポンスのjsonをパースしてくれます。

var options = {
    url: url,
    method: 'GET',
    json:true
}

e-StatのAPIは/rest/1.0/app/json/getStatsListのようにURLを指定することでJSONでレスポンスを受けれるみたいなのですが、試してみると404エラー。ここは、XMLをパースして処理してみるのもいい実践知になるかもしてないと、色々試してみることに。

XMLパースに使用したモジュール

NodeJSでXMLをパースする
これを参考にfast-xml-parserというモジュールを使いました。
インストールは下記のコマンド。

$npm install fast-xml-parser

xmlOptionを指定し、parseを実行することでJSONオブジェクトに変換され取得することができます。
あとはこれを

jsonData.GET_STATS_DATA.STATISTICAL_DATA.DATA_INF.VALUE

のようにアトリビュートをしてして値を取得していきます。

これを使ってやりたいこと

取得した統計情報を統計解析して相関を定量的に評価することで意外と面白い関係が見出せるのでは?なんて思っています。Simple Staticsという解析モジュールがNode.jsにはあるようなので、これが使えるのではないかと企んでます。とはいえ、時間がない・・・なんとか時間を捻出し次のステップを踏めればと思います。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2