2021/1/21
ナンバーズ3の抽選結果をPHPで自動的に取得してくるプログラムの作り方をまとめました。
うまさくでもこれを応用して自動取得しています。
今回はphpQueryというPHP用のライブラリィを使ってWEBスクレイピングのプログラムを作ってみました。
WEBスクレイピングとは
ウィキペディアより
ウェブスクレイピング(Web scraping)とは、ウェブサイトから情報を抽出するコンピュータソフトウェア技術のこと。ウェブ・クローラー(Web crawler) あるいはウェブ・スパイダー(Web spider)とも呼ばれる。
phpQueryのダウンロード
phpQueryのダウンロードページから最新の「phpQuery-...-onefile.zip」をダウンロードします。
https://code.google.com/archive/p/phpquery/downloads
抽選結果の取得プログラム
プログラムの目的
ナンバーズ3の抽選結果を公開しているサイトから指定した抽選日の抽選結果を取得してきます。
サンプルで参照するサイトは楽天ロトを利用しています。
楽天ロトを選択した理由は、プログラムで抽選結果を収集する際にページ構成がシンプルなので選んでいます。
以下のページの内容をプログラムで取得して最新の抽選情報を抜き出してきます。
プログラムコード
利用するにあたっての注意点
・プログラムは自由に利用、または改造していただいてかまいません。
・文字コードはUTF-8で保存してください。
・PHPのバージョンは7.2.34で動作確認。
・楽天ロトのレイアウト変更された場合は動作保証しません。
//該当なしの場合 //※該当なしの場合は口数と金額欄に設定 define("NOT_TOSEN","該当なし"); //楽天ページの当選情報の項目を定義 //※抽選結果のページの項目の並びが変わると動作しないかも $_aryHeadKey = array( "回号", "抽せん日", "当せん番号", "ストレート", "ボックス", "セット(ストレート)", "セット(ボックス)", "ミニ" ); //取得してくる抽選日の日時を設定 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/numbers3/"); //phpQueryを読み込み require("./phpQuery/phpQuery-onefile.php"); //取得した値を保持する配列初期化 $aryResult = array(); $strKaisaiDate = ""; 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: //当選番号 $aryResult[$_aryHeadKey[2]] = $aryTempRes[$lngCnt]; break; case 2: //ストレート(口数) $aryResult[$_aryHeadKey[3]]["口数"] = str_replace(array(",","口"),"",$aryTempRes[$lngCnt]); if($aryResult[$_aryHeadKey[3]]["口数"] == NOT_TOSEN){ $aryResult[$_aryHeadKey[3]]["口数"] = 0; } break; case 3: //ストレート(金額) $aryResult[$_aryHeadKey[3]]["金額"] = str_replace(array(",","円"),"",$aryTempRes[$lngCnt]); if($aryResult[$_aryHeadKey[3]]["金額"] == NOT_TOSEN){ $aryResult[$_aryHeadKey[3]]["金額"] = 0; } break; case 4: //ボックス(口数) $aryResult[$_aryHeadKey[4]]["口数"] = str_replace(array(",","口"),"",$aryTempRes[$lngCnt]); if($aryResult[$_aryHeadKey[4]]["口数"] == NOT_TOSEN){ $aryResult[$_aryHeadKey[4]]["口数"] = 0; } break; case 5: //ボックス(金額) $aryResult[$_aryHeadKey[4]]["金額"] = str_replace(array(",","円"),"",$aryTempRes[$lngCnt]); if($aryResult[$_aryHeadKey[4]]["金額"] == NOT_TOSEN){ $aryResult[$_aryHeadKey[4]]["金額"] = 0; } break; case 6: //セット(ストレート)(口数) $aryResult[$_aryHeadKey[5]]["口数"] = str_replace(array(",","口"),"",$aryTempRes[$lngCnt]); if($aryResult[$_aryHeadKey[5]]["口数"] == NOT_TOSEN){ $aryResult[$_aryHeadKey[5]]["口数"] = 0; } break; case 7: //セット(ストレート)(金額) $aryResult[$_aryHeadKey[5]]["金額"] = str_replace(array(",","円"),"",$aryTempRes[$lngCnt]); if($aryResult[$_aryHeadKey[5]]["金額"] == NOT_TOSEN){ $aryResult[$_aryHeadKey[5]]["金額"] = 0; } break; case 8: //セット(ボックス)(口数) $aryResult[$_aryHeadKey[6]]["口数"] = str_replace(array(",","口"),"",$aryTempRes[$lngCnt]); if($aryResult[$_aryHeadKey[6]]["口数"] == NOT_TOSEN){ $aryResult[$_aryHeadKey[6]]["口数"] = 0; } break; case 9: //セット(ボックス)(金額) $aryResult[$_aryHeadKey[6]]["金額"] = str_replace(array(",","円"),"",$aryTempRes[$lngCnt]); if($aryResult[$_aryHeadKey[6]]["金額"] == NOT_TOSEN){ $aryResult[$_aryHeadKey[6]]["金額"] = 0; } break; case 10: //ミニ(口数) $aryResult[$_aryHeadKey[7]]["口数"] = str_replace(array(",","口"),"",$aryTempRes[$lngCnt]); if($aryResult[$_aryHeadKey[7]]["口数"] == NOT_TOSEN){ $aryResult[$_aryHeadKey[7]]["口数"] = 0; } break; case 11: //ミニ(金額) $aryResult[$_aryHeadKey[7]]["金額"] = str_replace(array(",","円"),"",$aryTempRes[$lngCnt]); if($aryResult[$_aryHeadKey[7]]["金額"] == NOT_TOSEN){ $aryResult[$_aryHeadKey[7]]["金額"] = 0; } break; } } } } } print_r($aryResult);
実行結果
抽選結果を配列にセットして表示します。
以下のような結果になります。
Array ( [抽せん日] => 2021/01/20 [回号] => 5611 [当せん番号] => 294 [ストレート] => Array ( [口数] => 70 [金額] => 93400 ) [ボックス] => Array ( [口数] => 619 [金額] => 15500 ) [セット(ストレート)] => Array ( [口数] => 212 [金額] => 54400 ) [セット(ボックス)] => Array ( [口数] => 1257 [金額] => 7700 ) [ミニ] => Array ( [口数] => 596 [金額] => 9300 ) )
これらを応用したプログラムを用いて予想サービスを運用しています!