ロト7の抽選結果を取得するプログラムをPHPで作る



2021/1/21

ロト7の抽選結果をPHPで自動的に取得してくるプログラムの作り方をまとめました。
うまさくでもこれを応用して自動取得しています。
今回はphpQueryというPHP用のライブラリィを使ってWEBスクレイピングのプログラムを作ってみました。

WEBスクレイピングとは

ウィキペディアより

ウェブスクレイピング(Web scraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。ウェブ・クローラー(Web crawler) あるいはウェブ・スパイダー(Web spider)とも呼ばれる。

phpQueryのダウンロード

phpQueryのダウンロードページから最新の「phpQuery-...-onefile.zip」をダウンロードします。


https://code.google.com/archive/p/phpquery/downloads

抽選結果の取得プログラム

プログラムの目的

ロト7の抽選結果を公開しているサイトから指定した抽選日の抽選結果を取得してきます。
サンプルで参照するサイトは楽天ロトを利用しています。
楽天ロトを選択した理由は、プログラムで抽選結果を収集する際にページ構成がシンプルなので選んでいます。
以下のページの内容をプログラムで取得して最新の抽選情報を抜き出してきます。

楽天抽選結果ページ

プログラムコード

利用するにあたっての注意点

・プログラムは自由に利用、または改造していただいてかまいません。
・文字コードはUTF-8で保存してください。
・PHPのバージョンは7.2.34で動作確認。
・楽天ロトのレイアウト変更された場合は動作保証しません。

//楽天ページの当選情報の項目を定義
//※抽選結果のページの項目の並びが変わると動作しないかも
$_aryHeadKey = array(
  "回号",
  "抽せん日",
  "本数字",
  "ボーナス数字",
  "1等",
  "2等",
  "3等",
  "4等",
 "5等",
 "6等",
 "キャリーオーバー",
);

//取得してくる抽選日の日時を設定
if(isset($_GET["d"])){
 //引数に指定があれば取得(YYYYMMDD形式)
 $dtNowDate = new DateTime($_GET["d"]);
}else{
 //未指定の場合は現在の日時を取得
 $dtNowDate = new DateTime();
}
//楽天ロトのナンバーズ3当選結果ページをスクレイピング
$html = file_get_contents("https://takarakuji.rakuten.co.jp/backnumber/loto7/");
//phpQueryを読み込み
require("./phpQuery/phpQuery-onefile.php");

//取得した値を保持する配列初期化
$aryResult = array();
$strKaisaiDate = "";
foreach (phpQuery::newDocument($html)->find("tbody") as $entry){
foreach (phpQuery::newDocument($html)->find("tbody") as $entry){
  //THヘッダを取得
  $strHeader = pq($entry)->find('th')->text();
  //回号を取得
  preg_match_all('/第.+?回/', $strHeader, $match);
  if(isset($match[0][0])){
      $strKaigo = $match[0][0];
  }
  //TDタグを取得
  $aryTempRes = explode(PHP_EOL,pq($entry)->find('td')->text());
  if(is_array($aryTempRes)){
    $strKaisaiDate = "";
    for($lngCnt=0;$lngCntformat("Y/m/d")){
        //開催日が実行時の日時と一致した場合
	switch($lngCnt){
        case 0:
          //抽選日
          $aryResult[$_aryHeadKey[1]] = $strKaisaiDate;
          //回号
          $aryResult[$_aryHeadKey[0]] = str_replace(array("第","回"),"",$strKaigo);
          break;
        case 1:
        case 2:
        case 3:
        case 4:
        case 5:
        case 6:
        case 7:
          //本数字
          $aryTempDig[] = $aryTempRes[$lngCnt];
          break;
        case 8:
        case 9:
	  //ボーナス番号
	  $aryTempBonus[] = str_replace(array("(",")"),"",$aryTempRes[$lngCnt]);
	  break;
        case 10:
          //1等(口数)
          $aryResult[$_aryHeadKey[4]]["口数"] = str_replace(array(",","口"),"",$aryTempRes[$lngCnt]);
          break;
        case 11:
          //1等(金額)
          $aryResult[$_aryHeadKey[4]]["金額"] = str_replace(array(",","円"),"",$aryTempRes[$lngCnt]);
          break;
        case 12:
          //2等(口数)
          $aryResult[$_aryHeadKey[5]]["口数"] = str_replace(array(",","口"),"",$aryTempRes[$lngCnt]);
          break;
        case 13:
          //2等(金額)
          $aryResult[$_aryHeadKey[5]]["金額"] = str_replace(array(",","円"),"",$aryTempRes[$lngCnt]);
          break;
        case 14:
          //3等(口数)
          $aryResult[$_aryHeadKey[6]]["口数"] = str_replace(array(",","口"),"",$aryTempRes[$lngCnt]);
          break;
        case 15:
          //3等(金額)
          $aryResult[$_aryHeadKey[6]]["金額"] = str_replace(array(",","円"),"",$aryTempRes[$lngCnt]);
          break;								
        case 16:
          //4等(口数)
          $aryResult[$_aryHeadKey[7]]["口数"] = str_replace(array(",","口"),"",$aryTempRes[$lngCnt]);
          break;
        case 17:
          //4等(金額)
          $aryResult[$_aryHeadKey[7]]["金額"] = str_replace(array(",","円"),"",$aryTempRes[$lngCnt]);
          break;	
	case 18:
	  //5等(口数)
	  $aryResult[$_aryHeadKey[8]]["口数"] = str_replace(array(",","口"),"",$aryTempRes[$lngCnt]);
	  break;		
        case 19:
	  //5等(金額)
	  $aryResult[$_aryHeadKey[8]]["金額"] = str_replace(array(",","円"),"",$aryTempRes[$lngCnt]);
	  break;
	case 20:
	  //6等(口数)
	  $aryResult[$_aryHeadKey[8]]["口数"] = str_replace(array(",","口"),"",$aryTempRes[$lngCnt]);
	  break;		
        case 21:
	  //6等(金額)
	  $aryResult[$_aryHeadKey[8]]["金額"] = str_replace(array(",","円"),"",$aryTempRes[$lngCnt]);
	  break;
	case 18:
	  //キャリーオーバー(金額)
	  $aryResult[$_aryHeadKey[9]] = str_replace(array(",","円"),"",$aryTempRes[$lngCnt]);
	  break;	
        }
      }
    }
  }
}
//本数字をまとめる
$aryResult[$_aryHeadKey[2]] = implode("-",$aryTempDig);
//ボーナス番号をまとめる
$aryResult[$_aryHeadKey[3]] = implode("-",$aryTempBonus);
print_r($aryResult);

実行結果

抽選結果を配列にセットして表示します。
以下のような結果になります。

Array
(
    [抽せん日] => 2021/01/15
    [回号] => 0402
    [1等] => Array
        (
            [口数] => 該当なし
            [金額] => 該当なし
        )

    [2等] => Array
        (
            [口数] => 11
            [金額] => 9424800
        )

    [3等] => Array
        (
            [口数] => 199
            [金額] => 729300
        )

    [4等] => Array
        (
            [口数] => 8946
            [金額] => 9500
        )

    [5等] => Array
        (
            [口数] => 253104
            [金額] => 1000
        )

    [6等] => 3744761225
    [本数字] => 7-9-12-17-20-26-29
    [ボーナス数字] => 4-13
)


これらを応用したプログラムを用いて予想サービスを運用しています!

© 2024 - うまさく -