今年も花粉のスギ季節がやってきました。別に花粉が飛んでるか飛んでないかなんて知ったところで症状が変わるわけではないものの、データが公開されているならばこれを取得してみようかという気になるもの。…ならない?
環境省花粉観測システムはなこさん
「はなこさん」て。。。役所もずいぶん柔らかくなったものだ。と、サイトを訪れてみたらそうでもなかった。
このサイト、国内の各観測拠点で一時間おきに計測した花粉飛散量を、2月から5月(北海道と東北は3月から)の間、毎日提供し続けます。
残念ながらAPIでデータを取り出すことはできず、csvファイルをダウンロードする形です。
Seleniumを使う
このダウンロードデータ、あらかじめリンクが用意されていないので、単純なスクレイピングでは取得することができません。
指示に従ってJavascriptがデータ生成するので、いつものcurlでは結果が読み取れません。Javascript実行環境が必要なのです!
そこでSelenium。ChromeなどのブラウザをHeadlessモード(バックグラウンド動作)で動かして、Javascriptで生成されたhtmlコードを取得しましょう。
必要なものは以下のとおり。
- ChromeやFirefoxなどのようなHeadlessモードで動くブラウザ
- ブラウザを操作するためのドライバ。Chromeならchromedriver
- pythonなどのスクリプトでブラウザ操作を記述するためのselenium
pythonのパッケージシステムpipでSeleniumを入れて、OSのパッケージシステムでchromedriverを入れると使えます。CentOSならyumね。
1 | yum install google-chrome-stable |
Chromeとchromedriverのバージョンが違うとうまく動かなかったりするので、google-chrome --version
で表示されたバージョンのchromedriverを入れると幸せになれます。
~=
はニアリーイコールね。
1 | php install chromedriver-binary~='80.0.3987' |
Pythonスクリプトを書く
Selenium自体はいろんなスクリプト言語から呼び出し可能なのですが、Pythonで呼ぶのが無難かも。ということで、新宿の飛散状況を取得するPythonスクリプト。
1 | import io,sys |
2行目のように文字コードを指定しておかないと、コードが違った場合にPythonが次のようなエラーを吐いて止まります。
1 | Traceback (most recent call last): |
それから適宜time.sleep(5)
などと待ち時間を入れておかないと、サイトが混み合っていてhtmlのレンダリングが遅れたときにエラーで止まります。ちなみにこの待ち時間を入れるためにはimport time
を指定する必要があります。
10行目でダウンロードページを開いて、12行目で新宿の観測地点を選択し、14行目でデータ表示ページを開いています。ダウンロードリンクをクリックできれば良かったのですが、うまく動かなかったのでこうなりました。
Seleniumを自動実行
先程のPythonスクリプトを定期的にcronで実行して最新の花粉飛散状況を抽出しましょう。はなこさんは毎時35分頃データを更新するので、朝7時から夜7時台まで毎時45分にSeleniumを実行します。
1 | 45 7-19 * * * python3 /home/takeru/script/kafun.py | grep -e '新宿区' | sed 's/<.[^>]*>/,/g' | cut -d ',' -f 12,14,16,18 > /tmp/kafun.csv |
こうして得たデータはこんな感じ。
1 | 新宿区役所第二分庁舎,20200201,01,4 |
tail -n 1
などで最新情報を抽出できます。phpで取るならこんな感じ。
1 | if(file_exists('/tmp/kafun.csv')){ |
このあと適当にデータを加工すれば毎時の花粉飛散状況を表示できますよ。