またまたRとニコニコ動画ネタ。というより、前回のつづき。
前回、タグがうまく取得できなかったので、今回はタグやカテゴリタグの取得に挑戦。
ちなみに、自分はRを使うのに、RStudioを利用しています。
前回は簡易的にXMLをデータフレーム化するxmlToDataFrameという関数を利用しましたが、どうやらXMLをDOMにパースするxmlParseというものがあるよう。
> library(XML)
> nico <- xmlParse("http://ext.nicovideo.jp/api/getthumbinfo/sm9")
> nico
<?xml version="1.0" encoding="UTF-8"?>
<nicovideo_thumb_response status="ok">
<thumb>
<video_id>sm9</video_id>
<title>譁ー繝サ雎ェ陦蟇コ荳譌・-辣ゥ謔ゥ隗」謾セ - 繝ャ繝・ヤ繧エ繝シ・・匆髯ス蟶ォ</title>
<description>繝ャ繝・ヤ繧エ繝シ・・匆髯ス蟶ォ・医ヵ繝ォ繧ウ繝シ繝ゥ繧ケ繝舌・繧ク繝ァ繝ウ・・/description>
<thumbnail_url>http://tn-skr2.smilevideo.jp/smile?i=9</thumbnail_url>
<first_retrieve>2007-03-06T00:33:00+09:00</first_retrieve>
<length>5:19</length>
<movie_type>flv</movie_type>
<size_high>21138631</size_high>
<size_low>17436492</size_low>
<view_counter>13658378</view_counter>
<comment_num>4161047</comment_num>
<mylist_counter>134544</mylist_counter>
<last_res_body>縺・縺・≧縺・≧縺・≧縺・≧縺・≧ </last_res_body>
<watch_url>http://www.nicovideo.jp/watch/sm9</watch_url>
<thumb_type>video</thumb_type>
<embeddable>1</embeddable>
<no_live_play>0</no_live_play>
<tags domain="jp">
<tag lock="1">髯ー髯ス蟶ォ</tag>
<tag lock="1">繝ャ繝・ヤ繧エ繝シ・・匆髯ス蟶ォ</tag>
<tag lock="1">蜈ャ蠑・/tag>
<tag lock="1">髻ウ讌ス</tag>
<tag lock="1">繧イ繝シ繝</tag>
<tag>譁ー繝サ雎ェ陦蟇コ荳譌・/tag>
<tag>譛蜿、縺ョ蜍慕判</tag>
<tag>sm9</tag>
<tag>縺・/tag>
<tag>ホイ譎ゆサ」縺ョ闍ア髮・/tag>
</tags>
<user_id>4</user_id>
</thumb>
</nicovideo_thumb_response>
文字化けしてますが、このまま続けます。ところで、純正のRの開発環境で試すと、XMLのコードが表示されなかった。また、このnicoという変数は、externalptr(外部ポインターオブジェクト)という型になっているよう。このあたりはよく分かってません。
とりあえず、XPathが使えるgetNodeSetという関数があるようなので、それを使ってタグを取得してみることに。
> tags <- getNodeSet(nico, "//tag")
> tags
[[1]]
<tag lock="1">陰陽師</tag>
[[2]]
<tag lock="1">レッツゴー!陰陽師</tag>
[[3]]
<tag lock="1">公式</tag>
[[4]]
<tag lock="1">音楽</tag>
[[5]]
<tag lock="1">ゲーム</tag>
[[6]]
<tag>新・豪血寺一族</tag>
[[7]]
<tag>最古の動画</tag>
[[8]]
<tag>sm9</tag>
[[9]]
<tag>う</tag>
[[10]]
<tag>β時代の英雄</tag>
attr(,"class")
[1] "XMLNodeSet"
ありゃ。文字化けしてない。よく分からない仕様だなぁ・・・。これはlistという型になっているようなので、また違うのかもしれない。
とりあえずこの値を取得したい場合は、xmlValueという関数をつかえばいいらしい。
> xmlValue(tags)
Error in UseMethod("xmlValue") :
no applicable method for 'xmlValue' applied to an object of class "XMLNodeSet"
> #これじゃできない
> xmlValue(tags[1])
Error in UseMethod("xmlValue") :
no applicable method for 'xmlValue' applied to an object of class "list"
> #これでもできない
> xmlValue(tags[[1]])
[1] "陰陽師"
> #これでできた
> sapply(tags, function(x) xmlValue(x))
[1] "陰陽師" "レッツゴー!陰陽師"
[3] "公式" "音楽"
[5] "ゲーム" "新・豪血寺一族"
[7] "最古の動画" "sm9"
[9] "う" "β時代の英雄"
> #全て取得する場合はこうするよう
正直、Rはまだまだ分からないことだらけなので、どうしてこうなるのかわからないのですが、とりあえずタグの値は取得できたので目標達成です。
さてじゃあ次にカテゴリタグを取得・・・。ってよく見たらsm9にはカテゴリがないようです(カテゴリ化してる、ゲームタグも音楽タグもあるというのに)。とりあえず、sm1097445(【初音ミク】みくみくにしてあげる♪【してやんよ】)で試すことに。
> mikumiku <- xmlParse("http://ext.nicovideo.jp/api/getthumbinfo/sm1097445")
> mikumiku.tag <- getNodeSet(mikumiku, "//tag")
> mikumiku.tag
[[1]]
<tag category="1" lock="1">音楽</tag>
[[2]]
<tag lock="1">初音ミク</tag>
[[3]]
<tag lock="1">みくみくにしてあげる♪</tag>
[[4]]
<tag>ミクオリジナル曲</tag>
[[5]]
<tag>ika</tag>
[[6]]
<tag>VOCALOID</tag>
[[7]]
<tag>VOCALOID殿堂入り</tag>
[[8]]
<tag>初音ミク名曲リンク</tag>
[[9]]
<tag>元気が出るミクうた</tag>
[[10]]
<tag>夜みっく</tag>
attr(,"class")
[1] "XMLNodeSet"
> #カテゴリータグにはcategory属性がついているので、以下のように変更
> mikumiku.category <- getNodeSet(mikumiku, "//tag[@category]")
> mikumiku.category
[[1]]
<tag category="1" lock="1">音楽</tag>
attr(,"class")
[1] "XMLNodeSet"
> xmlValue(mikumiku.category[[1]])
[1] "音楽"
というわけで、前回作成したデータフレーム(nicoFrame2.txt)にカテゴリーを追加してみる。
まず、上記ファイル内を全て選択してコピーし、Rに読み込むことに。
> nico.table <- read.table("clipboard", header=T, sep="\t")
> for(i in 1:100){
+ xmlURL <- paste("http://ext.nicovideo.jp/api/getthumbinfo/", nico.table[i,1], sep="")
+ nico <- xmlParse(xmlURL)
+ category <- sapply(getNodeSet(nico, "//tag[@category]")[1], function(x) xmlValue(x)) #カテゴリーがない動画も考えると、この方法がよさそうだった
+ if(is.na(category)){
+ category <- "カテゴリーなし"
+ }
+ nico.table$category[i] <- category
+ }
> write.table(nico.table, "nicoFrame3.txt", quote=F, row.names=F, append=F, sep="\t")
これでできたファイルが以下。
nicoFrame3
な・・・。カテゴリーがうまく取得できてない動画がやけに多い・・・。
さっきはカテゴリーを取得できたみくみくにしてあげるも、『カテゴリーなし』に・・・。
カテゴリー取得してやりたいことあったけど、これは困った。ロックしてるタグの一番始めが、カテゴリーにある名前かどうかを見ていくという手法でなんとかなりそうではあるけれども・・・(多分、カテゴリータグの仕様はそれであってる)。
なんでこんなに、カテゴリーかどれかという情報がとれたりとれなかったりするのやら・・・。
コメント