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

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

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

library("XML")
hatebu <- htmlParse("http://b.hatena.ne.jp/entrylist?url=http%3A%2F%2Fwww.nicovideo.jp%2F")
nicohatebu <- data.frame()
len <- length(getNodeSet(hatebu, "//h3/a"))
for(i in 1:len){
  title <- xmlValue(getNodeSet(hatebu, "//h3/a")[[i]])
  url <- xmlGetAttr(getNodeSet(hatebu, "//h3/a")[[i]],"href")
  users <- xmlGetAttr(getNodeSet(hatebu, "//li[@data-bookmark-count]")[[i]],"data-bookmark-count")
  entry.frame <- (data.frame(title=title,url=url,users=users))
  nicohatebu <- rbind(nicohatebu, entry.frame)
}
write.table(nicohatebu, "nicohatebu.txt", quote=F, row.names=F, append=F, sep="\t")

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

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

> li <- getNodeSet(hatebu, "//li[@data-bookmark-count]")
> getNodeSet(li[[1]],"//h3/a")
[[1]]
<a href="http://www.nicovideo.jp/watch/sm22475435" class="entry-link" title="【疑似m@s】割と熱湯のお風呂 ‐ ニコニコ動画:GINZA" data-entryrank="1" data-track-click-target="direct">【疑似m@s】割と熱湯のお風呂 ‐ ニコニコ動画:GINZA</a> 

[[2]]
<a href="http://www.nicovideo.jp/watch/sm22476058" class="entry-link" title="【初音ミク】花葬【オリジナル曲】 ‐ ニコニコ動画:GINZA" data-entryrank="2" data-track-click-target="direct">【初音ミク】花葬【オリジナル曲】 ‐ ニコニコ動画:GINZA</a> 

[[3]]
<a href="http://www.nicovideo.jp/watch/sm22480113" class="entry-link" title="戦前Pランキング2013 ‐ ニコニコ動画:GINZA" data-entryrank="3" data-track-click-target="direct">戦前Pランキング2013 ‐ ニコニコ動画:GINZA</a> 

[[4]]
<a href="http://www.nicovideo.jp/watch/sm22479860" class="entry-link" title="マミマミマジカルショウ ‐ ニコニコ動画:GINZA" data-entryrank="4" data-track-click-target="direct">マミマミマジカルショウ ‐ ニコニコ動画:GINZA</a> 

[[5]]
<a href="http://www.nicovideo.jp/watch/sm22478322" class="entry-link" title="【初音ミク】愛迷エレジー【オリジナル曲】 ‐ ニコニコ動画:GINZA" data-entryrank="5" data-track-click-target="direct">【初音ミク】愛迷エレジー【オリジナル曲】 ‐ ニコニコ動画:GINZA</a> 

[[6]]
<a href="http://www.nicovideo.jp/watch/1387171534" class="entry-link" title="ゴールデンタイム 第11話「トラブルパーティ」 ‐ ニコニコ動画:GINZA" data-entryrank="6" data-track-click-target="direct">ゴールデンタイム 第11話「トラブルパーティ」 ‐ ニコニコ動画:GINZA</a> 

[[7]]
<a href="http://www.nicovideo.jp/watch/1387336936" class="entry-link" title="良子と佳奈のカミングバック to the アマガミ!! ‐ ニコニコ動画:GINZA" data-entryrank="7" data-track-click-target="direct">良子と佳奈のカミングバック to the アマガミ!! ‐ ニコニコ動画:GINZA</a> 

[[8]]
<a href="http://www.nicovideo.jp/watch/sm22478268" class="entry-link" title="【初音ミク】You-la-la U-la-la【オリジナル】 ‐ ニコニコ動画:GINZA" data-entryrank="8" data-track-click-target="direct">【初音ミク】You-la-la U-la-la【オリジナル】 ‐ ニコニコ動画:GINZA</a> 

[[9]]
<a href="http://www.nicovideo.jp/watch/sm22476384" class="entry-link" title="艦これでポポポポーン ‐ ニコニコ動画:GINZA" data-entryrank="9" data-track-click-target="direct">艦これでポポポポーン ‐ ニコニコ動画:GINZA</a> 

[[10]]
<a href="http://www.nicovideo.jp/watch/sm22475220" class="entry-link" title="【怒り新党】ついに新・3大調査会で淫夢が取り上げられる【修正】 ‐ ニコニコ動画:GINZA" data-entryrank="10" data-track-click-target="direct">【怒り新党】ついに新・3大調査会で淫夢が取り上げられる【修正】 ‐ ニコニコ動画:GINZA</a> 

[[11]]
<a href="http://www.nicovideo.jp/watch/1387163039" class="entry-link" title="【世界でいちばん強くなりたい!】11話 「ピュアソウル!」 ‐ ニコニコ動画:GINZA" data-entryrank="11" data-track-click-target="direct">【世界でいちばん強くなりたい!】11話 「ピュアソウル!」 ‐ ニコニコ動画:GINZA</a> 

[[12]]
<a href="http://www.nicovideo.jp/watch/1386901567" class="entry-link" title="アウトブレイク・カンパニー 第10話「魔法少女ペトラルカ」 ‐ ニコニコ動画:GINZA" data-entryrank="12" data-track-click-target="direct">アウトブレイク・カンパニー 第10話「魔法少女ペトラルカ」 ‐ ニコニコ動画:GINZA</a> 

[[13]]
<a href="http://www.nicovideo.jp/watch/sm22474644" class="entry-link" title="┗|∵|┓病名恋ワズライ/HoneyWorks feat.GUMI ‐ ニコニコ動画:GINZA" data-entryrank="13" data-track-click-target="direct">┗|∵|┓病名恋ワズライ/HoneyWorks feat.GUMI ‐ ニコニコ動画:GINZA</a> 

[[14]]
<a href="http://www.nicovideo.jp/watch/sm22472003" class="entry-link" title="【MikuMikuDance】2013の物理演算スカートの集大成【2013】 ‐ ニコニコ動画:GINZA" data-entryrank="14" data-track-click-target="direct">【MikuMikuDance】2013の物理演算スカートの集大成【2013】 ‐ ニコニコ動画:GINZA</a> 

[[15]]
<a href="http://www.nicovideo.jp/watch/sm22474723" class="entry-link" title="【MMD】ミクモデルつくりました ‐ ニコニコ動画:GINZA" data-entryrank="15" data-track-click-target="direct">【MMD】ミクモデルつくりました ‐ ニコニコ動画:GINZA</a> 

[[16]]
<a href="http://www.nicovideo.jp/watch/1387182915" class="entry-link" title="ミス・モノクローム-The Animation-  第12話「IDOL」 ‐ ニコニコ動画:GINZA" data-entryrank="16" data-track-click-target="direct">ミス・モノクローム-The Animation-  第12話「IDOL」 ‐ ニコニコ動画:GINZA</a> 

[[17]]
<a href="http://www.nicovideo.jp/watch/sm22467044" class="entry-link" title="From Beyond the Horizon ‐ ニコニコ動画:GINZA" data-entryrank="17" data-track-click-target="direct">From Beyond the Horizon ‐ ニコニコ動画:GINZA</a> 

[[18]]
<a href="http://www.nicovideo.jp/watch/sm22472909" class="entry-link" title="【MAD】ぷちすまいりー ‐ ニコニコ動画:GINZA" data-entryrank="18" data-track-click-target="direct">【MAD】ぷちすまいりー ‐ ニコニコ動画:GINZA</a> 

[[19]]
<a href="http://www.nicovideo.jp/watch/sm22473930" class="entry-link" title="【PBoyP@rk'13】 Badboy flygirl 【J4U!!!】 ‐ ニコニコ動画:GINZA" data-entryrank="19" data-track-click-target="direct">【PBoyP@rk'13】 Badboy flygirl 【J4U!!!】 ‐ ニコニコ動画:GINZA</a> 

[[20]]
<a href="http://www.nicovideo.jp/watch/sm22470840" class="entry-link" title="シンデレラ幻想奇譚 その191 うづパカと智絵里【緒方智絵里】" data-entryrank="20" data-track-click-target="direct">シンデレラ幻想奇譚 その191 うづパカと智絵里【緒方智絵里】</a> 

attr(,"class")
[1] "XMLNodeSet"

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

コメント

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