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一覧が取得できました。