見出し画像

ねとけいばのURLからラップの折れ線グラフを作る

自主学習

簡単にグラフを作れるChart.js

簡単に軽いスクレイピングが出来るsimple_html_dom.php

jsとphpの間でデータを橋渡しする$.ajax


無題

こんな感じのができる


ただグラフを作成するだけのものですが記録として

phpが動く環境なら使えます


雑にやったのでURLは

https://race.netkeiba.com/race/result.html?race_id=レースID&rf=race_list

かレースID以下だけ消してるみたいな形じゃないと出来ないはず

↓この画面

画像1


コード

rapgraphindex.html

<!DOCTYPE html>
<html lang="ja">
<head>
   <meta charset="UTF-8">
   <meta http-equiv="X-UA-Compatible" content="IE=edge">
   <meta name="viewport" content="width=device-width, initial-scale=1.0">
   <title>ラップタイム折れ線グラフ</title>
</head>
<body>
   
   <div id="inputarea">
           URL<input type="text" id="inputurl" value=""><br>
           <input type="button" value="submit" onClick="loadCharts()"></input>
   </div>

   <!-- ここにグラフ -->
   <div id="chartarea"></div>

   <!-- script -->
   <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
   <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.min.js"></script>
   <script type="text/javascript" src="rapgraph.js"></script>

</body>
</html>

rapgraph.js

const loadCharts = function () {

 // レースのURL受け取り
 var RaceUrl = document.getElementById("inputurl").value;
 console.log(RaceUrl);

 // phpにURLを渡す
 $.ajax({
   type: "post",
   url: "rapgraph.php",
   data: {"RaceUrl": RaceUrl},
   success: function(result){

     // phpでの処理が成功したら

     // jsで扱えるデータにする
     var arr = JSON.parse(result);

     var RaceName = JSON.parse(arr[0]);
     var Haronarray = JSON.parse(arr[1]);
     var Timearray = JSON.parse(arr[2]);

     console.log(RaceName);
     console.log(Haronarray);
     console.log(Timearray);

     // グラフを作成
     const chartDataSet = {
       type: 'line',
       data: {
         labels: Haronarray,
         datasets: [{
           label: RaceName,
           data: Timearray,
           lineTension: 0, // draw straightline
           backgroundColor: 'transparent',
           borderColor: 'rgba(60, 160, 220, 0.8)'
         }
         ]},
       options: {}
     };
   
     const ctx = document.createElement("canvas");
     document.getElementById("chartarea").appendChild(ctx);
     new Chart(ctx, chartDataSet);
   }
})};

rapgraph.php

<?php

   require_once("simple_html_dom.php");

   $URL = $_POST["RaceUrl"]; //取得したいサイトのURL
   
   $ch = curl_init();
   
   //ここからオプション
   curl_setopt($ch, CURLOPT_URL, $URL);
   curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);  //証明書検証しない
   curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  //レスポンスを表示するか
   curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);  //"Location: " ヘッダの内容をたどる
   curl_setopt($ch, CURLOPT_MAXREDIRS, 10);  //"Location: " ヘッダの内容をたどる深さ
   //ここまでオプション
   
   $output = curl_exec($ch) or die('error ' . curl_error($ch));   //cURL セッションを実行する
   curl_close($ch);  //リソースを閉じ、システムリソースを解放
   
   //日本語のための文字コード設定など
   mb_language("Japanese");
   $html_source = mb_convert_encoding($output, "UTF-8", "auto");
   
   $html = str_get_html( $html_source );

   // レース名
   $RaceName = $html->find("div.RaceName", 0)->plaintext;

   // 通過距離
   foreach ($html->find("table.RaceCommon_Table.Race_HaronTime tr.Header", 0)->find("th") as $th) {
       $Haronarray[] = $th->plaintext;
   }

   // ハロンタイム
   foreach ($html->find("table.RaceCommon_Table.Race_HaronTime tr.HaronTime", 1)->find("td") as $td) {
       $Timearray[] = $td->plaintext;
   }

   // エンコード
   $RaceName_json = json_encode($RaceName, JSON_UNESCAPED_UNICODE);
   $Haronarray_json = json_encode($Haronarray);
   $Timearray_json = json_encode($Timearray);

   // 1つに纏める
   $result = array(
       $RaceName_json,
       $Haronarray_json,
       $Timearray_json
   );

   // jsファイルに返す
   echo json_encode($result);

   exit;

?>


主に参考にしたサイト

https://kapibara-sos.net/archives/597

https://blog.s-giken.net/441.html

https://blog.s-giken.net/442.html

https://tips.recatnap.info/japanese_translation_manual_simple_html_dom_parser/

https://brainlog.jp/programming/php/post-429/


気が向いたら改良するかもしれんけど多分飽きた

この記事が気に入ったらサポートをしてみませんか?