ちょっと話題の記事

オンライン診療対応医療機関リストの情報更新をRSSなし、Googleスプレッドシートだけで確認できるようにしてみた

厚生労働省のオンライン診療対応医療機関のリストはPDFで公開されています。 リストの更新はPDFの差し替えで行われているようなのですが、更新箇所は表示されず、RSSも使用できません。 そこでGoogleスプレッドシートだけを使用して情報更新の有無を確認してみました。
2020.05.01

先日公開した、オンライン診療対応医療機関リストのGoogle Map化についてのブログは、おかげさまで多くの人に読んでもらえたようです。ご覧いただいた方、ありがとうございました!

Twitterを見ていると、ブログだけでなくGoogle Map単体でのシェアもしていただいているようです。5月1日現在でGoogle Mapの閲覧回数は42,000回を超えています。 こうなってくると、アップデートにも少し気を配った方が良いかなと思うようになりました。

そんななか、東京都はじめ、数県の情報がアップデートされたらしいと聞いて厚生労働省のホームページを見てみました。

新型コロナウイルス感染症の感染拡大を踏まえたオンライン診療について|厚生労働省

オンライン診療対応医療機関リストの更新がわからない

一見すると更新の表示はないのですが、試しに東京都のPDFファイルをダウンロードしてみると確かにファイル名が変わっており、掲載件数も1059件から1088件に増加していました。(4月28日時点) 4月30日夜の時点では、さらに増えて東京都のオンライン診療対応医療機関は1448件になっています。

どうやらリストの更新はPDFファイルの差し替えで行われるようです。 しかし、更新の表示がないため、47都道府県について更新があったかどうかを確かめるためには、一つ一つファイル名を確認しないといけない状態です。これは結構な手間です。

オンライン診療対応医療機関のPDFリストについては、私だけでなく、いくつかの企業やインターネット上の有志にてCSV化されたり、より検索利便性の高いWebサイト検索利便性の高いWebサイトや、地図の作成が試みられたりしています。

こうしたリストを活用するためには、データが扱いやすいCSVやExcelで公開されていたり、更新箇所が明確になっていたりするとありがたいのです。 そこで、せめて更新ファイルの有無をチェックするために、Googleスプレッドシートだけ使って雑にWebスクレイピングもどきをしてみることにしました。

Webスクレイピングとは、Webページの情報をプログラムを使って自動的に取得してくる技術です。 今回の目的は、PDFファイルの差し替えを検出すること。 タイムラグは許容して、作業できるときにWebページの更新箇所を見つけられるよう、最低限のことを目指しました。

スプレッドシートでWebページのファイル差し替え検出

作成してみたのがこちらです。 4月28日22時に準備して、4月30日の夜に再び確認したところ、ちらほらと変更箇所を発見。1都11県に変更がありました。 このスプレッドシートの作り方についてご紹介します。

GoogleスプレッドシートでWebスクレイピング

Googleスプレッドシートはご存知の方も多いと思うのですが、Webブラウザ上で使えるExcelの代替品としてのみ使用されていることも多いのではないでしょうか。 そんなGoogleスプレッドシートですが、実はWeb上のサービスならではの関数がいくつか存在しています。 その一つがURLを指定してWebページ上の情報を取り込めるimportxml()です。 これを使ってオンライン診療対応医療機関リストの現在のPDFファイル名を取得し、過去のファイル名と比較することで更新の有無をチェックしたいと思います。

importxml()でできること

importxml()は、その関数名の通りXMLやHTML、CSVなど、Web上のさまざまな種類の構造化データから情報を取り出すことができる関数です。

IMPORTXML - ドキュメント エディタ ヘルプ

構文は次の通り。

IMPORTXML({URL}, {XPathクエリ})

XPathは、XML形式の文書から、特定の要素や属性を指定するための書き方です。 理解するためには少しHTMLやXMLについても知識が必要になるかもしれません。 XPath Tutorial

XPathの確認

XPathを確認するには、ブラウザの機能を使うと楽です。 Chromeでは下記の通り確認できました。

1.XPathを確認したいリンク(ここでは都道府県のどれか)を右クリック。「検証」を選択。

2.右側に表示されるページの該当箇所のソースを確認。

見慣れない画面だと思いますが、この画面ではWebページの元になっている情報を確認することができます。

ここで確認したいのは、リストがどんなhtmlタグを使用して記載されているかです。
「検証」をクリックした箇所を中心に、htmlのソースを開いてくれているので、直前のタグとhtml全体の構成を確認していきます。

オンライン診療対応医療機関のPDFが掲載されているページの構成は、ざっくりと下記のような形であることがわかりました。

<html>
...
<body>
...
    <div>
    ...
        <ul class="m-listLink--hCol2">
            <li><a href="/content/000625697.pdf">北海道</a></li>
            ...

ulタグを使用した箇条書きの中に、PDFファイルへのURLが並んでいるようです。
そして、ポイントとなるのはulタグに、クラス名m-listLink--hCol2が指定されていることです。

この情報を元に、PDFファイルへのリンクのXPathを書くと、下記のような形になります。
//ul[@class='m-listLink--hCol2']/li/a/@href

XPathはhtmlの階層構造を上から記述していくのが基本ですが、"//"と書くことで、そこまでのタグの記載を省略することができます。

同様にリンク表示へのXPathは
//ul[@class='m-listLink--hCol2']/li/a/text()
と記述します。

ちなみに要素の右クリックメニューからXPathをコピーすることもできます。
「Copy」を選んで、さらに「Copy XPath」か「Copy full XPath」をクリックすると、選択した要素のXPathがコピーできるのですが、この方法で取得したXPathではimportxml関数がうまく動かないことが多いです。
やや手間ですが、htmlの階層構造を確認して、取得したい情報の直前の階層に注目する方が早いようです。

Google スプレッドシートにページの情報を取り込む

XPathを確認できたら、スプレッドシートに関数を記述していきます。
今回、対象とするページのURLは、B1セルに記載しておき、関数から参照させています。

まずはリンク表示名として都道府県名を抽出。
=IMPORTXML(B1,"//ul[@class='m-listLink--hCol2']/li/a/text()")

次に、ファイル名を取得します。
=IMPORTXML(B1,"//ul[@class='m-listLink--hCol2']/li/a/@href")

数式を入力したセルの下の行に、続々と該当する情報が書き出されていきます。

書き出されているファイル名は、この関数を実行した時点での情報です。 そこで、これをコピーして適当な列に「値のみ貼り付け」をして、ログとして記録しておきます。 importxmlは2時間ごとに情報を取得するので、ログと付き合わせればファイルの差し替えがわかるようになります。

また、ファイル名が変わったときに、より分かりやすくするために、「条件付き書式」を設定してみました。 ログとして記録したファイル名と、別のファイルがWebページに掲載された時に、該当するセルが赤くなる仕掛けです。

仕掛けた直後は、もちろんオールグリーンの状態です。

あとは定期的にスプレッドシートを見るようにしていると、冒頭にあげた図のように差し替わったファイルがわかるようになります。

なぜRSSを使わなかったのか?

Webサイトの更新をチェックするのに、一般的な方法はRSSを使うことです。 ただ、これはWebサイトの方でRSSに対応している必要があります。

結論から言うと、オンライン診療対応医療機関のページについてRSSを使用した更新チェックは難しいと判断して諦めました。 ご参考までに確認した内容をご紹介しておきます。

厚生労働省ページのRSS対応状況

厚生労働省のWebサイトを確認すると、RSSの対応はトップページの新着情報と緊急情報、インフルエンザ情報の3種類。 オンライン診療対応医療機関のページは対象外でした。

RSSを自ら設定してみる

RSSを提供していないサイトに、自分でRSSを設定することができるツールは、いくつか存在しています。しかし、今回のケースでは残念ながら、うまく目的の箇所だけに設定することはできず、ツールの上限にぶつかってしまいました。

試してみたのはFeed43というツール。 使い方はこちらのページが分かりやすかったです。

このツールの検索パターンには、繰り返し部分だけを記載する必要があります。 Webページのソースを見てみると、リストになったURLが非常にたくさん存在しているので、図のようにliタグ中のa hrefを指定すると関係のないリンクも対象になってしまいます。 Feed43が無料で使えるFeed数は20件。簡単に超過してしまいます。

そこで、どうにかしてPDFのリスト部分だけを抽出しようとすると、HTML上でリストが特定されているulタグのclass名 m-listLink--hCol2 をどこかで指定しておきたいのですが、ulタグそのものが繰り返されているわけではないのがミソ。

下の図のように、ulタグから記載すると、リストの一番上にある北海道だけが抽出される状態となってしまいます。

繰り返し部分について、何か正規表現を用いて記載するようなことができればよかったのですが、Feed43のリファレンスを見る限り、そうした機能は無さそうだったため断念しました。 もしかしたら、私が知識不足なだけで、何か良い書き方があったり、別のツールでなら実現できるのかもしれません。

(5月2日追記: この記事を読んだ方から、Feed43でも可能ということで、設定の仕方と作成したRSSフィードをお知らせいただきました! Global Search Patternを設定すればよかったそうです。)  

さらに自動更新と自動通知を行うには

GAS(Google Apps Script)というマクロを作成できる言語があります。 これで少しプログラミングすれば、一定の時間ごとに自動的にログを記録するようにできたり、さらには変更があったことをメールで通知したりすることもできます。 Excelと同様にマクロを記録しておいて、ある程度自動でプログラムを生成することもできるのですが、ちょっと複雑になるので、また必要性が高まったときに試してみることにします。

また、Alteryxなどの有償ツールを使用できるのであれば、弊社の兼本のブログの通り、自動でWebスクレイピングからCSV作成までを行うことができます。

将来、データ収集段階でのフォーマットの統一と、元データのCSV、Excel公開が行われて、Civic Tech(市民自らテクノロジーを活用することによる課題解決)が進んでいくことを願っています。