今回は、 Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]の第3章を参考にさせていただきながら、urllib.request+jsonで、Web上から、JSONファイルをダウンロードして解析後、要素を出力できるようになりました。
Docker上に構築した開発環境で実行しています。
Dockerでの開発環境の構築については、過去記事をご参照ください。
では、振り返っていきたいと思います。
JSONは、JavaScript Object Notationの略でデータ形式の一種です。「JavaScript」と名前に入っていますが、JavaScript専用ということではなく、pythonでも使えます。 記載方法については、Pythonと似ていて、数値や文字列だけでなく、リスト型や辞書型も使えます。 例:{'価格': {'大根': 122, '人参': 130, '白菜': 240}, '日付': '2020-05-04'} 今回は、XMLファイルの例として、京都市のオープンデータポータルサイトから、JSONファイルをダウンロードして使いました。 URL【https://data.city.kyoto.lg.jp/riyou/api】 この、APIからJSONファイルをダウンロードして、解析を行った後、ランダムに施設名を出力するコードを作っていきます。 コード全体は以下の通りで、「json-asset.py」に保存しました。 import urllib.request as req #①JSONファイルをダウンロード #➁JSONファイルを解析 #③ランダムに施設名称を出力 records = data['result']['records'] では、コードを順番に見ていきます。 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' なお、URLに指定している、各パラメータは以下を意味しています。 resource_id 文字列型 検索するリソースのID番号 limit 整数値型 取得するデータの最大行数。今回は20行を指定 offset 整数値型 データ取得を開始する行。今回は5行目を指定 fields 文字列型 取得するフィールドを指定。今回は「name」、「address」を指定して、設備名称と住所を取得 保存したJSONファイルを読み込んで、JSONを解析します。 openするときに、encordingで文字コード「utf-8」を指定します。文字コードが違っていると文字化けしてしまうので、ダウンロード元の情報を確認して、適切な文字コードを指定する必要があります。 s = open(savename, 'r', encoding='utf-8') 次に、json.load()メソッドでJSONを解析した結果をdataに格納します。 data = json.load(s) では、解析された結果「data」を使って各要素を取得していきます。 今回のJSONファイルの内容は以下の通りです。 最初の階層のうち、'result'の中の、'records'を取り出します。'records'は、大括弧で囲まれているので、リスト型として扱えます。 records = data['result']['records'] random.choice()メソッドを利用して、'records'のリストから、任意のレコードを抽出します。このレコード 'r' は中括弧で囲まれているので、辞書型として扱えます。 r=random.choice(records) 抽出したレコードの'name'を出力します。 print(r['name']) 先ほど作成したファイルを実行してみます。 python3 json-asset.py 以下の通り、JSONファイルを取得・解析して、ランダムに施設名を出力できました! これで、Web上に公開されているJSON形式のデータについても、巡回して取得できるようになりました。 このほかにも、いろいろな形式で公開されているデータがあるので、順次、使えるようになっていきたいです。 次回以降も、Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]で、スクレイピングと機械学習開発に取り組んでいきたいと思います。 【過去記事】 2019年8月31日(土)にE資格を受験して、合格しました! E資格対策として勉強の進め方や、参考書などをまとめました。 これから受験される方がいらっしゃいましたらご参考まで。 2019年3月9日(土)にG検定を受験し、見事合格できました! 受験の体験記や勉強法などを別のブログにまとめました。 これから受験される方がいらっしゃいましたらご参考まで。 【E資格対策に使った参考書】 JSONを解析して要素を出力する。
1.JSONとは何か
2.全体像
import os.path,random
import 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)
s = open(savename, 'r', encoding='utf-8')
data = json.load(s)
r=random.choice(records)
print(r['name'])3.JSONファイルをダウンロード
savename = 'kyoto.json'
if not os.path.exists(savename):
req.urlretrieve(url, savename)
(必須)
[f14b57c2-48dd-4aa7-b754-a4f4ac340f2d]は、京都市の施設情報(平成28年11月9日現在)のリソースのID番号
(任意)
(任意)
(任意)
4. JSONを解析する
5.ランダムに施設名称を出力
6.コマンドラインから実行してみる。