COVID-19 各日データの集計を自動化してみた(データ抽出編)
「国・地域の感染状況」を集計するプログラムを例に集計の自動化をどのように実現するのかをお話ししていきます
本記事では3つに分けた段階のうち2番目の、取得したホームページからの情報の抽出を説明します
各日データページの構成
各日のデータが記載されている「新型コロナウイルス感染症の現在の状況と厚生労働省の対応について...」のページは、以下のような構成になっています
1.国内の状況について
PCR検査実施人数や陽性者数が記載されています
2.クルーズ船「ダイヤモンド・プリンセス」について
2月に到着したダイヤモンドプリンセス号の状況が記載されています
3.国民の皆様へのメッセージ
国民向けの感染症対策や感染時の対応方法が記載されています
4.国外の発生状況について
各国・地域ごとの感染者・死亡者数が記載されています
今回必要な情報は「国・地域の感染状況」なので、「各国・地域ごとの感染者・死亡者数」の情報だけを抽出します
情報抽出の方針
ホームページは「HTML」と呼ばれる特別な書き方で書かれたテキストになっています
Chromeブラウザをお使いの場合は、右クリックで以下のメニューを
Firefoxブラウザをお使いの場合も、右クリックで以下のメニューで「HTML」を見ることができます
このテキストは一定のルールに従って書かれているので、コンピューターで処理しやすい形になっています
つまり、プログラムで目的の情報をひっぱってこれます
自分で1からプログラムを書くこともできますが(多分…)、今回は他の方が作ってくれた優秀なプログラム「cheerio」を使わせていただきます
(他の人に利用可能なプログラムの形態を「ライブラリ」と言います)
「cheerio」を使うメリット・デメリット
メリット
- 「Node-RED」と組み合わせられる
- 既に色々なところで使われている
- "使い方"を学ぶことで他のライブラリを使う際にも応用が利く(多分)
デメリット
- 文章でプログラムを書かなければいけない(fと書かれた箱のことです)
- 準備が必要 ※下記記事参照
- "使い方"が難しい(個人的な感想です^^)
「cheerio」の具体的な使い方は、以下の記事に書いたことがあるので参考にしてみてください
情報の抽出方法
情報を抽出している「Node-RED」のプログラムを以下に示します
「pick infection / death」と書かれたノード(箱)が抽出している部分です
そのプログラムコード(文章)を以下に示します ※抽出部分のみ
let strs = []
const $ = cheerio.load(msg.page);
$('table tbody tr').each((i, elem) => {
strs[i] = ''
$('td', elem).each((j, elem2) => {
strs[i] += $(elem2).text() + '/'
})
const re_comma = /,/g;
strs[i] = strs[i].replace(re_comma, '')
})
「HTML」という一定のルールで書かれた文章から、
感染者・死亡者の情報を抽出するための、
プログラムコード(文章)
になります
難しいですよね…💦(うまく説明できない自分が悪い)
プログラムコードが行っていること
2行目:
- msg.pageには「HTML」で書かれたホームページの文章が入っています
- cheerio.loadでmsg.pageを読み込み、cheerioで扱いやすい$に置き換えます
4行目:
- 「新型コロナウイルス感染症の現在の状況と厚生労働省の対応について...」のホームページを見てもらえばわかると思いますが、各国・地域の感染者・死亡者の状況は”表”の形式になっているので、$から表を意味する'table tbody tr'を探します
5~8行目:
- 表の各マスに入っている文字を'/'で区切りながら(区切らないとながーい1つの文章になってしまうため)、”strs”に集めていきます
9, 10行目:
- 最後は数字を扱ううえで余計なカンマを消しているだけです
「言われてみればなんとなくわかる」
「でも、『自分で書ける、応用できる』は別」
はごもっともです
そこが文章でプログラムを作らなければならない難しさで、
”ノード(箱)とフロー(線)で処理と流れを作っていく”
というアプローチで敷居を下げようとしているのが「Node-RED」になります
大分話が逸れましたが、これで「各国・地域ごとの感染者・死亡者数」を抽出することができます
おわりに
次回は、抽出した情報をGoogle版Excelである「Googleスプレッドシート」に書き込む方法についてお話しします