Rでウェブスクレイピングしてみた

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

Rでウェブスクレイピングがやってみたくなったので調べてみた。
データサイエンティスト養成読本』でも、ウェブスクレイピングの章はRではなく、Pythonでの解説だったので、もしかしてRだと難しいのか? と思ったけど、XMLでのデータ取得とほぼ同じようにできた。

やり方は前にRでニコニコ動画APIを取得してみる | while(isプログラマ)で説明したやり方とほぼ同じ。
というわけで、今回ははてなブックマークのニコニコ動画の新着エントリーから、タイトルとURLとブクマ数を取得してデータフレーム化するプログラムを書いてみた。

できたテキストファイルが以下。
nicohatebu

XMLの時との違いは、xmlParseではなくて、htmlParseぐらいで、他は同じなよう。
簡単に何をやっているか説明すると、タイトルはh3タグの中のaタグの中のテキストなので、それを6行目でそのように取得。URLはh3タグの中のaタグの中のhref属性なので、それを7行目で取得。ブクマ数はliタグのdata-bookmark-count属性に書いてあるのでそれを8行目で取得しています。
あまり安全ではない書き方なような気がしますが、今のところこれで大丈夫そうなのでとりあえず。
本当は、個別個別のliをまず取得して、その中からh3タグの中のaタグを取得。というようにしたかったのだけれども、やり方が分かりませんでした。下記のようにやるとできると思ったのですが、うまくいかなくて・・・。

[[1]]の”【疑似m@s】割と熱湯のお風呂 ‐ ニコニコ動画:GINZA”しか取得しないと想定してやってみたのですが・・・。ここでは、『li[[1]]』が外部ポインターオブジェクトというものらしいのですが、まだよく分からないでいます・・・。

ExcelのVBAでニコニコ動画APIを読み込んでみる

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

ちょっとExcelでニコニコ動画のAPIを読み込みたいと思ったので、試してみました。

まずは、下記のようなシートを用意。
VBA実行前
作りたいのは、A列の2行目以降に動画IDを書いて、その左側にその動画の情報を書き込んでいくというもの。

VBAはほとんど触ったことがないので、Rangeプロパティだとか、Offsetプロパティだとかの概念がよく分かってなかったのですが、なんとか作ることができました。

XPathにはあまりなれてないのですが、属性で判断するカテゴリータグを取得したいということもあり、XPathを利用することに。
19行目で動画情報が取得できたかどうかの可否、25行目でユーザーIDがあるかどうかの可否、28行目でカテゴリータグがあるかどうかの可否を調べて条件分けしてます(動画情報が取得できたどうかは、If文じゃなくて、For Each文を使ってるので、間違ったつかいかたかもしれません)。

というわけで、実行してみました。
VBA実行後
相変わらず、カテゴリーがうまく取得できていないところがありますが、他は問題なくいけたようです。
ありえない動画ID(この例では、sm1とaiueo)は動画情報を取得していませんし、ユーザーIDやカテゴリーも見つからなかったものは飛ばしているよう。数値のみの動画IDの動画情報もうまく取得できました。
今気づいたんですが、カテゴリータグってタグの一番目とは限らないんですね。てっきり、一番目なのかと・・・。ということは、カテゴリーが取得できない場合、一番目のタグを見て判断するという方法は使えないのか・・・。

ところで、自分が使ってるExcelはExcel2010なのですが、Excel2013だとWEBSERVICE関数なんていう便利なものがあるよう(参考:Excel 2013で追加された「WEBSERVICE」関数を使って、マクロを使わずWeb APIを利用する。 | 初心者備忘録)
何これ。すごい便利そう。

Rで、ニコ動のタグやカテゴリを取得してみる

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

またまたRとニコニコ動画ネタ。というより、前回のつづき。
前回、タグがうまく取得できなかったので、今回はタグやカテゴリタグの取得に挑戦。
ちなみに、自分はRを使うのに、RStudioを利用しています。

前回は簡易的にXMLをデータフレーム化するxmlToDataFrameという関数を利用しましたが、どうやらXMLをDOMにパースするxmlParseというものがあるよう。

文字化けしてますが、このまま続けます。ところで、純正のRの開発環境で試すと、XMLのコードが表示されなかった。また、このnicoという変数は、externalptr(外部ポインターオブジェクト)という型になっているよう。このあたりはよく分かってません。

とりあえず、XPathが使えるgetNodeSetという関数があるようなので、それを使ってタグを取得してみることに。

ありゃ。文字化けしてない。よく分からない仕様だなぁ・・・。これはlistという型になっているようなので、また違うのかもしれない。
とりあえずこの値を取得したい場合は、xmlValueという関数をつかえばいいらしい。

正直、Rはまだまだ分からないことだらけなので、どうしてこうなるのかわからないのですが、とりあえずタグの値は取得できたので目標達成です。

さてじゃあ次にカテゴリタグを取得・・・。ってよく見たらsm9にはカテゴリがないようです(カテゴリ化してる、ゲームタグも音楽タグもあるというのに)。とりあえず、sm1097445(【初音ミク】みくみくにしてあげる♪【してやんよ】)で試すことに。

というわけで、前回作成したデータフレーム(nicoFrame2.txt)にカテゴリーを追加してみる。
まず、上記ファイル内を全て選択してコピーし、Rに読み込むことに。

これでできたファイルが以下。
nicoFrame3

な・・・。カテゴリーがうまく取得できてない動画がやけに多い・・・。
さっきはカテゴリーを取得できたみくみくにしてあげるも、『カテゴリーなし』に・・・。
カテゴリー取得してやりたいことあったけど、これは困った。ロックしてるタグの一番始めが、カテゴリーにある名前かどうかを見ていくという手法でなんとかなりそうではあるけれども・・・(多分、カテゴリータグの仕様はそれであってる)。
なんでこんなに、カテゴリーかどれかという情報がとれたりとれなかったりするのやら・・・。

Rでニコニコ動画APIを取得してみる

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

またRとニコニコ動画ネタ。様々なデータを取得しやすいのでRの勉強するには、ニコニコ動画のデータを使うのはよさそうです(ただたんに、よく利用しているサイトということもありますが)。

 
まず、ニコニコ動画には、動画情報を取得できるAPIがあります。
参考:ニコニコ動画APIとは (ニコニコドウガエーピーアイとは) [単語記事] – ニコニコ大百科
また、RにはXMLを解析する『XML』という名前そのままなパッケージがあります。
参考:XMLデータの扱い方

今回はそれらを利用してRでニコニコ動画のAPIを取得してみます。

まずは、RでXMLのパッケージのインストール

こんな感じになったら、とりあえずparseXMLを使ってニコニコ動画APIを取得。今回は定番のsm9(新・豪血寺一族 -煩悩解放 – レッツゴー!陰陽師)を使用

分かりにくいですが、どうも取得できたみたいです。タグが連結されてしまってますが、他は問題なさそう。

ところで、ニコニコ動画のAPIの動画情報は動画一つ一つでしか取得できないようです。でも、2つ以上の動画情報をデータフレームにしたいということもあるので、その方法を考えてみました。

まずは、取得した動画IDの取得。今回は、カテゴリ合算の総合ランキングの合計ランキングにあるトップ100の動画の情報を取得してみることに。
まずはその習得手順。ウェブ開発者ツールを開いて、コンソール画面を開き、以下のスクリプトを実行。

そうすると、メニューバーの下に動画IDと宣伝ポイントがカンマ区切りで書かれたテキストエリアが表示されると思うので、それを全て選択してコピーします(ChromeやFirebugを使っている場合は、12行目を『copy(txtVideoInfo);』してもOK)。なんだかムダなことをやっていると思われるかもしれませんが、AutoPage系の拡張機能や、先日紹介したGETパラメータを削除するユーザースクリプト(ニコニコ動画のGETパラメータ付きリンクを取り除くユーザースクリプト書いた | while(isプログラマ))を使ってる場合を考慮して書いています。if文は必要なさそうだったのですが、copyメソッドを使う場合は最後に空白行を追加してしまうという問題があったため、if文で最後の行だけ”\n”を追加しないようにしています。ニコニ広告のポイント数は必要ありませんが、後でつかおうと思ったため取得しました。

とりあえず、上記で取得したテキストをRに取り込み。

うまく取得できてるよう。

というわけで早速、この取得した動画IDのAPIを取得して、結合したデータフレームを作ってみたいと思います。

4行目の[-19]というのは、19列目を除くという意味です。公式動画だと19番目のuser_idがないことがあるそうなので、19番目をはぶくことにしました。
これでうまくいくはず(API自体をうまく取得できなかった場合や、削除となっている動画用のXMLが取得されてしまった場合の対処はしてません)。

そしてこれを、

として、得たテキストファイルが以下。
nicoFrame

うまく取得できてるようです。

ところで、APIの動画情報にはニコニ広告のポイントは書いてありません。ニコニ広告自体が途中からでてきたサービスだからなのかもしれませんが、とりあえず今回はニコニ広告のポイントをすでに取得してあるので、それを結合してみることに。今回は動画ID,タイトル,再生数,コメント数,マイリスト数,ニコニ広告ポイント数のみのデータフレームを作成することに。

できたファイル:nicoFrame2

これもうまくいきました。
ところで、今回ニコニ広告のポイント数をブラウザからとることができましたが、普通にソースをとってきてもわからないよう。どうも、ソースを読み込んだ後にJavaScriptでニコニ広告のポイント表示をしているようなのですが、調べてみてもその仕組みが分からず(ranking.jsというファイルで何かやってそうなのですが・・・)。

最後に、動画がない場合の対策。動画がない(例えば、sm1)が含まれている可能性がある場合は、ncolで列数を調べ、18の場合のみデータフレームに追加するという作業を行うといいかもしれないです。
試しに、sm1~sm100の動画情報を取得した場合は以下のように。

sm1~sm100までは23の動画が残っているということがわかります。

タグがうまく取得できない問題は今後の課題に(これができなきゃカテゴリーすら分からない)。XMLライブラリをもう少し勉強すれば分かるような気はするのですが・・・。
ニコニ広告の自動取得は難しそう。ニコニ広告の動画ページ(sm9の場合)のソースを見れば分かるには分かるのですが・・・。

Rを使ってニコニコ動画のデータを分析してみる

[`evernote` not found]
[`livedoor` not found]
[`yahoo` not found]

職場で統計に関する仕事をすることになり、最近Rの勉強をしています。
R のインストール – RjpWiki

とりあえず、ニコニコ動画のそれぞれのカテゴリの合計再生数ランキングにおける1位から300位までの動画のデータを作成したのでこれで試してみます(ランキングの上位を取得したデータなので、当たり前ですが偏りがあります。本来ならもっとランダムに取得できたらよかったんですが)。
http://am-yu.net/wp-content/uploads/2013/11/nico.txt
左から、カテゴリー、カテゴリーの中の再生数の順位、動画ID、再生数、コメント数、マイリスト数、です。

上記のテキストボックスを全て選択してコピーしたら、Rで下記のように入力

とりあえず、マイリストと再生数のプロットを表示してみる。options関数のscipen=100というのは、指数表現をしないための処理です。これをしないと、大きい数だと数値にEがついた指数表記になるので分かりにくい。

mylist-view-plot

なんだか相関ありそうです。なので、相関係数がわかるcor関数を使ってみます。

結果は、0.8042205となりました。

続いて、マイリストと再生数から回帰分析(この場合、単回帰分析)をやってみます。

こんな感じになりました。ここから分かるのは、マイリストがひとつ増えると再生数は29増えているということです。この29を係数というよう。ただし、マイリストが0だと再生数は227181という結果に。さすがに再生数が227181もあれば、マイリスト数は四桁ぐらいありそうな気もするのですが・・・。
決定係数(Multiple R-squared)が0.6468というのは、まあまあな結果ですが、もうちょっと高くなってほしいところです。

なお、コメント数と再生数はあまり相関がないようでした。相関係数も0.2044571とあまり相関がないと思えるような数値です。
mylist-view-plot

つづいて、コメント数とマイリスト数のカテゴリーから再生数を回帰分析してみます(この場合は重回帰分析)。

R-18がないのは別に配慮したわけではなく、たまたまR-18がデフォルトとなりました。つまり、ただたんにマイリスト数と27.987145を掛け、コメント数と0.156682をかけて切片(Intercept)の458110.790621を足しただけの数値は、R-18の動画の再生数の基準ということになります。VOCALOIDの場合はここから630814.309857を引いたものとなります・・・。あれ? これだと一見、VOCALOID動画のほうが再生数低いような気がしますね。そんなわけないんですが。
VOCALOIDの係数が低いのは、動画の再生数にたいするマイリストの割合が、VOCALOID動画は高い傾向があるのが原因かと思われます。
実際、カテゴリーだけを考慮した回帰分析だと、VOCALOIDの係数はプラスとなっているようです。

うーん。なんとも中途半端なエントリーになってしまった。もうちょっとRの使い方や、ニコ動のデータの分析について詳しくかけたらよかったのだけれども・・・。
もともと、コメント数がもうちょっと相関あると思ってやってみたことなので・・・。
ちなみに、コメント数5000000未満を省くと相関あるんじゃないかと思ってやってみた結果が以下。

mylist-view-plot

少し相関が高くなってきましたが、もうちょっと高いのが理想です。