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]]』が外部ポインターオブジェクトというものらしいのですが、まだよく分からないでいます・・・。
コメント