nokogiriを使ってYouku(soku)から動画idと再生時間を取得してみた

動画の情報を自動で収集できたら良いなと思い、最近は動画の情報収集に勤しんでいます。

前回、Youtubeの動画IDと再生時間などの情報はAPIを使用して取得しました。

ただYoutubeだけではありきたりな動画しか集まらないのでは、と思いました。

そこで中国のYoutubeと言われるYoukuの動画の情報をRubyを使って取得しました。

YoukuにもAPIがあるようですが中国語が読めず開発用のキーの発行ができなかったので、今回はnokogiriでHTMLから情報を取得します。

Youkuはキーワード検索を行うと、何故か一度sokuというサイトで検索をします。

検索結果から動画を選ぶと、Youkuに戻るという謎設計になっていたので実際に行うのはsokuのHTMLからの情報取得となります。

sokuのURLについて

sokuの検索する際のURLは以下のようになっています。

http://www.soku.com/search_video/q_○○

○○に検索するキーワードが入ります。
「ハルチカ op」などで検索する場合も、sokuではスペースのままでした。(Youtubeでは+でつなげます)

keyword    = "春太与千夏的青春 op"
search_url = "http://www.soku.com/search_video/q_"+keyword
search_url = URI.escape(search_url)

keywordは検索のキーワードで、ハルチカは中国語で「春太与千夏的青春」(違う書き方もあるそうですが)と書くらしいのでこうしました。

search_urlでアクセスするURLを作成し、URI.escapeで日本語や中国などに対応させます。

charset    = nil
user_agent = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)'

html = open(search_url, "User-Agent" => user_agent) do |f|
  charset = f.charset    #文字コードを取得
  f.read
end

doc = Nokogiri::HTML.parse(html, nil, charset)

open-uriを使用してHTMLとサイトの文字コードを取得します。

HTMLとサイトの文字コードを使い、変数docにNokogiriでパースされた情報を渡します。

動画の再生時間の取得について

sokuで動画の再生時間が書かれている行は以下のようになっています。

<div class="v-thumb-tagrb"><span class="v-time">01:36</span></div>

classの「v-time」のテキストだと分かります。

times_data = doc.css('.v-time').map { |data|
    puts data.text    #描画のため
    data.text         #return
}

data.textに「01:36」という数字が入ります。
「doc.css('.v-time')」と書くと「v-time」のclassを全て取得するため、mapを使用して一つ一つ描画しています。

動画IDの取得について

動画のIDが書かれている周辺のHTMLは以下のようになっています。

<div class="v-link">
  <a title="春太与千夏的青春 OP" target="_blank" href="http://v.youku.com/v_show/id_XMTQ0MTcyMTc2MA==.html?from=s1.8-1-1.2" _clicklog="" _log_type="3" _log_ct="4" _log_pos="1"  _log_vid="XMTQ0MTcyMTc2MA=="  _log_cid="100">
    <i class="btn_play"></i>
  </a>
</div>

aタグの中の_log_vidに「XMTQ0MTcyMTc2MA==」と動画のIDが入っています。

youkuでは、最後の==が入っていても動画を取得することができます。

videosID = doc.css('.v-link > a').map{ |data|
  puts data["_log_vid"]    #描画のため
  data["_log_vid"]         #return
}

doc.css('.v-link > a')では、「.v-link」によってdivをしています。
そして、「> a」で指定したdivの中のaタグを取得するようにしています。

class「.v-link」divの中のaタグは動画ごとになるので、mapを使用して一つずつを描画しています。

aタグの中で「_log_vid="XMTQ0MTcyMTc2MA=="」となっているので、data["_log_vid"]とすることで「"_log_vid"」の値を取得することができました。

これまでやってきたことで、times_dataに時間一覧、videosIDに動画のID一覧が取得できました。