2022年8月6日土曜日

青果物市況情報を JSON 形式で取得する Web API を作りました。

青果物市況情報は農林水産省が公開しています。しかしながら、URL や HTML の構造等により若干扱いづらいのですよね(機械にとって)。そのため、スプレッドシートで直接読み込むというようなことはできません。

また、国外のサーバーからのアクセスはブロックされるようで、GAS (Google Apps Script) での利用もできません。

今回はそうした扱いづらさをなんとか突破し、公開データの中にある救いの CSV を利用して、より使いやすいように JSON 形式でデータを取得できる Web API を作ってみました。

同様に JSON 形式で青果物市況情報を取得できるサービスには WAGRI があります。ただし、データ利用には40,000円/月の利用料金がかかります(青果物市況情報以外にもデータはたくさんあります)。また、説明を読むに基本的には農家が個人で使うという想定はされていないようです。


以下、今回作成した青果物市況情報 Web API の説明です。

https://api.cultivationdata.net/mcdata?mc=値1&cat=値2

パラメーターやキーの説明はこちら → 青果物市況情報API説明書

-----
・追記(2022-8-13)

一部休市日のデータ取得の不具合を修正しました。パラメーターの仕様が変更になりました。
-----

市場ごとの野菜 or 果実のデータを JSON 形式で取得できます。例えば、「盛岡市中央卸売市場」の「野菜」であれば、パラメーター1の市場 (mc) が「03300」、パラメーター2の種別 (cat) が「v」となります。


取得できる JSON はこのような感じになります。



国外サーバーからのアクセスもできますので、GAS 等での利用も可能です。

現状、最新データの取得のみ対応しています。更新は15時頃です。

エラー回避のため、本来は値が数値になる部分を含め全て文字列として扱っています。

今後、日付を遡れるようにしたり、JSON の構造を見直したりしていこうと思っています。その辺は随時 cultivationdata.net 上でやっていきます。


***

ここからは作ってみての感想等々。

農林水産省の青果物市況情報が公開されているページの URL は「.do」という拡張子になっており、これは Java による Web アプリケーションとのこと。裏でいろいろと処理をしているということですね。なのでスプレッドシートの IMPORTXML 関数で素直に値を取得するといったことが(たぶん)できません。

そこで GAS(Google Apps Script) を使ってページの遷移を追いかけデータを取得しようと試みたところ、

"The Amazon CloudFront distribution is configured to block access from your country."(Amazon CloudFront ディストリビューションは、あなたの国からのアクセスをブロックするように設定されています)

というメッセージが出て弾かれました。おそらく、国内からしかアクセスできないようになっているのですね。GAS は Google のサービスですので、確認していませんがサーバーは米国ですかね。

ならばと Google Cloud Functions(GCP) でリージョンを東京に設定。Python でスクリプトを作り再度アクセスするも……またもやだめ。

なぜ……?と思って調べみると、


こういうことらしいです。根本的選択ミス。

かくなる上は、Raspberry Pi で自宅サーバーをたてるか、Amazon Lambda(AWS) か、さくらの VPS か……と、コストや学習にかかる時間を勘案しつつあれこれ検討していたところ、WebARENA Indigo という安価で使い方も簡単そうな VPS を発見。

インスタンスの料金(Linux)は、メモリ 1GB、1vCPU、SSD 20GB で1時間あたり0.55円(税込)、月で349円(税込)です。

このサービスの存在を一切知らなかったのですが、運営会社は NTTPCコミュニケーションズ という会社で、NTTコミュニケーションズの子会社でした。サーバーの設置場所は東京。大丈夫そう。早速契約。

Web API は、ネット上に参考になる情報がけっこうあった Flask + uWSGI + Nginx で作成。ここの設定で2日くらいエラーにはまったのですが、分かってしまえば本当に何てことのない原因で……動けばいいやと雰囲気で作っているとこういうことになるのですよねぇ。

何はともあれ、そんなこんなで無事に動かすことができたのでよかったです。この Web API を通すことで国外のサーバーからでもデータの取得が可能です。

しばらく様子を見て、調子が良さそうなら Heroku で動かしている気象データの Web API も移そうかと思っています。


今後も農家がデータを活用しやすいような環境をコツコツ作っていきます。


・関連投稿




Twitter (@nkkmd) 日々更新中です。