covid19-hyogo向けのデータを取得して生成するまで完全自動化したお話

#もくじ
[1.はじまり](#はじまり)
[2.私が作ったスクリプト](#私が作ったスクリプト)
[3.兵庫県のデータ公開状況](#兵庫県のデータ公開状況)
[4.データ形式について](#データ形式について)
[5.データ生成の自動化](データ生成の自動化)
[6.苦労した点等](#苦労した点等)
[7.最後に](#最後に)

##兵庫県 新型コロナウイルスまとめサイト
兵庫県にお住まいの方は、ぜひこれから参考にしていただければ幸いです。(これからもUIの改善等アップデートをしていく所存です。)
https://stop-covid19-hyogo.org

#はじまり
東京都が[新型コロナウイルス対策サイト](https://stopcovid19.metro.tokyo.lg.jp/)をオープンソースで立ち上げた話は有名です。そして、Twitterを見ていると、三重県の高専生が4人でサイトを立ち上げたという話を見て、私も自分の住む兵庫県向けにサイトを立ち上げてみよう...と思っていたら既に他の方が作成を開始していたので、コントリビュートを始めたのがきっかけです。そして、Web開発経験のほとんどない私はデータ周りの処理に回ったのでした...(なお、4/6現在バリバリグラフの改善をしているという...)

#私が作ったスクリプト
以下のGitHub Repositoryとして公開しています。
[covid19-scraping](https://github.com/stop-covid19-hyogo/covid19-scraping)
多分クソコードですが、starとかつけてくれると励みになります...(PRとか送って貰えるともっと嬉しいです...)
<font color="red">(4/9追記)</font>コメントを追加して読みやすくしてみました。これからも参考になれば幸いです。

#兵庫県のデータ公開状況
兵庫県、データの公開状況に関しては優秀な方で、サイトを作るにあたってとても有用な情報を公開してくれていました。
しかも、幸いなことにデータはxlsx(Excelファイル)~~やpdf~~として公開されているので、なんとかPythonだけでデータの取得から整形まで行うことが出来ました。<font color="red">(4/6現在、全てのデータがExcelで公開されており、オープンデータとしてCC-BYでライセンスされています)</font>
兵庫県版のスクレイピングプログラムのフローは以下の通りです。

1. 兵庫県のデータ公開サイト([ここ](https://web.pref.hyogo.lg.jp/kk03/corona_hasseijyokyo.html)~~と[ここ](https://web.pref.hyogo.lg.jp/kf16/singatakoronakensa.html)~~)をBeautifulSoup4でスクレイピングし、必要なxlsxファイル~~とpdfファイル~~の公開リンクを取得してダウンロード。(日にちによって公開されているファイル名が違うため、ファイルパスを固定すると完全自動化出来ないため。)  
  <font color="red">(4/6追記)</font>さらに、[兵庫県オープンデータカタログサイト](http://open-data.pref.hyogo.lg.jp)に掲載されているデータはxlsxの公開パスが固定されているので、直接ダウンロード。
2. xlsx ~~とpdf~~を取得出来たら、必要なデータを取り出す。~~(pdf解析に関しては明石高専の方にご協力いただきました。ご協力感謝します。)~~  
  <font color="red">(4/6追記)</font>pdfは使わなくなったのでせっかく協力していただきましたが、現在使用されていません...
3. jsonに整形し、出力。
4. 1～3をGitHub Actionsを用いて定期実行([covid19hokkaido_scraping](https://github.com/codeforsapporo/covid19hokkaido_scraping/)を参考にさせて頂きました。素晴らしいコードの公開、共有に感謝します。)

HTMLスクレイピングを初めてしたですが、割と簡単に出来たのでBeautifulSoupオススメだなぁと思います。
東京都版にある、コールセンターなどへの相談件数は公開されていないため取得できませんが、それ以外の情報は全て取得できる状態にあったので、完全自動化を行うことが出来ました。

Pythonスクリプトに関しては完全にオリジナルです。(スクリプトの書き方は[Electrum](https://github.com/spesmilo/electrum)と呼ばれる暗号通貨ウォレットに影響されていたり...)また、他の都道府県では作成していないデータに関しても作成するようにしています。(詳しくは次章のデータ形式について、でお話します。)
GitHub Actionsに関してはフローの4番目の通り、北海道のものを参考にさせていただきました。

#データ形式について
[stop-covid19-hyogo/covid19-scraping](https://github.com/stop-covid19-hyogo/covid19-scraping)では、以下のデータをそれぞれ個別に出力しています。
~~そして、`main_summary.json`はpdfから、それ以外はxlsxから生成しています。~~  
<font color="red">(4/6追記)</font>先述の通り、現在は全てxlsxから生成しています。  
data.jsonにまとめるのではなく、分けることで保守性を向上させています。

|ファイル名|データの詳細|
|---|---|
|main_summary.json|検査状況/患者状況の総まとめ|
|patients.json|患者についての情報|
|patients_summary.json|日別患者数|
|inspections.json|PCR検査数(ページでは未使用のデータ)|
|inspections_summary.json|PCR検査の総合計等|
|last_update.json|データの最終更新日|

以上が東京都版で使われていて、兵庫県版でも使っているデータです。そして、以下が私が独自に生成したデータです。

|ファイル名|データの詳細|
|---|---|
|clusters.json|日別のクラスター別患者数~~(ページでは未使用のデータ)~~|
|clusters_summary.json|クラスター別の総患者数(ページでは未使用のデータ)|
|age.json|年代別の総患者数|
|age_summary.json|日別の年代別総患者数(ページでは未使用のデータ)|
|(3/20追加)||
|sickbeds_summary.json|入院患者数と残り病床数|
<font color="red">(4/6追記)</font>クラスター別の表をグラフに更新したので使うデータを`clusters_summary.json`から`clusters.json`に切りかえました。詳しくは[こちらのPR](https://github.com/stop-covid19-hyogo/covid19/pull/208)をご覧下さい。

独自に生成したデータは、よりわかりやすく情報を届けるための可視化に用いられています。(ちなみに独自データは、形式の決定からUIの反映まで全部1人でこなしました)

#データ生成の自動化
兵庫県のデータ公開方法がそれなりによかったために、スムーズに自動でデータ取得から生成(整形)まで可能になりました。
[兵庫県のデータ公開状況](#兵庫県のデータ公開状況)でも書きましたが、北海道の方のRepositoryを参考にGitHub Actionsでデータの生成を1時間おきに自動化させました。

#苦労した点等
大したことでは無いですが、[兵庫県の公開するExcelデータの形式がたまに変わったり](https://qiita.com/Inadati/items/30af762849ab11625ee7#%E3%81%A8%E3%81%93%E3%82%8D%E3%81%8C%E6%AE%8B%E5%BF%B5%E3%81%AA%E3%81%8C%E3%82%89)、〇を使う部分で別の○が混じっていたり...そこは大変でしたが、まぁまだ対応可能であるということでずっと対応しています。
これからも、データの形式が変わる可能性があるので、出来る限り変更をしなくて済むように実装を心がけるのもそれなりに大変でした。(4/6現在、既に2度ほど形式が変わっています。)

#最後に
チームリーダーにスーパーコントリビュータ高校生と呼ばれるほどになってしまったわけなんですが...
まぁこれからも無理のない範囲で自分の住む県に貢献出来たらと思います。

P.S.
高2になりました。これからも精進していきます。