jsonの負荷テストを実施したいので、大きなjsonデータを集めたくなり、世の中の無料で使えるWEB-APIからデータを吸い出してみたいと思います。
今回は、「GeoAPI」tというサイトから都道府県情報と市区町村情報を一気に抜き出してみます。
郵便番号や、GPSの座標値などもついているので、アプリを作るときなどに流用できるAPIです。
APIサービス紹介「HeartRails Geo API」
http://geoapi.heartrails.com/
「HeartRails Geo API」 は、郵便番号/住所/緯度経度データ等の地理情報を、XML、JSON(P) 形式の API により無料でご提供させていただくサービスです。この API をご利用になることにより、お客様側ではサーバーサイドの処理を実装することなく、サンプルのようなアプリケーションを簡単に開発することができます。
(ジオコーディング、逆ジオコーディングにも対応しております。)
1日に10万アクセス以上は有料になるそうです。
APIからのデータダウンロードは2段階
APIのリクエストマニュアルはサイトを見ると非常にわかりやすく書かれています。
今回は都道府県別の市区町村情報を取得したいので、まずは「都道府県一覧」を取得します。
$ wget -q -O - http://geoapi.heartrails.com/api/json?method=getPrefectures | jq "."
>>
"prefecture": [
"北海道",
"青森県",
"岩手県",
...
ちゃんと47都道府県が格納されていることが確認できます。
ちなみに、ここでjqコマンドを使っているのは、wgetやcurlだけでデータをダウンロードすると、2バイト文字がエスケープ化されてしまうので、便利にコンバートしてくれるjqコマンドを通しています。
これをこのままファイルに保存しておいて便利に使ってもいいのですが、得られた情報を元にそのまま都道府県情報をゲットしてしまいましょう。
まずは、都道府県別に市区町村情報を取得してみましょう。
※サンプルは「東京都」を取得しています。(結果は抜粋しています)
$ wget -q -O - http://geoapi.heartrails.com/api/json?method=getTowns\&prefecture=%E6%9D%B1%E4%BA%AC%E9%83%BD | jq "."
>>
{
"response": {
"location": [
{
"city": "八王子市",
"city_kana": "はちおうじし",
"town": "西寺方町",
"town_kana": "にしてらかたまち",
"x": "139.272318",
"y": "35.68372",
"prefecture": "東京都",
"postal": "1920153"
},
...
このコマンドを実行するときのポイントは、urlにクエリが複数ついているときの"&"文字列は、shellコマンドが誤認識してしまうので、必ずエスケープ処理をしてあげましょう。
※バックスラッシュを手前に入れます。
そして、都道府県と同じようにjqコマンドで文字を整えます。
最後に、これらの情報を一気に出力するためのコマンドが以下になります。
$ wget -q -O - http://geoapi.heartrails.com/api/json?method=getPrefectures | jq -r ".response.prefecture[]" | xargs -I{} wget -q -O - http://geoapi.heartrails.com/api/json?method=getTowns\&prefecture={} | jq -c "." > prefecture.json
今回は何度もAPIにアクセスしなくていいように、ファイルに出力しておきます。
中身は実行して各自で確かめてみてください。
使いやすいデータ形式に変換
このままjsonファイルとして使っても問題ないのですが、jsonファイルをテキストで見ると非常に改行数が増えてしまうので、json-multi形式の1市区町村についき、1行というログ形式に変換してみたいと思います。
jq -sc '.[].response.location[] | {"prefecture":.prefecture,"city":.city,"town":.town,"postal":.postal,"city_kana":.city_kana,"town_kana":.town_kana,"x":.x,"y":.y}' prefecture.json > cities.json
>>
{"prefecture":"北海道","city":"札幌市白石区","town":"菊水元町一条四丁目","postal":"0030821","city_kana":"さっぽろししろいしく","town_kana":"きくすいもとまち1じょう4ちょうめ","x":"141.400204","y":"43.064159"}
{"prefecture":"北海道","city":"札幌市白石区","town":"菊水元町一条五丁目","postal":"0030821","city_kana":"さっぽろししろいしく","town_kana":"きくすいもとまち1じょう5ちょうめ","x":"141.40231","y":"43.062897"}
{"prefecture":"北海道","city":"札幌市白石区","town":"菊水元町九条一丁目","postal":"0030829","city_kana":"さっぽろししろいしく","town_kana":"きくすいもとまち9じょう1ちょうめ","x":"141.414374","y":"43.076972"}
{"prefecture":"北海道","city":"札幌市白石区","town":"菊水元町九条二丁目","postal":"0030829","city_kana":"さっぽろししろいしく","town_kana":"きくすいもとまち9じょう2ちょうめ","x":"141.415081","y":"43.073164"}
{"prefecture":"北海道","city":"札幌市白石区","town":"菊水元町五条一丁目","postal":"0030825","city_kana":"さっぽろししろいしく","town_kana":"きくすいもとまち5じょう1ちょうめ","x":"141.405531","y":"43.072053"}
...
上記コマンドを1行実行するだけで、きちんと情報をそのままで都道府県、市区町村一覧データが作成できます。
データの行数は"18,800"ありました。
本当は一覧でデータ取得せずに、都度APIを実行して情報を取得するのが一般的なので、くれぐれもサーバー負荷を多大に掛けるという行為は行わないようにしましょう。
せっかく無料で公開してくれているサービス提供者には、感謝する気持ちでいなければいけませんね。
0 件のコメント:
コメントを投稿