RubyのHpricotでニコニコ動画をスクレイピングしてみる(1)
釣り師的なタイトルで申し訳ないです。
今仕事でリスト取得ツールを作っているのですが、
その応用としてニコニコを実験場としたサンプルを作ってみることにします。
スクレイピングというのはHTMLパースのことですね。
RubyのスクレイピングライブラリとしてはHpricotがあります。
Hpricotの名前の由来は不明ですが、エイチプリコットと呼んでいます。
このHpricotはCSS風の書き方で気軽にスクレイピングできるのでとても使いやすいです。
とりあえずいきなりコード。
ニコニコのデフォルトランキング、本日のマイリスト登録数ランキング100から
動画のタイトルをひっぱってくるサンプルです。
#! ruby -Ks
require 'net/https'
require 'kconv'
require 'rubygems'
require 'hpricot'
sid = nil
https = Net::HTTP.new("secure.nicovideo.jp", 443)
https.use_ssl = true
https.start do |w|
data = "next_url=&mail=メールアドレス&password=パスワード"
res = w.post("/secure/login?site=niconico", data, "Content-Length" => "#{data.length}")
sid = $1 if res["Set-Cookie"] =~ /user_session=user_session([\d_]+)/
end
Net::HTTP.start("www.nicovideo.jp", 80) do |w|
res = w.get("/ranking/mylist/daily/all", "Cookie" => "user_session=user_session#{sid}")
doc = Hpricot.parse(res.body.tosjis)
doc.search("h3").each {|e| warn e.inner_text }
end
実行する前に、シェルで「gem install hpricot」とたたいて、
Hpricotをインストールしておいてください。
流れとしては、
1. 認証用サーバ(secure.nicovideo.jp)に接続
2. アカウント情報(メールアドレスとパスワード)を送信
3. クッキー(セッションID)を取得
4. 本サーバ(www.nicovideo.jp)に接続
5. 取得したセッションIDをくっつけて欲しいページをリクエスト
6. 欲しいページが手に入ったら煮るなり焼くなり
6番がHpricotでスクレイピングしてるところなんです。
上のサンプルだと次の2行になります。
doc = Hpricot.parse(res.body.tosjis)
doc.search("h3").each {|e| warn e.inner_text }
1行目で取得したHTMLをSJISにしてからスクレイピング用のHpricotオブジェクトに変換しています。
2行目で、対象HTMLの中からh3タグのみをピックアップして、h3の中身を文字列化して表示しています。
h3が動画のタイトルを表しているのはどうしてわかるのかと言うと、
該当ページのHTMLソースを見たからです。
当然、ニコニコの仕様が変われば動かなくなることもありえます。
この辺は人力です。人力なやり方のことをスクレイピングと言うのでしょう、多分。
今回のサンプルはただとってきて表示しただけなので何の役にも立ちませんが、
次回はもうちょっと詳しい情報を取ってきて加工してみることにします。
その次あたりで毎日CSV出力させてグラフ化とかしてみたいと思います。
