大宮の相席BAR JIS OMIYAのサイトをスクレイピングしてわかったこと
はじめに
こんにちはKuboです。
本日は、大宮にある相席BAR JIS OMIYAのサイトをスクレイピングして見ました。
ターゲットとしたサイトはこちら
最初に、スクレイピングは、違法なのか気になって調べて見ましたが、どうやら公に公開している情報をもとに情報分析目的でのスクレイピングであるならば違法では、ないという見解が多く利用規約によってスクレイピングを禁止していいないサイトであれば問題なさそうです。
参考:スクレイピングは違法?3つの法律問題と対応策を弁護士が5分で解説 | トップコート国際法律事務所
やりたいこと
今回やってみたいと思ったきっかけは、このサイトに来店中の男性客数と女性客数が表示されていため、どの様なデータをもとに表示されているのか仕組みを知りたかったからです。
サイトを調べてみた
サイトを調べるとJavascriptの中に以下のJSON形式のデータが存在しました。
var datas = { "omiya":{ "shared":{ "mens_customer_num":0, "ladys_customer_num":0, "others_customer_num":0, "mens_group_num":0, "ladys_group_num":0, "others_group_num":0, "mens_share_num":0, "ladys_share_num":0, "mens_share_customer_num":0, "ladys_share_customer_num":0, "mens_waiting_num":0, "ladys_waiting_num":0, "mens_waiting_customer_num":0, "ladys_waiting_customer_num":0 } } };
調査した時間帯がまだ営業時間外だったので全ての数値は0でした。
ここで気になる項目「others_customer_num」ですね、mens、ladysと来てothers
このご時世ですから同性愛者用の項目を用意しているのでしょうか?
それぞれの項目の意味を私なりに以下の様に予想しました。
mens_customer_num | 男性顧客人数 |
ladys_customer_num | 女性顧客人数 |
others_customer_num | 同性愛者人数 |
mens_group_num | 男性グループ数 |
ladys_group_num | 女性グループ数 |
others_group_num | 同性愛者グループ数 |
mens_share_num | 男性相席したトータル人数 |
ladys_share_num | 女性相席したトータル人数 |
mens_share_customer_num | 男性相席中人数 |
ladys_share_customer_num | 女性相席中人数 |
mens_waiting_num | 男性入店待ち人数 |
ladys_waiting_num | 女性入店待ち人数 |
mens_waiting_customer_num | 男性相席待ち人数 |
ladys_waiting_customer_num | 女性相席待ち人数 |
あくまでも私個人の予想なので合っているかは、わかりませんmens_customer_num,ladys_customer_numに関してはサイト内で現在の状況として使用されていたので間違い無いでしょう、mens_waiting_num、ladys_waiting_numも同様に只今の入店待ち状況に使われていたので間違いはないと思います。
スクレイピング
今まで調べてわかった内容を踏まえてPHPでスクレイピングのコードを書いて行きましょう突発的に、考えたので少し効率の悪い点や、変なコードがあるかもしれもせんが、かなり簡単に書いています。
※今回は、全国版のJSONがあったのでそちらを取得
<?php // スクレイピング対象のページURL $target_url = 'https://omiya.jis.bar/'; // 結果出力ファイル名 $output_file = 'result.txt'; // HTML取得 $html = file_get_contents($target_url); // 改行コードを区切り文字として配列にバラす $html_rows = explode("\n",$html); // 配列を1行づつループ foreach ($html_rows as $row) { //一行に「var datas」「fukuoka」が存在したらアウトプット用変数に格納 if((strpos($row,'var datas') !== false) and (strpos($row,'fukuoka') !== false)){ $output = $row; } } // 変数が空じゃなかったらファイルに日付付きで出力 if(mb_strlen($output) > 0){ $date = date("Y/m/d H:i:s"); file_put_contents(OUTPUT_FILE,$date . ":" . $output . "\n",FILE_APPEND); }
これをcronで営業時間の18:00から翌日6:00までの時間帯にサーバ負荷を考えて5分間隔で実行する様に設定しました。
1日流して見て
1日流して見てデータを確認しましたが、いくつか疑問点が出て来ましたのでご報告
others_customer_numは使われていた
同性愛者用の項目で用意しているだけで使われていない項目と思っていましたが、1日流した結果数人カウントされていることを確認しました。
mens_share_numの使われ方がわからない
mens_share_numとmens_share_customer_numとcustomer有無の2項目あったので片方はトータルの人数をカウントしているものかと予想していましたが、どちらも加算だけじゃなく減算されいたのでトータルでは無い様です。
値が一致しないこともあるのでなんの値なんでしょうか?
最後に
今回は1日流して様子をみましたが、現在もスクレイピングのプログラムは動かし続けています。
曜日毎のおすすめの時間帯、男性、女性で何人組が平均なのかなど分析していく予定です。
また、進展ありましたらご報告させていただきます。
以上、Kuboでした。