店舗検索
URL例は以下の通り
https://p.eagate.573.jp/game/facility/search/p/list.html?gkey=IIDX&paselif=false&area=AR-02&pref=JP-13&finder=area&page=1
https://p.eagate.573.jp/game/facility/search/p/list.html?gkey=IIDX&paselif=false&finder=keyword&keyword=新宿
パラメータ説明:
gkey | ゲームの種別を表す文字列 | - |
paselif | PASELI対応店舗の絞込検索フラグ | PASELI対応のみ=true、すべて表示=false |
area | "AR-nn"書式で、地方を表す文字列 | AR-01=北海道・東北、AR-02=関東、… |
pref | "JP-nn"書式で、日本の都道府県を表す文字列 | JP-01=北海道、JP-13=東京、… |
finder | 検索方式を表すタブの情報 | area=エリアから検索、keyword=フリーワード検索 |
keyword | 検索するキーワード | フリーワード検索時のみ指定 |
page | 検索結果のページ番号を指定 | 1ページあたりの件数はCookieで指定 |
1ページ当たりの件数
画面では「10件表示/ページ」「30件表示/ページ」「50件表示/ページ」のセレクトボックスが画面下部に用意されている。これが選択されたとき、JavaScriptにて「key:facility_dspcount
, value:30
」というCookieが設定される。次回以降のp.eagate.573.jp
へのアクセス時に併せてリクエストに載る。このCookieが送られない場合(未設定の場合)はデフォルトの「10件表示/ページ」が適用される。10
, 30
, 50
以外の値はサーバー側で受け付けず、デフォルト値(10
)で動く。
gkey の取得
https://p.eagate.573.jp/game/facility/search/p/index.html
上記URLにアクセスすると、ゲームタイトル選択のセレクトボックスがある。ここには、検索に対応しているすべてのゲームが選択肢として用意されている。
<select id="id_gkey"> <option value="MFCU" >麻雀格闘倶楽部</option> <option value="MFCU_HG" >麻雀格闘倶楽部(ハイグレードモデル)</option> (中略) <option value="SMASTA" >スマッシュスタジアム</option> <option value="IIDX_LN" >beatmania IIDX LIGHTNING MODEL</option> <option value="IIDX" >beatmania IIDX</option> <option value="NOSTALGIA" >ノスタルジア</option> (中略) </select>
option
要素のvalue
属性が、gkey
パラメータに渡すべき文字列である。option
要素のテキスト部はvalue
属性が表すゲーム(あるいはモデル)である。
店舗情報
以下のようなHTMLで店舗情報が記述されている。
<div class="cl_shop_bloc" id="id_shop_aa92829b67458ee20f2450430349c44b" data-fdesc="aa92829b67458ee20f2450430349c44b" data-name="エムエムランド" data-address="世田谷区北沢2-3-6" data-access="小田急線下北沢駅南口から徒歩3分" data-telno="03-6804-0373" data-operationtime="" data-holiday="無し" data-latitude="" data-longitude=""> <div class="cl_shop_title"> <div class="cl_shop_distance"></div> <div class="cl_shop_name"> <a href="/game/facility/search/p/detail.html?gkey=IIDX&paselif=false&area=AR-02&pref=JP-13&finder=area&fdesc=aa92829b67458ee20f2450430349c44b">エムエムランド</a> </div> <div class="cl_shop_paseli"><img src="/game/facility/search/p/img/ico_paseli_s.gif" alt="[P]" /></div> <div style="clear:both;"></div> </div>
class
属性が"cl_shop_bloc"
であるdiv
要素に定義されている他の属性を抽出するのがよい。
属性:
id | "id_shop_ハッシュ値" で店舗を一意に識別するコード | ハッシュ値は数日ごとに更新される |
data-fdesc | 店舗詳細画面を表示するために必要なハッシュ値 | ハッシュ値は数日ごとに更新される |
data-name | 店舗名 | - |
data-address | 住所 | 都道府県名は省略される |
data-access | 店舗までのアクセス方法 | - |
data-telno | 店舗の電話番号 | - |
data-operationtime | 店舗の営業時間 | - |
data-holiday | 店舗の定休日 | - |
data-latitude | 店舗の緯度情報 | 35.12345のような表記 |
data-longitude | 店舗の経度情報 | 135.34567のような表記 |
PASELIに対応しているかどうかは、class
属性が"cl_shop_paseli"
であるdiv
要素の子要素として、img
要素があるかどうかを調べればよい。
ページ移動
<div id="id_pager_bloc"> <table class="cl_pager_table"> <tr> <td class="cl_pager_number"><b><span>1</span></b></td> <td class="cl_pager_separator"></td> <td class="cl_pager_number"><a href="/game/facility/search/p/list.html?gkey=IIDX&paselif=false&area=AR-02&pref=JP-13&finder=area&page=2"><span>2</span></a></td> <td class="cl_pager_separator"></td> <td class="cl_pager_number"><a href="/game/facility/search/p/list.html?gkey=IIDX&paselif=false&area=AR-02&pref=JP-13&finder=area&page=3"><span>3</span></a></td><td class="cl_pager_separator"></td> <td class="cl_pager_mark"><a href="/game/facility/search/p/list.html?gkey=IIDX&paselif=false&area=AR-02&pref=JP-13&finder=area&page=2"><span>></span></a></td> <td class="cl_pager_separator"></td> <td class="cl_pager_mark"><a href="/game/facility/search/p/list.html?gkey=IIDX&paselif=false&area=AR-02&pref=JP-13&finder=area&page=3"><span>>></span></a></td> </tr> </table> </div>
いま表示しているページが最終ページなのかどうかを判定するには、次ページ(あるいは最終ページ)への汎用リンクがあるかをチェックする。次ページは
<a href="..."><span>></span></a>
であり、最終ページへのリンクは
<a href="..."><span>>></span></a>
である。
都道府県内に1店舗も稼働していない場合
ゲームを1つ選び、「エリアから検索」タブで都道府県名にリンクが張られていないときは、指定したゲームがその都道府県内で1店舗も稼働していないことを表す。
https://p.eagate.573.jp/game/facility/search/p/index.html?gkey=MUSECA
上記URLの応答HTMLには、XMLHttpRequest 呼び出しをする JavaScript が含まれている。
https://p.eagate.573.jp/game/facility/search/json/facilityarealist.html?gkey=MUSECA&paselif=false
XMLHttpRequest 呼び出しの応答形式は、Content-type: application/json;charset=Shift_JIS
である。
{ "arealist":{ "status":"ok","areaid":"","areaname":"", "modelname":"MUSECA", "modelpaseli":"1" , "areainfo":[ {"id":"AR-01","name":"北海道・東北","exist":"true"}, {"id":"AR-02","name":"関東","exist":"true"}, // (中略) ] }, "preflist":{ "status":"ok","areaid":"","areaname":"全ての地域","prefid":"","prefname":"","modelname":"MUSECA","modelpaseli":"1" , "prefinfo":[ {"area_id":"AR-01","id":"JP-01","name":"北海道","exist":"false"}, {"area_id":"AR-01","id":"JP-02","name":"青森県","exist":"true"}, {"area_id":"AR-01","id":"JP-03","name":"岩手県","exist":"false"}, {"area_id":"AR-01","id":"JP-04","name":"宮城県","exist":"true"}, // (中略) {"area_id":"AR-07","id":"JP-46","name":"鹿児島県","exist":"false"}, {"area_id":"AR-07","id":"JP-47","name":"沖縄県","exist":"false"}, {"area_id":"","id":"","name":"","exist":"false"} ] } }
このJSONから preflist の prefinfo 配列を走査し、exist 属性が true である都道府県について、area_id 属性と id 属性を店舗検索のパラメータに指定するとよい。