Rではてなブックマークの件数を取得してみる

またまたRネタ(ところで、Rってものすごい検索に引っかかりにくいような。R言語と書くべきだったか)。

ここのところニコニコ動画のAPIを使ったXMLの解析がつづいたので、今回ははてなブックマークの件数を取得するjsonの解析。Rにはrjsonというjsonを取得してR用に変換してくれるライブラリがあるようなので、今回はそれを利用。
参考:はてなブックマーク件数取得API – Hatena Developer Center
参考:CRAN – Package rjson

とりあえず、複数のURLを取得できるようなので、そのAPIを利用することに(調べてみたら、つい先日リリースされたばかりらしい。参考:(開発者向け情報)はてなブックマーク件数取得APIで複数のURLのブックマーク数をより簡単に取得出来るようになりました – はてなブックマーク開発ブログ)。

> install.packages("rjson")
Installing package into ‘C:/Users/FMVF56DDRZ/Documents/R/win-library/3.0’
(as ‘lib’ is unspecified)
trying URL 'http://essrc.hyogo-u.ac.jp/cran/bin/windows/contrib/3.0/rjson_0.2.13.zip'
Content type 'application/zip' length 492273 bytes (480 Kb)
opened URL
downloaded 480 Kb

package ‘rjson’ successfully unpacked and MD5 sums checked

The downloaded binary packages are in
	C:\Users\FMVF56DDRZ\AppData\Local\Temp\RtmpyIllkd\downloaded_packages
> library("rjson") #まずは利用準備

これで、jsonが利用できるようになったはずなので、試してみる。

> hatebu <- fromJSON(file="http://api.b.st-hatena.com/entry.counts?url=http://www.hatena.ne.jp/&url=http://b.hatena.ne.jp/")
> hatebu
$`http://www.hatena.ne.jp/`
[1] 5830

$`http://b.hatena.ne.jp/`
[1] 6857

> hatebu[1] #呼び出した順番に登録されているよう
$`http://www.hatena.ne.jp/`
[1] 5830

> hatebu['http://b.hatena.ne.jp/'] #URLを指定するのだったらこのほうがいいかも
$`http://b.hatena.ne.jp/`
[1] 6857

本当なら、”://”のところを”%3A%2F%2F”という具合にURLエンコードしたかったのですが、RのURLencodeメソッドでは:や/はエンコードしてくれないようなので、わざとエンコードせず。

> URLencode("://")
[1] "://"
> URLencode("あいうえお")
[1] "%82%a0%82%a2%82%a4%82%a6%82%a8"

と思ったけど、第二引数をTRUEにしたらできた。

> URLencode("://", TRUE)
[1] "%3a%2f%2f"

まあ、エンコードせずとも通ったみたいなので、まあいっか。

というわけで、前回作成したニコニコ動画のデータフレームに、はてなブックマークの件数を追加することに。
nicoFrame3.txt
上記ファイル内を全て選択してコピーしたら以下のように記述。

> for(i in 1:100){
+     url <- paste("http://www.nicovideo.jp/watch/", nico.table[i,1], sep="")
+     url <- URLencode(url, TRUE)
+     if(i%%50==1){
+         urls <- paste("http://api.b.st-hatena.com/entry.counts?url=", url, sep="")
+     }else{
+         urls <- paste(urls, "&url=", url, sep="")
+     }
+     if(i==50){
+         hatebu.table <- fromJSON(file=urls)
+     }else if(i==100){
+         hatebu.table <- data.frame(hatebu.table, fromJSON(file=urls))
+     }
+ }
> for(i in 1:100){
+     url <- paste("http://www.nicovideo.jp/watch/", nico.table[i,1], sep="")
+     nico.table$hatebu[i] <- hatebu.table[url]
+ }
Error in `[.data.frame`(hatebu.table, url) : undefined columns selected
> hatebu.table[1] #列名が変わってしまっているよう
  http...www.nicovideo.jp.watch.sm20544568
1                                       44
> for(i in 1:100){
+     url <- paste("http...www.nicovideo.jp.watch.", nico.table[i,1], sep="")
+     nico.table$hatebu[i] <- hatebu.table[url]
+ }

:や/が.に変換されてしまったという。後、データは順番に入っているわけではないっぽい。どういう順番なんだろう? data.frameメソッドを使った時に、何か影響した可能性もありそうだけど。
さて、これをいつもどおりテキストファイルに出力しようと思ったものの、以下の様なエラーが。

> write.table(nico.table, "nicoFrame4.txt", quote=F, row.names=F, append=F, sep="\t")
Error in .External2(C_writetable, x, file, nrow(x), p, rnames, sep, eol,  : 
  unimplemented type 'list' in 'EncodeElement'

うーん・・・さっぱり分からない・・・。

とりあえず検索したら、r - Error writing to csv - Stack Overflowというページが引っかかったので、苦手な英語は読まずに(というより読めない)、なんとか下記のようにしたらうまく出力できた。

> newDF <- as.data.frame(lapply(nico.table,unlist))
> write.table(newDF, "nicoFrame4.txt", quote=F, row.names=F, append=F, sep="\t")

結果:nicoFrame4

うーん。Rのリストという概念がよく分からない。apply系のメソッドもよく分かってないし、もうちょっと勉強する必要がありそう。

コメント

タイトルとURLをコピーしました