4月くらいから粛々と継続している京都のコロナ感染者数アプリですが、再びデータの変更に対応するアップデートを行いました。
京都のデータは一件ずつ詳細が公表されており、その点は非常に良いのですが、その公表方法が時折変えられるという点で対応が必要となるというのがなんだかなぁという感じです。
以前は、htmlのテーブルで複数ページに渡ってデータが公表されていました。そのため、URLが作られるたびにそれに対応してデータを拾わないといけなかったため、面倒この上ありませんでした。でも、データは色々詳しかったです。
次に、1ページに回復テーブルと入院・療養テーブルの2つが表示される形式となりました。死亡などのデータはなくなったものの、これは他ページから取得で対応しました。経過やクラスタなどの詳細なデータはなくなったのは残念でしたが、まぁ1ページでデータの取得ができるというので、管理が楽になりました。
しかし最近の更新で、1ページに収められていたデータの1部がPDFでの管理となりました・・・。まぁ簡単に取れるんですけど、あんまりやりたくないんですよね・・pdfからのデータ生成・・・。下の記事では簡単だよ!みたいに書きましたが、実際は目に感じられないコラムのずれとか増加とか、そういうのの例外処理をたくさんしないといけない地獄がある・・・
現在の京都府のページは次のようになっています。これをどう使ってページを作っているのか・・・次の更新用にメモしておきます。
ちなみに作成しているアプリの全体像は次のような感じです。全体が見れるように縮小して表示していますが、実際のアプリケーションではちゃんと見えてる(はず)。
テーブルデータの読み込み
京都府のページはテーブルでデータを表示しています。
こういうのってとるの大変やん・・・って思いますよね。安心してください。pandasのread_html関数を使うと簡単です。read_html関数はhtmlのテーブルを取得する関数です。URLを指定することにより、テーブルをリストで取得します。テーブル自体をデータフレームで使いたい場合、番号で指定します。
import pandas as pd tables = pd.read_html(URL) table_zero = tables[0]
pandasの使い方なんかは、Jupyter本が新しくなって帰ってくるようなのでそれをチェックしましょう。
実際の処理はcolabにあります。
さて、これまではこれだけでよかったんですよねぇ・・・次はpdfが加わったために追加した処理です。
pdfに含まれる件数を取得する
現在のところ、pdfには退院・回復・死亡のデータの一部が置かれています。pdfに関するデータは表の下にリンクがあります。これによると現時点では410件がpdfに移されているようです。
つまり、表示されているテーブルに個々の件数410件を合算すると、京都の総感染者の件数になるはずです。(入院・療養者数+退院・回復・死亡(テーブル表示+pdfデータ))。これをガチャっとしてデータを作りたいところですが、先ほど書いたようによくわからないエラーの発生源となるため、できるだけ避けたいところということで、件数のみを取得することとします。
このような場合、ウェブページからデータを取得します。pdfに格納されているデータ数はリンクの文章にあるために、ここから取得しています。データの取得にはrequests_htmlを使っています。
from requests_html import HTMLSession session = HTMLSession() r = session.get(URL) data = r.html.find('ul') data[6].text
処理は雑に書くと上のようになっています。 実際のコードは先ほどのコラボにあります。
まとめ
てな感じで、少々手抜きをしながら、アプリケーションを現状に対応しました。まぁ何と言いますか、とりあえずcsvでくれって感じですかね・・・テーブルやpdfを作るほうが手がかかると思うのですが・・・。
あと、この記事を作成しながら、ウェブページの集計数と実際のテーブル数があっていなかったり、出ている件数と実際の件数が異なっていたりするのを発見して、どうなっているのかと思ってデータを確認したら、再発のひとは件数と数えないなどのルールっぽいのが見えてきて、それはまた次に対応しようかなぁと思わされますが、pdfの中身は見ないようにしていると、そのうち問題になりそうなので…遠い目になるという感じです。 いや~・・・この資料を作成されている方は大変でしょうね。
データ作成されている方々に敬意を表してこの記事を終えたいと思います。