【Scraping】日本一素晴らしいクリスマスソングの歌詞を作る


突然ですが、ピチカート・ファイブの「12月24日」というクリスマス・ソングがとても好きです。なんといっても歌詞が良い。

東京はいつだって
いつだってにぎやかだけど
12月24日
ひとりきりは少し寂しい

あの明るい曲調に、切ない歌詞がのるというのがたまらないですね!今の僕の心情にぴったり寄り添ってきます。こんな素晴らしい歌詞が書けたらなあと憧れた諸兄姉も多いのではないかと思います。
どうもクリスマスというシーズンには、人をそわそわさせるワードがつきもののようです。
そこで閃いたのですが、クリスマス・ソングの中でも名曲と言われる曲たちの歌詞を組み合わせれば、それはもう素晴らしい歌詞が出来上がるのではないでしょうか?

というわけで、「実行するだけでクリスマス・ソングの名曲の歌詞を組み合わせて表示してくれるプログラム」を作ってみました。ご査収ください。

lyric_maker.rb
require 'mechanize'

class XmasLylicMaker < Mechanize

  SONGS_URL = "http://jpop.ninpou.jp/field/qurisumas.html"
  LYRICS_URL = "http://www.uta-net.com/"
  NARROW_BY_SONG = 2

  def initialize
    super
  end

  def remix_lylics
    lyrics = songs_list.map do |song|
      result_page(song).search('.td5').map { |list| list.text } if result_page(song)
    end
    puts lyrics.flatten.uniq.shuffle!.shift(13)
  end

  private

  def songs_page
    get(SONGS_URL)
  end

  def search_page
    get(LYRICS_URL)
  end

  def result_page(song_name)
    begin
      search_page.form_with(id: 'search_form') do |form|
        form.Keyword = song_name
        form.field_with(name: "Aselect").value = NARROW_BY_SONG
      end.submit
    rescue
    end
  end

  def songs_list
    songs_page.search('h3').map do |song_name|
      text = song_name.text
      text.slice!(0)
      text
    end
  end

end

XmasLylicMaker.new.remix_lylics

こちらを実行するだけで、ターミナル上に歌詞がいい感じに並びます。気になる結果は後程紹介するとして、まずは簡単にコードの解説をします。

大まかな流れは、「クリスマスの名曲ランキングが載っているページから曲名を取得→取得した曲の歌詞を取得、ランダムに並び替える」というものになります。

まずはこの辺りまで。

lyric_maker.rb
require 'mechanize'

class XmasLylicMaker < Mechanize

今回はScrapingによってあるページから情報を拝借してくるので、gem mechanizeを利用します。
また、class XmasLyricMakerは「クリスマス・ソングの歌詞を作る」というクラスなので、Mechanizeのメソッドを利用してHTMLを読み込まなければいけません。そこで、Mechanizeクラスを継承させています。

続きましてinitializeメソッド付近まで。

lyric_maker.rb
  SONGS_URL = "http://jpop.ninpou.jp/field/qurisumas.html"
  LYRICS_URL = "http://www.uta-net.com/"
  NARROW_BY_SONG = 2

  def initialize
    super
  end

今回は定数でScrapingに行くURLなどを定義しています。実際に遷移してみていただければわかりますが、それぞれクリスマスの名曲特集のページと、歌詞検索サービスサイトのトップページのURLとなっています。
initializeメソッドですが、継承元のMechanizeのinitializeを受け継ぐためにsuperを記述しています。

続いてはファイル中で唯一クラス外から呼び出されているremix_lyricsメソッドです。

lyric_maker.rb
  def remix_lylics
    lyrics = songs_list.map do |song|
      result_page(song).search('.td5').map { |list| list.text } if result_page(song)
    end
    puts lyrics.flatten.uniq.shuffle!.shift(13)
  end

songs_listの前にはself.が省略されています。つまりこちらはインスタンスメソッドであり、remix_lyricsメソッドのレシーバであるXmasLyricMakerクラスのインスタンスがこのメソッドを呼び出している、ということになりますね。songs_listメソッドを見てみましょう。

lyric_maker.rb
  def songs_list
    songs_page.search('h3').map do |song_name|
      text = song_name.text
      text.slice!(0)
      text
    end
  end

この中に書かれているsongs_pageもメソッドの呼び出しです。呼び出しているのは同様にレシーバのインスタンスになります。songs_pageメソッドはこちらです。

lyric_maker.rb
  def songs_page
    get(SONGS_URL)
  end

このメソッドにより、ScrapingしたいページのHTML情報を取得してきています。
songs_listメソッドの返り値は、["曲名", "曲名", "曲名"]といったクリスマスの名曲のタイトルが入った配列にになります。

続いて、result_pageメソッドです。

lyric_maker.rb
  def result_page(song_name)
    begin
      search_page.form_with(id: 'search_form') do |form|
        form.Keyword = song_name
        form.field_with(name: "Aselect").value = NARROW_BY_SONG
      end.submit
    rescue
    end
  end

こちらは、引数として受け取った曲名を歌詞検索サービスサイトの検索フォームに入力し、そのタイトルを含む曲一覧のページの情報を返します(Winter, againが上手く検索出来ずにエラーになるのでやむなく例外処理で回避、なぜだTERUよ)。

取得した曲一覧ページの.td5というclassのついた要素に、お目当ての歌詞があります。あとはそれをtextメソッドで文字列として取り出し、文字列の入った配列として返していくだけです。すると、変数lyricsは二重配列となります。

lyric_maker.rb
  def remix_lylics
    lyrics = songs_list.map do |song|
      result_page(song).search('.td5').map { |list| list.text } if result_page(song)
    end
    puts lyrics.flatten.uniq.shuffle!.shift(13)
  end

最後は、flattenしてuniqしてshuffle!した配列を出力すれば、目的を達成できるという寸法です。行数は、1番の歌詞を数えたらだいたいそれくらいのものが多かったので13行にしています。つまり適当です。

色々気に入らないところもありますが、ひとまず動いてるのでいったん良しとしましょう。

(24日になったら最新版のRubyを入れて、tryメソッドなど試してみたいものです)

それではお待たせしました、本エントリーの成果である「日本一凄いクリスマスソングの歌詞」を公開します。

君の隣でなら深く大きく深呼吸
磨り減った靴でまだ見ぬ明日へ
センチメンタルと祝福の気持ち
No pain心がすれ違う時にも
I BELIEVEほら今自分信じて
うまくいかないno good day
I Believe大事なことは
壊れかけた宝物を両手に抱えて
waiting all my life for girl
何処に行けば辿り着くの
I Believeさよならじゃない
Setting along the scenery
White Silent Night

どうですかこの素晴らしい歌詞は。ミリオンヒット間違いなしです。秋◯康が悔しがる姿が目に浮かびます。
特に、サビらしき部分で「I BELIEVE ~」「I Believe ~」ときちんと韻を踏んでいることにポテンシャルを感じますね。大文字と小文字にどんな意味の違いが込められているのでしょうか。そしてクリスマスという言葉が一度も出てきません。
他にも色々と面白い発見がありましたが、これ以上はお目汚しとなるので控えておきます。

工夫すれば、様々な「日本一凄い」歌詞が作れそうですね。

皆さんも是非一度お試しあれ!

※なお、このプログラムを用いて実際に楽曲を作ることは当然のごとく著作権に違反します。やめておきましょう。

当局からは以上になります。お読みいただき、ありがとうございましたm(_ _)m