4
3

More than 3 years have passed since last update.

ワクチン予約ができないからサイト監視スクレイピングを作る

Last updated at Posted at 2021-07-07

自衛隊東京大規模接種センター(東京センター) のサイトをチェック

概要

防衛省では集団接種予約を受け付けている。
しかし、ワクチン供給が足りない事から、予約が停止中。
そしていつ予約再開になるかもわからないので、面倒なのでスクレイピングでサイトを監視してもらうことにした。

防衛省ワクチン予約URL

防衛省のサイトの画像

スクリーンショット 2021-07-07 23.34.11.png

文字を監視する

予約ボタンの下に「7月11日(日)までの予約は一旦満了となりました」という文字が出る。
この文字が消えた時、予約開始ができるかも。と判断することにする。

PHPを使う

手軽なのでやはりPHP。

スクレイピングのライブラリ

phpQueryというライブラリを使う。以下からダウンロード
https://code.google.com/archive/p/phpquery/downloads

独自ファイルの作成

なんでも良いです。getvaccine.phpみたいな
phpQueryのファイルはphpQuery-onefile.phpになりますので、独自で作成するファイルと同じ階層に置きます。

プログラムを書く

まずはライブラリ読み込み

念の為、max_execution_timeを無制限にしておく

<?php
    ini_set('max_execution_time', 0);
    require_once("./phpQuery-onefile.php");

必要情報を変数に入れる

今回は防衛省のurlを入れておきます。

    $url_boueisho = 'https://www.mod.go.jp/j/approach/defense/saigai/2020/covid/center.html';

サイトの読み込みを開始

file_get_contentsでサイトにアクセス。
下でphpQueryを使うが、これはサイトのhtmlを取得するイメージでおk

        $subHtml = file_get_contents($url_boueisho, false, $options);
        $subObj = phpQuery::newDocument(mb_convert_encoding($subHtml, 'HTML-ENTITIES', 'UTF-8'));

下調べ

細かい情報を取得。
今回は「7月11日(日)までの予約は一旦満了となりました」という文字を監視したいので、下調べする

スクリーンショット 2021-07-07 23.45.22.png

HTMLタグをチェックする。
pタグでclassがfs-85 matchHeight2 mt-20の中のspanタグのclass fc-red の中に入っていることがわかる

CSS的に書くと

p.fs-85.matchHeight2.mt-20 > span.fc-red

こんな感じ。
これを使ってスクレイピングすれば良い。
先ほど使ったプログラムの$subObjの中にHTMLデータが入っているので、ここから検索するイメージ。

スクレイピング

     $getText = $subObj->find("p.fs-85.matchHeight2.mt-20 > span.fc-red:eq(0)")->text();

補足span.fc-red:eq(0)と書いてあるが、同じclassのタグが複数あるため、東京センターは一番最初のデータなので0を指定。
大阪センターは(1)にすればいけるかと。

文言チェック&メール送信

文言をチェック。strposを使えば、その変数の中に特定の文字が含まれるかどうかをチェックしてくれる。
まだその文字が取得できたら「予約できません」の方の条件分岐に入る。
文字が含まれていない(=予約できる可能性ある)場合は、elseにいく。
今回は、mb_send_mailを使ってアラートとしてメール送信をする様にした。
mb_send_mailは正確に送れない場合があるため注意。あと、メールアドレスはサンプルなので変更する様に。

下のプログラムのtest@mail.comを変更すること


    if(strpos($getText, "7月11日(日)までの予約は一旦満了となりました。") !== false) {
        //予約できない
    }else{
        //予約できる
        mb_send_mail("test@mail.com", 'ワクチン接種!!', "防衛省、今なら予約できるかもっ!!\r\n ".$url_boueisho,"From:info@mail.com");
    }

完成プログラム

<?php
    ini_set('max_execution_time', 0);
    require_once("./phpQuery-onefile.php");

        $url_boueisho = 'https://www.mod.go.jp/j/approach/defense/saigai/2020/covid/center.html';

    $subHtml = file_get_contents($url_boueisho, false, $options);
    $subObj = phpQuery::newDocument(mb_convert_encoding($subHtml, 'HTML-ENTITIES', 'UTF-8'));

    $getText = $subObj->find("p.fs-85.matchHeight2.mt-20 > span.fc-red:eq(0)")->text();

    if(strpos($getText, "7月11日(日)までの予約は一旦満了となりました。") !== false) {
        //予約できない
    }else{
        //予約できる
        mb_send_mail("test@mail.com", 'ワクチン接種!!', "防衛省、今なら予約できるかもっ!!\r\n ".$url_boueisho,"From:info@mail.com");
    }

    die;

動かし方

CRON使うのがベスト。(CRONの使い方はご自分で)
手動実行は以下。ファイル名を変えている場合はその都度変更。
もちろん、ちゃんとPHPが動く環境に置くこと

 php getvaccine.php
4
3
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3