プロレス統計

「プロレスの数字とプロレスする」をテーマにプロレスに関連する数字を調べ、まとめ、考えるブログです。

MENU

新日本プロレスワールド詳細検索システム(非公式)リリースのお知らせ

f:id:Rodyonsw:20200510162353p:plain

5000件近い試合映像アーカイブを持つ新日本プロレスワールドは、おそらく日本国内のプロレス団体では最大規模のアーカイブを持つサービスでしょう。
しかしそこには大きな欠点がありました。
それは「試合映像の検索が非常に面倒くさい」という点。
ぶっちゃけよっぽどのことがなければ新着にある映像だけみてサイトを立ち去るという利用方法が主になりがちなぐらい、検索バーこそあれどとてもじゃないが使いづらいものでした。

この検索しづらい新日本プロレスワールド、何とかしたいですよね?
そこで今回弊ブログでは新日本プロレスワールド詳細検索システム(非公式)をリリースしました。
このことについては先日Twitter*1でも報告したところなんですがその使用法については説明しきれていない感もあったので今回は弊ブログでもその詳細についてご報告です。

 

主な仕様

SeleniumとBeautifulSoupを用いて集計した(後述)新日本プロレスワールド上の試合データをGoogleスプレッドシートに貼り付けし、
Query関数によって条件に合致したデータのみを表示するのが主な仕様になっています。

f:id:Rodyonsw:20200510094735p:plain

上画像が実際の検索画面になっていますが、 検索システムとして重要なのは赤と緑で囲った2か所になっています。
①は各種検索条件を入力する欄、②は検索結果が表示される欄になっています。
仕様上、検索条件欄以外は変更ができないようになっています。
また、表示した際に重くならないように検索結果も最大で100件までの表示としており、検索条件欄の下に「>100」と出ている場合は100件以上該当があったことになっています。

都合6000件近いアーカイブから検索が可能ですが、その中から①検索条件で絞込を賭けることで、②検索結果に試合の年月日、大会名、試合名、そして映像のURLを表示することができます。
複数の検索条件が指定された場合は&検索が適用され、条件を増やすことでどんどんと絞り込むことができます。
以下ではその検索条件に付いて紹介します。

検索可能項目

検索可能な項目が現状9項目7種。
このうち年月日+試合タイプについてはプルダウンから選ぶ形式になっています。
こちらの項目の検索条件を削除する場合はバックスペースなどで手動で検索ボックスを空白にしてください。
(スペースなどが入っていても誤作動可能性あり)

年月日

f:id:Rodyonsw:20200510102252p:plain

「1.4の試合を見たいなぁ」という場合の検索例

まず初めに試合が行われた日付
勿論年月日すべてでも月のみ、日のみの検索も可能なので、
例えば上画像のような「毎年1月4日の試合」というような検索も可能。
ただし年は最古のアーカイブである”1973”年から今年”2020”年まで、月は1~12月、日は1~31日までから選ぶので、中にはアーカイブがない日付なども存在するので検索結果が0になることもある。

試合形式

f:id:Rodyonsw:20200510103125p:plain

「1.4のシングルマッチが見たいなぁ」という場合の検索例

試合形式は「シングル」「タッグ」「6人タッグ」の3種類から選べる形に。
これらは試合に登場している選手の人数で判別しており、シングルであれば2人、タッグで4人、6人タッグで6人というように判別しており、各人数に合致した試合がピックアップされます。
よってタッグ3WAYのような形式では「タッグ」では検出されず、「6人タッグ」でないと出てこない可能性が有ります。
上記の形式に合致しない試合の場合は、絞り込むことはできませんがこの欄は空白にして他の条件で絞り込んでください。

選手

f:id:Rodyonsw:20200510103241p:plain

「オカダと中邑のタッグが見たいなぁ」という場合の検索例

「選手」の項目以降はフリーワード検索になります。
「選手」項目では選手名(一部でも可)を入力することでその選手名が含まれる試合をピックアップします。
またこの項目では複数の選手名を全角スペースで区切って入力することで、その選手たちが同チームにいる試合をピックアップします。
例えば「オカダと中邑が組んでいる試合」の場合は「オカダ 中邑」を入力することでオカダと中邑が同チームにいる試合がピックアップされます。
同検索は最大5名まで同時に検索することができるのでご活用ください。

対戦相手

f:id:Rodyonsw:20200510103705p:plain

「オカダ中邑対棚橋内藤が見たいなぁ」という場合の検索例

続いては「対戦者」の項目。
こちらは「選手」の項目と昨日はほぼ同じ(選手名で検索、全角スペースで5名まで検索可能)ですが、「選手」で入力した選手名とは別の相手側のチームに「対戦者」で入力した選手名が含まれる試合をピックアップします。
例えば「オカダ中邑組対棚橋内藤組が見たい」となった場合には「選手」欄に「オカダ 中邑」、「対戦者」欄に「棚橋 内藤」を入力することで、この4名が上述のチーム分けで対戦した試合のみがピックアップされます(仕様上これらに+αで選手が含まれるものもピックアップされかねませんが)

タイトル

f:id:Rodyonsw:20200510105001p:plain

「IWGPヘビー級戦が見たいな」という場合の検索例

「タイトル」欄は所謂王座名だけでなくその試合のサブタイトルで検索ができます。
例えば王座名として「IWGPヘビー」を検索した場合には上の画像のようにIWGPヘビー級選手権にかかわる試合がピックアップされます。
それ以外にも「スペシャルシングルマッチ」や「IWGPヘビー挑戦権利証」といったものや、「G1 CLIMAX」や「BEST OF SUPER Jr.」といったリーグ戦の公式戦もこれによって検索が可能です。

実況

f:id:Rodyonsw:20200510105659p:plain

「オカダ対内藤のIWGPヘビー戦での野上アナの入場口上が聞きたい」場合の検索例

「実況解説」欄はその試合で実況もしくは解説についた人物名で検索が可能です。
例えば実況でいえば「野上」や「大西」、「田畑」などの実況アナ名(一部でも可)、解説でいえば「ミラノ」や「山崎」といったゲスト名で検索が可能です。
現状こちらの機能はおまけ昨日なのでとりあえずは単一キーワードのみでの検索になっています。

フリーワード

フリーワード検索は上記8種で巧く絞り込めない場合などに用いるもので、入力された単語について試合名「第〇試合 △△ VS □□」から該当するワードを検索します。
こちらも単一キーワードでの使用をお願いします。

 

所感雑感

ということで非公式で作った新日本プロレスワールドの詳細検索システムについてでした。
弊ブログでも過去の振り返りとかをするときに過去の試合映像とかをリンクではっつけることもあるのでよく検索する機会があるんですけどほんっっっっっっっとに使いづらいんですよ、公式の検索ボックス。
一番の困ったポイントは複数の選手名を入力してもそれがタッグなのか対戦なのかの判別がなくごちゃまぜに出てくるという点。
なのでそれに関してはキチンと判別できるシステムを作りました、少してこずりましたけどデータベースの構築から検索システム完成までに1週間ちょいでできたのでまぁ上出来でしょう。

上述のように一部はおまけ機能状態だったりもするので今後アップデートはするかもしれませんし、実際リリースツイートした後に不具合を発見して修正したりもしているので今後もデータベース含め手は加えます。
欲を言えば英語にも対応したいところではあるんですが果たしてどうしたものか・・・という感じですね。
本音を言えば「公式がきちんとした詳細検索を出すんだよ!」という感じではありますが、逆にこうして非公式でも作れるんだから公式でも作れるんだよ?という証明になって重い腰を上げてくれないかなぁと思ったりもしています。

以下では苦労話というかこのシステム構築にあたっての詳細を紹介しているので興味がある人は是非。
そうでない方はきょうはこれまで、それでは

 

おまけ1:データベース作成に当たって

新日本プロレスの公式サイトやCagematchのスクレイピングをするようになってから1年近く経っている一方で新日本プロレスワールドのスクレイピングに手を出していなかったのは、これまで用いてきていたBeautifulSoupというモジュールではワールドのスクレイピングができなかったためです。
その理由については定かではありませんが、ワールドは有料サブスクリプションサービスであるために一度ログインを挟まないとアクセスができず、そういった動作にサイトにPythonで直接アクセスするBeautifulSoupでは対応ができなかったのではないかと考えられます。

それに対応する方策がブラウザをPythonで動かすクローニングという手法で、言ってみれば人間が行っている動作をPythonに実際に行わせてブラウザを操作させる手法で、これを用いればログインなんかも可能であると聞いたんですよね。
そういうことで今回はSeleniumというモジュールを用いていつもWebブラウザに使っているChromeを操作することに。
参考にしたのは以下のサイト、記事中にも「BeautifulSoupと組み合わせる」なんていう項目がある通り、Chromeで目的のサイトにアクセスし、htmlを取得した後はいつも通りのBeautifulSoupでのスクレイピングの技法がそのまま使えたので助かりました。

tanuhack.com

おまけ2:新日本プロレスワールドのアーカイブ構造について

スクレイピングする手法の次に問題となったのはどういう順番で集計していくのかという点。
単純に新しい順に調べて言ってもよかったんですが、データベース化することを考えるとある程度順序だててやりたい。

f:id:Rodyonsw:20200510141244p:plain

そこで一つの例として2012年4月8日のNEW JAPAN CUP 2012決勝戦 棚橋弘至 VS 後藤洋央紀*2の動画ページの上部に表示されるサイトの階層構造を示した文字列を上に示しました。
トップページの次の層に来ているのは「NEW JAPAN CUP2012」というシリーズ名、その次に来ているのが「2012年4月8日後楽園ホール」という大会名、そして最後に「棚橋VS後藤」という試合カードが来ています。
つまり新日本プロレスワールドというアーカイブの構造としてシリーズ大会試合という3層構造になっていることがうかがい知れます。

f:id:Rodyonsw:20200510140602p:plain

実はこの構造は各動画ページのURLにも見て取れて、「s_series」というその動画の主な種別を示す文字列*3の次の5桁の数字がシリーズの番号、その次の数字が同シリーズ中の大会番号、その次が大会中の試合番号に相当しています。
なので実は末尾の番号を一つ減らし00191_1_5に変えると同大会の第6試合に移動できたりします。

アーカイブ自体がこのように整理されているので私も今回の集計に当たってはトップページ下部にある「大会別」のページから各大会ごとに試合情報をスクレイピングするようにしました。

おまけ3:試合情報のスクレイピングについて

データベースでは試合映像のURL以外にも試合の日付、選手、タイプ、実況解説などの情報を収録しています。
日付に関しては大会タイトル部分にある情報(○○年△月□日)から取得していますがそれ以外に関しては映像ページにあるタグから取得しています。

f:id:Rodyonsw:20200510142812p:plain

当初は動画ページのタイトルから取得しようとしていた*4んですが、取得されたデータがかなり不正確になったのでタグを用いることに。
上で示した画像は上述の棚橋対後藤の試合映像ページのタグ一覧ですが、ここには会場、試合の種別、参加選手に加えて実況解説の名前まで入っている上に、それぞれがスクレイピング上で判別が可能だったりします(興味がある人はChromeのデベロッパーツールで各タグのクラスを見てみてください)。
これらを集計することで比較的正確に試合情報を集計することができました。
(タグが存在しない選手とかもいるのでそこは補わないといけないし、タッグマッチの場合のチーム分けはタイトルから判別しないといけませんが)

おまけ4:Googleスプレッドシートでのデータ絞込みについて

f:id:Rodyonsw:20200510152658p:plain

データベースの一部

上述のような手法をもって集計したデータをスプレッドシートに張り付けると全部で6176件の試合があるんですが、詳細検索システムではそこから条件に合うものをピックアップしています。
その元となるデータベースの一部が上の画像のようになっているんですが、各行に各試合映像のデータがまとめられており、
年・月・日・試合人数・場所・大会名・対戦者1・対戦者2・URL…などの情報がそれぞれまとめられています。
これらの情報を元にGoogleスプレッドシートの関数の一つであるQuery関数で絞込を行っています。
Query関数の使い方に関しては以下の記事を参考にしました。

tonari-it.com

例えば年・月・日・試合人数に関してはそれぞれA・B・C・D列に情報がまとめられているのでそこに関してクエリ文を指定することで絞り込むことができます。
例えば「2016年1月」のデータに絞る場合には「where A = 2016 and B = 1」というクエリ文にすることで絞り込んで呼び出すことができます。
試合人数に関してはシングルであれば2、タッグであれば4というように変換する機構を作ったりもしていますが基本構造は同じです。

場所や大会名(あとフリーワード検索も)に関しては上述のような「=」での判別ではうまく抽出できないのでlike演算子を用います。
例えばBOSJの試合を抽出したい場合には、大会名はF列に含まれ、F列に「Jr.」が含まれる行を抜き出せばよいので「where  J like '%Jr.%'」というクエリ文を使えば良いです。
ここで検索される文字列は「’」で囲まれた部分ですが「%」が前後についている場合は「%」で囲まれた文字列がJ列に含まれているものを抜き出します。

少し複雑になっているのは「選手」「対戦者」の項目。
試合カードについてはG列とH列にそれぞれのチームをまとめていますが、「選手」の項目のみに入力されている場合は「where (G like '%(選手名)%') or (H like '%(選手名)%')」というクエリ文にすることでGまたはHに(選手名)を含む行が抜き出されます。
ここに対戦相手を加えると検索すべき条件は「Gに(選手)かつHに(対戦者)」もしくは「Gに(対戦者)かつHに(選手)」となるので、具体的なクエリ文は「where (G like '%(選手名)%' and H like '%(対戦相手)%') or (H like '%(選手名)%' and G like '%(対戦相手)%')」という感じになります(複数人入力の場合でも基本は同じ)。

最後はこれらの条件をandでつなげることによってQueryが働いています。

 

*1:ロージャ on Twitter: "新日本プロレスワールド詳細検索システム(非公式)完成しました

*2:リンク

*3:オリジナル動画の場合s_originalだったりする

*4:タイトルの場合は各動画ページのスクレイピングが必要ないので時間がかなり短くて済んだ