俺人〜OREGIN〜俺、バカだから人工知能に代わりに頑張ってもらうまでのお話

俺って、おバカさんなので、とっても優秀な人工知能を作って代わりに頑張ってもらうことにしました。世界の端っこでおバカな俺が夢の達成に向けてチマチマ頑張る、そんな小さなお話です。現在はG検定、E資格に合格し、KaggleやProbSpaceのコンペに参画しながら、Pythonや機械学習、統計学、Dockerなどの勉強中です。学習したことをブログにアウトプットすることで、自分の身に着けていきたいと思います。まだまだ道半ばですが、お時間がありましたら見て行ってください。

JSONを解析して要素を出力(Pythonによるスクレイピング&機械学習テクニック)

今回は、 Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]の第3章を参考にさせていただきながら、urllib.request+jsonで、Web上から、JSONファイルをダウンロードして解析後、要素を出力できるようになりました。

Docker上に構築した開発環境で実行しています。

Dockerでの開発環境の構築については、過去記事をご参照ください。

oregin-ai.hatenablog.com

では、振り返っていきたいと思います。

JSONを解析して要素を出力する。

1.JSONとは何か

JSONは、JavaScript Object Notationの略でデータ形式の一種です。「JavaScript」と名前に入っていますが、JavaScript専用ということではなく、pythonでも使えます。

記載方法については、Pythonと似ていて、数値や文字列だけでなく、リスト型や辞書型も使えます。

例:{'価格': {'大根': 122, '人参': 130, '白菜': 240}, '日付': '2020-05-04'}  

2.全体像

今回は、XMLファイルの例として、京都市のオープンデータポータルサイトから、JSONファイルをダウンロードして使いました。

URL【https://data.city.kyoto.lg.jp/riyou/api

この、APIからJSONファイルをダウンロードして、解析を行った後、ランダムに施設名を出力するコードを作っていきます。

コード全体は以下の通りで、「json-asset.py」に保存しました。

import urllib.request as req
import os.path,random
import json

 

#①JSONファイルをダウンロード
url = 'https://data.city.kyoto.lg.jp/API/action/datastore/search.json?resource_id=f14b57c2-48dd-4aa7-b754-a4f4ac340f2d&limit=20&offset=5&fields=name,address'
savename = 'kyoto.json'
if not os.path.exists(savename):
    req.urlretrieve(url, savename)

 

#➁JSONファイルを解析
s = open(savename, 'r', encoding='utf-8')
data = json.load(s)
 

#③ランダムに施設名称を出力

records = data['result']['records']
r=random.choice(records)
print(r['name'])

 

では、コードを順番に見ていきます。

3.JSONファイルをダウンロード

urllib.request(import時にreqに設定)を使って、京都市京都市の施設情報(平成28年11月9日現在)のJSONファイルをダウンロードして、「kyoto.json」に保存します。

サーバに負荷をかけないように、ダウンロードしたファイルが存在したら新たにダウンロードしないようにします。

url = 'https://data.city.kyoto.lg.jp/API/action/datastore/search.json?resource_id=f14b57c2-48dd-4aa7-b754-a4f4ac340f2d&limit=20&offset=5&fields=name,address'
savename = 'kyoto.json'
if not os.path.exists(savename):
    req.urlretrieve(url, savename)

なお、URLに指定している、各パラメータは以下を意味しています。

resource_id
(必須)

文字列型

検索するリソースのID番号
[f14b57c2-48dd-4aa7-b754-a4f4ac340f2d]は、京都市の施設情報(平成28年11月9日現在)のリソースのID番号

limit
(任意)

整数値型

取得するデータの最大行数。今回は20行を指定

offset
(任意)

整数値型

データ取得を開始する行。今回は5行目を指定

fields
(任意)

文字列型

取得するフィールドを指定。今回は「name」、「address」を指定して、設備名称と住所を取得


4. JSONを解析する

保存したJSONファイルを読み込んで、JSONを解析します。

openするときに、encordingで文字コードutf-8」を指定します。文字コードが違っていると文字化けしてしまうので、ダウンロード元の情報を確認して、適切な文字コードを指定する必要があります。

s = open(savename, 'r', encoding='utf-8') 

 次に、json.load()メソッドでJSONを解析した結果をdataに格納します。

data = json.load(s)

 

5.ランダムに施設名称を出力

では、解析された結果「data」を使って各要素を取得していきます。

今回のJSONファイルの内容は以下の通りです。

f:id:kanriyou_h004:20200504162046p:plain

図1.JSONファイルの内容

最初の階層のうち、'result'の中の、'records'を取り出します。'records'は、大括弧で囲まれているので、リスト型として扱えます。

records = data['result']['records']

random.choice()メソッドを利用して、'records'のリストから、任意のレコードを抽出します。このレコード 'r' は中括弧で囲まれているので、辞書型として扱えます。

 r=random.choice(records)

抽出したレコードの'name'を出力します。

print(r['name'])

6.コマンドラインから実行してみる。

先ほど作成したファイルを実行してみます。

python3 json-asset.py

以下の通り、JSONファイルを取得・解析して、ランダムに施設名を出力できました!

f:id:kanriyou_h004:20200504163148p:plain

図2.コマンドラインから実行

これで、Web上に公開されているJSON形式のデータについても、巡回して取得できるようになりました。

このほかにも、いろいろな形式で公開されているデータがあるので、順次、使えるようになっていきたいです。

 

次回以降も、Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]で、スクレイピング機械学習開発に取り組んでいきたいと思います。

 

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】