はじめに
- 三重県版の新型コロナウイルス感染症対策サイトに関連した話です。
- 上記サイトのリポジトリ -> https://github.com/FlexiblePrintedCircuits/covid19-mie
- 今回つくったもの -> https://github.com/sakurum/covid19-mie-getdata
3/15更新:GitHub Actionsで自動更新するようにしました!
→ 定期更新・公開
もくじ
背景とか、自分について
三重県版の新型コロナウイルス感染症対策サイトの立ち上げに関わり、開発をしている者です。
鈴鹿高専の4年生です。pythonとc++は割と書けて、webは勉強中です。
アドレナリンどばどばで作業してローンチまでたどり着いてちょっと一息つけそうなので記事を書いています。疲れで変なこと書いてたらごめんなさい。
内容はとっても薄いです、大それたタイトルつけてごめんなさい…
立ち上げに関しては以下のツイート等をご覧ください。
ついに!!!
— フレキシブル基板💤@朝のうちにreports (@FPC_COMMUNITY) March 13, 2020
「三重県版」新型コロナウイルス感染症 対策サイト立ち上げ完了致しました!!
県内の高専生4人で開発しましたが、起案からなんと1日でローンチすることができました。本当に、開発メンバーに感謝です。https://t.co/Qti5m92HPd
このサイトを運営していくにあたって、情報を三重県の公式Webサイトからとってくる必要があるのですが、初ローンチの段階では情報収集もpushも人力でした。
手打ちの情報収集は非常に面倒なので、とりあえず収集だけ自動化することにしました。
つくったもの
ソースはここに -> https://github.com/sakurum/covid19-mie-getdata
三重県Webサイトからデータをスクレイピングで取得し、jsonに整形。
それを、GitHub Pagesで公開するものをつくりました。
実装
処理の簡単な流れは、
1. 三重県の公式WebサイトからBeautifulSoup(pythonのライブラリ)でデータを抜き出す
2. 日時をdatetimeに変換、データを整形
3. jsonに書き出せるように辞書型に整形
4. 書き出す
5. 1~4を6時間に一度、GitHub Actionsで定期実行、GitHub Pagesに公開
という感じです。
スクレイピング
BeautifulSoupを用いました。
初めて触ったのですが、さくっとできてびっくりしました。
新型コロナウイルス対応ということで行政データも形式がころころ変わる恐れがあり、なるべくそれに対応できるような処理を心がけました。
(文字列 -> datetime -> 文字列とか)
定期更新・公開
主に、COVID-19 Hokkaidoの開発者さんの記事を参考にさせていただきました。
→ COVID-19Hokkaidoデータ編②オープンデータ化+自動更新へ向けて
ワークフローのプログラムもほぼ同じものです。
取得したデータも、同様にGitHub Pagesで以下のリンクから参照できるようにしています。
(現状では一部の項目の収集を実装しておらず、完全ではありません。)
- data.json
- news.json
上記リンクの記事より
本リポジトリ上で、main.pyの実行は15分おきにスケジューリングされており、gh-pagesブランチにjson類を吐き出します。
なので、各ポータルのデータが更新されれば15分以内にはjson類にも反映されます。これらjson類には外部からCORS制限なくアクセス可能(のよう)です。つまり擬似的なAPIサーバーとして機能する訳です。
フロント側で非同期通信でそれらjson類を読み出すようになれば、データ更新の完全自動化が実現します。
とあります。
現状では、data.jsonに含まれる全てのデータをスクレイピングによって取得している訳ではなく、一部はまだ人力であるため、完全自動化はできません。
しかし今後、県との連携強化等を行い、情報収集の効率を高めていく予定です。
悩んだところ、大変だったところ
全角半角、空白の処理
スクレイピング先の三重県のWebサイトにある表が、全角数字+単位つき+時々空白が入っている というなかなか挑戦的な様式だったので、その文字列の処理が大変でした。
全角文字を半角にしてくれうるjaconvというパッケージがあったので使ってみたのですが、うまくできなかったので(原因究明の体力がなかった..)、【Python】一行で全角と半角を相互変換する(英字+数字+記号)を参考にそのまま書きました。
# 全角 to 半角
text = text.translate(str.maketrans({chr(0xFF01 + i): chr(0x21 + i) for i in range(94)}))
謎の空白は replace(" ","").replace(" ","")
で半角全角の両方を消しました。
日時(datetime)と文字列の変換
webの情報 -> jsonにするなら、日時のデータは全て文字列で扱っても良いのですが、今後三重県の情報のオープンデータ化などがなされるかもしれないので、一応、内部ではdatetimeに変換して処理することにしました。
datetimeを触るのは初めてだったので最初は頭をつかったけれど、案外やさしかったです。
# 文字列 to datetime
date_str = str(data[0].replace("月", "/").replace("日", ""))
data[0] = datetime.datetime.strptime("2020/"+date_str, "%Y/%m/%d")
参考:Pythonのdatetimeで日付や時間と文字列を変換(strftime, strptime)
USTとJST
意外な落とし穴になったのがこれでした。
このプログラムに直接関わるわけではないのですが、ここで書き出すjsonを読み込む側が、このjsonを全てUSTとして読み込む仕様でした。
そのため、三重県Webサイトの日時(JST)を、UST +09:00の日時として出力する必要がありました。
処理自体はとても簡単
# datetime to 文字列 (JST対応)
datestr = date.strftime("%Y-%m-%dT%18:%M:%S+09:00")
(dateとdataの間違い)
このミスを8回くらいやらかしました。
気をつけたい(小並感)
願望
現在、新型コロナウイルス感染症 covid19対策サイトは都道府県別に各地で作成されており、多くは東京都のものをForkしたサイトなのですが、データのスクレイピングに関してはかなりばらばらです。
これはもちろん、オープンデータの有無、都道府県ごとのデータ形式など差異があるからなのですが、(めっちゃ面倒なので)統一されたら本当に楽になると思っています。
このcovid19対策サイトの各地への広まりが、行政へのオープンデータ化、情報の形式の統一のきっかけになってほしいと強く思います。
開発チームからも、行政への働きかけを行っていきます。
P.S.
covid19対策サイト 三重県版の充実にもぜひご期待ください!
貢献していただけたら大変うれしいです。