技術メモなど

ほぼ自分用の技術メモです。

旭川市の新型コロナワクチン接種医療機関の地図や予約受付状況を確認できるページを作りました

概要

シビックテックとして、旭川市公式ホームページに掲載されている新型コロナウイルス感染症の情報のまとめ的なサイトをやっているのですが、新たに新型コロナワクチン接種医療機関の地図や予約受付状況を確認できるページを作りました。個人による二次情報なので正確性は保証できないため、あくまで参考にしかならないものですが、引っ越してきたばかりの人とか旭川の地理に明るくない人がワクチン接種医療機関を探すのに少しでも役に立てばいいなと思っています。

3回目接種 : コロナワクチンマップ(3回目接種) | 旭川市新型コロナウイルスまとめサイト

5~11歳接種 : コロナワクチンマップ(5~11歳接種) | 旭川市新型コロナウイルスまとめサイト

1・2回目接種 : コロナワクチンマップ(1・2回目接種) | 旭川市新型コロナウイルスまとめサイト

このページの使い方

地区から探す

f:id:takeda_h:20210920182253p:plain

対象が16歳以上の医療機関と、12歳から15歳までの医療機関に分けて地区名のリストにしてますので、探したい地区のリンクにアクセスすると、その地区の医療機関の一覧と地図、取得できていれば予約受付状況を表示します。

f:id:takeda_h:20210920225216p:plain

f:id:takeda_h:20210920182945p:plain

医療機関名か、地図のポップアップのリンクにアクセスすると、医療機関の個別情報を表示します。

f:id:takeda_h:20210920183805p:plain

場所から探す

地図上のマーカーをクリックすると該当の医療機関の個別情報へのリンクがポップアップします。

f:id:takeda_h:20210920210323p:plain

このページの仕組み

ワクチン接種医療機関一覧の取得

旭川市公式ホームページの 新型コロナワクチン関連情報 | 旭川市 から 予約受付情報・予約システム接種会場 と進むと、旭川市内の新型コロナワクチン接種医療機関の一覧が掲載されています。一覧は16歳以上が対象の医療機関と、12歳から15歳までが対象の医療機関に分かれて、更に地区ごとに分かれて1ページに掲載されているので、これをPythonの定番ライブラリである BeautifulSoup を使ってデータ抽出しています。

予約受付状況の取得

現在予約受付状況はHTMLでの掲載はなく、予約受付状況・予約システム | 旭川市予約受付状況がPDFで掲載 されています。PDFファイルのスクレイピングが一般的に非常に困難なのですが、幸いなことに内容が表形式になっており、tabula-py という素晴らしいライブラリを使うことでpandas DataFrameでデータ抽出することができました。

github.com

ただ、PDFの元データがHTMLのtable要素のように構造化されているわけではないので、定期的に確認しないと内容の表の形が変わって列ずれなど意図しない形でデータ抽出してしまうことになりそうです。

位置情報の取得

旭川市公式ホームページに医療機関の位置情報までは掲載されていないので、Yahoo!ローカルサーチAPI を使って医療機関名から緯度経度を取得しています。なるべく正しい検索結果を得るため、APIのパラメータで市区町村と業種を指定してリクエストしています。それでも一部の医療機関の検索結果が0件だったため、これらの医療機関だけ手動で緯度経度を設定しました。ちなみにページのアクセスの都度取得すると無駄が多いので、クローラで旭川市公式ホームページの情報を取得するとき(後述)にまとめて緯度経度を取得し、データベースへ保存するようにしています。

医療機関と予約受付状況、位置情報の紐付けについて

旭川市公式ホームページの情報に医療機関を一意に特定するキーがあるわけじゃないため、名称のみで紐付けしています。そのため、一部予約受付状況が表示できていない医療機関があります。

地図について

leaflet というJavaScriptのライブラリを使って OpenStreetMap を表示しています。マーカーは Font Awesome で病院のアイコンを表示するようにしています。

更新スケジュール(クローリング)について

Heroku Scheduler で一定時間ごとにPython製のクローラを実行して情報を更新しています。個人が趣味で作っているものなので、元データの構造が変わって処理がコケてたら、仕事から帰ってきてから原因調べて修正して……みたいなベストエフォート運用になっています。

そのため、各情報のページの先頭には、正確な情報は 旭川市公式ホームページ を参照して欲しい旨の注意書きと、一応データの更新日時を表示するようにしています。

このページを作ったきっかけ

Code for Japan Summit 2021 Online with 東北 を視聴して、何となく自分も手を動かしたくなったため。

summit2021.code4japan.org

おわりに

どこまで続けられるか分かりませんが、自分の技術力が追いつく限りは運用していこうと思います。

ちなみにこのサイトでは他に旭川市新型コロナウイルス感染症の新規感染者数などを集計して公開しています。

f:id:takeda_h:20210920223730p:plain
こんな感じでグラフを表示したりしています。

ash-unofficial-covid19.herokuapp.com

このサイトで公開しているデータをデータソースに使ってくれているサイトがありました。

リアルタイムな地域への感染症関連情報の提供サイト Real-time Local Information Provider

こちらのサイトでは北海道ほか色んな地域の新型コロナウイルス感染状況をビジュアル化していて、そのデータソースの一つに 感染者の状況非公式オープンデータ を使ってくれていました。運用続けていて良かったと思いました。