歌詞検索エンジン定義ファイル作成方法:歌詞タイム Part 1

歌詞検索エンジン定義ファイルの作成方法の解説です。

最初は同梱のtxtに書こうと思ったんですが、相当な分量になりそうだったのでブログのエントリにすることにしました。

定義ファイルの作成には、多少のHTMLの知識とそれなりの正規表現の知識が必要になります。

google検索を使う歌詞タイムを扱うのはあまり適切では無い様な気もするんですが、 google検索なら色々な可能性があるのでそれもありかなと。

 

まず最初に、歌詞候補検索の流れについてです。

  1. Uriプレースホルダーにタイトルとアーティスト(とページ番号)を入れてHTMLを取得する
  2. HTMLから検索結果全体の入ったブロックをResult正規表現で取得する
  3. Resultから1曲分のブロックをSong正規表現で取得する
  4. Songからタイトルと曲ページへのUriをTitle正規表現で取得する
  5. SongからアーティストをArtist正規表現で取得する
  6. 見つかったタイトルとアーティストでマッチレベルを判定する
  7. 設定によって完全マッチしれてば歌詞取得へ、そうで無ければ3.に戻り次の曲へ
  8. ResultからSongが見つからなくなったらPager, NextPageの設定次第で次のページのUriを作成し2.へ戻る
  9. Resultを検出できなくなるか、最大読み込みページ数に達したら終了する

[ツール]から[ログ]を表示させて、 候補検索の[歌詞検索エンジン]を個別の物にして候補検索を行うと、動作ログが出力されるのでどんな感じなのか見てみるといいです。てか、作者自身も基本このログ見ながら作成しています。

 

それで、歌詞タイムの場合です。

歌詞タイムは自前の検索を持っておらずgoogleサイト検索を利用しています。検索ページのHTMLを取得するとgoogleへのscriptタグが張ってあるだけで、結果内容は取得できません。

でもgoogleサイト検索できると言うことは、全てのページがgoogleにインデックスされているという意味でもあるので、googleからsiteオプションで検索できる事になります。

 

googleをブラウザで開いて検索ワードに「new site:www.kasi-time.com」と入れれば、歌詞タイム内のnewを含むページを検索できます。そして、おもむろに2ページ目に行ってアドレスバーを見ます。

環境にもよるんでしょうが、へんてこな情報が付いているので削っていき、きちんと2ページ目が表示されるUriを探します。「https://www.google.com/search?q=new+site:www.kasi-time.com&start=10」これで2ページ目が表示されますね。

googleページャーを持ってますが、Uri内にページ番号では無くスタート番号を指定するタイプなので、PagerではなくNextPageを使います。というか、ページャーがあっても次のページが明確なタイプならNextPageの方がわかりやすいと思います。開発初期にはPagerしか実装してなかったので、現在の定義ファイルはPagerタイプの方が多いです。

話を戻して2ページ目のUriがわかれば定義ファイル内のUriが指定できます。

Uri=http://www.google.com/search?q=%Title%+%Artist%+site:www.kasi-time.com

google検索では歌詞検索エンジンの検索と違ってタイトルのみの指定とか無いので、一緒に検索してしまいましょう。このタイプを勝手に連結検索と呼んでます。

 

 検索結果が表示されたらページのソースを表示します。googleは問題ないですが、歌詞サイトでは右クリックを禁止している所が多いのでショートカットから、中にはさらにCtrlキーまで無効にしている所があるのでメニューから開きます。

話がちょっと前後しちゃうのですがUserAgentについて。

このままUserAgentを指定せずに定義ファイルを詰めていくと、何故か上手く取得できないという状態になります。それはgoogleがユーザーエージェントによって返信内容を変えてくるからです。UserAgentの指定無しの状態とUserAgentを指定しているブラウザのソースは違うので上手くいかない訳です。

ブラウザのアドオンでユーザーエージェントを偽装できるものがあるので活用しましょう。変更すると結構内容が変わってきます。Fire Foxを使うと、いい位置にコメントが挟んであってやりやすかったのですが仕様変更に弱そうなので、今回はIE10っぽい物を利用する事にします。

 

 長くなってきたので、次回に続く。