42
18

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-03-19

もくじ

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

兵庫県 新型コロナウイルスまとめサイト

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

はじまり

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

私が作ったスクリプト

以下のGitHub Repositoryとして公開しています。
covid19-scraping
多分クソコードですが、starとかつけてくれると励みになります...(PRとか送って貰えるともっと嬉しいです...)
(4/9追記)コメントを追加して読みやすくしてみました。これからも参考になれば幸いです。

兵庫県のデータ公開状況

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

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

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

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

データ形式について

stop-covid19-hyogo/covid19-scrapingでは、以下のデータをそれぞれ個別に出力しています。
そして、main_summary.jsonはpdfから、それ以外はxlsxから生成しています。

(4/6追記)先述の通り、現在は全て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 入院患者数と残り病床数

(4/6追記)クラスター別の表をグラフに更新したので使うデータをclusters_summary.jsonからclusters.jsonに切りかえました。詳しくはこちらのPRをご覧下さい。

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

データ生成の自動化

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

苦労した点等

大したことでは無いですが、兵庫県の公開するExcelデータの形式がたまに変わったり、〇を使う部分で別の○が混じっていたり...そこは大変でしたが、まぁまだ対応可能であるということでずっと対応しています。
これからも、データの形式が変わる可能性があるので、出来る限り変更をしなくて済むように実装を心がけるのもそれなりに大変でした。(4/6現在、既に2度ほど形式が変わっています。)

最後に

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

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

42
18
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
42
18