もくじ
COVID-19Hokkaidoデータ編①スクレイピングなどによる初期データ作成
COVID-19Hokkaidoデータ編②オープンデータ化+自動更新へ向けて←この記事だよ!
COVID-19Hokkaidoデータ編③完全自動化
①では上図V0についてまとめましたが、今回の記事はそれ以降、オープンデータポータルなど外部API活用までをまとめます。
V0での課題
V0ではデータの取得は①道ウェブサイトからのスクレイピング、②札幌市提供の静的なCSVファイルに依存していました。
これには以下のような問題があります。
- スクレイピングしたデータではなく、ちゃんとオープンデータとして公開されているデータを使いたい
- スクレイピングは、ウェブサイトのtable構造の変化に対し脆弱
- CSVファイルが更新されるたびに毎回プッシュする運用の手間
ではどうなったらラクなのかというと、上図のV1以降?となっている左下のフローが実現すればとてもラクです。
現在は(おそらく)エクセルでこさえた表形式のデータを、利用者がみやすいようにPDFなどに変換して公開していたり、HTMLに直でデータが掲載されていたり、いわゆる機械判読が困難なデータに仕上がっている状況にあります(誰でもすぐ読み取れる資料を、という意図はわかります)。今回のウェブサイトも、たとえば陽性患者データすらPDFで提供されていたらデータの収集が困難だったと思います(最低限HTMLのテーブルだったから無理やり読めた)。様々な情報を生データ(CSVなど)で、オープンデータとして配布すれば、こんな良い事があるよ、と、今回の事案で多くの方に認識されればなぁ。
という私のお気持ちが実現すれば左下のカタチになるわけです。近い将来そうなったら良いなぁ。
とか余裕ぶっこいてたらなんと2日くらいしたら実現しました。
オープンデータへの移行
北海道
北海道のデータがウェブサイトだけではなく北海道オープンデータポータルにも随時更新される事となりました。北海道の担当者がこのポータルに最新のCSVファイルを随時アップロードする仕組みです。名前のとおり、ここで公開されるデータはオープンデータで、誰でも無料でCSVデータにアクセス出来ます。
札幌市
また札幌市も同様にオープンデータのポータルサイト札幌市ICT活用プラットフォーム DATA SMART CITY SAPPOROを運営しており、窓口相談件数データなどがオープンデータとして公開されました。データの作成は北海道と同じく担当者の作業。ありがたい限りです。
ものすごいスピード感でした(こういったポータルという土壌があったからこそスムーズに移行出来たんだなぁ)。行政のイメージが覆るようなスピード感に負けじと、前回のスクリプトをオープンデータポータルに対応させる修正を行いました。
https://github.com/codeforsapporo/covid19hokkaido_scraping/tree/f3923df7f6a3781e94ef5b514c9d9ec7fe5aa4b1
※本記事執筆時点のコミットまでさかのぼっています
main.pyを実行すると、settings.pyのREMOTE_SOURCESに入力されたデータを巡回してjsonなどを吐き出すようになっています。
今回公開されたCSVデータはAPIを通してファイルにアクセス出来ますが、結局CSVデータを読み出す必要があったため、API経由のアクセスではなくリソースへの直リンクです。読み込んだCSVをdictに変換し、jsonにdumpします。
本リポジトリ上で、main.pyの実行は15分おきにスケジューリングされており、gh-pagesブランチにjson類を吐き出します。
なので、各ポータルのデータが更新されれば15分以内にはjson類にも反映されます。これらjson類には外部からCORS制限なくアクセス可能(のよう)です。つまり擬似的なAPIサーバーとして機能する訳です。
フロント側で非同期通信でそれらjson類を読み出すようになれば、データ更新の完全自動化が実現します。
※現状、json生成時にバリデーションなどがないため、完全自動化にはまだリスクが高く実装はしていません
終わりに
前回まではウェブサイトのスクレイピングと静的CSVファイルでデータをこさえていましたが、北海道、札幌市それぞれの常識が覆るスピードでのオープンデータ公開により、トップの図で示された理想的なカタチが実現しました。確かに新型コロナウイルスをきっかけとした変化ですが、そもそもポータルサイトがなければこれほどスムーズな動きにはならず、そういったサイトが作られるには地道な活動があったはずです。先人の活動に感謝しつつ、より前に進められればと思う限りです。