2016.10.05 Wed |
Rでwebscraping
皆さんは、webscrapingという言葉をご存じでしょうか?
scrapeという英単語が”削り取る”という意味なので、”webから何かを削り取ってくる”という意味で大体あってます。
webscrapingとは、webpageから、特定の数値やテキストをとってくることを言います。
ほしいテキストや数値の数が対して多くない場合は、手作業でコピペすればよいのですが、その数が膨大な時、もしくはルーティーンワークの時は、機械に任せてしまいたいですね。

webscrapingというと、例えば、PythonのRobobrowserやbeautiful soupが有名ですが、今回は、Rでデータ解析する方がデータ取得と解析をシームレスに行えるように、Rでのwebscrapingをご紹介します!
使用するのは、rvestパッケージです。
以下コマンドをコピペしていけば実際に実行できるので試してみてください。
まずは、rvestパッケージのダウンロード・インストールからです。
install.packages(“rvest”,dependencies=T)
library(rvest)
では、実際にwebpageを読み込んでみましょう!
今回はrvestのサンプルコードにもあるwebsiteから始めたいと思います。
http://www.imdb.com/title/tt1490017/

たとえばこのページの上真ん中の方にある、7.8という数字を取ってきたいとしましょう。
通常であればこの後、まずこのページのソースコードを表示させます。
webpageの中で、右クリックして、ソースコードを表示を選択してください。
下のように出てくるはずです(下ではさらにControl+Fで7.8をサイト内検索してます)。

これで、ほしい数字がどんなHTMLタグに囲まれているかわかりました。
これを見て、XPath またはCSS selectorを適切に使用します。
しかし初心者には厳しいので、もっと簡単にやりましょう。
Selector Gadgetを使用します。
http://selectorgadget.com/

これはGoogleChromeなどのwebbrowserの拡張機能に追加できるものです。
(このブラウザ拡張機能の使用は自己責任でお願いします)
tutorialもあるので、その通りやればよいです。
この機能の追加はまずしたリンク先に飛んでください。そこでADD TO CHROMEを押せば追加できます。
https://chrome.google.com/webstore/detail/selectorgadget/mhjhnkcfbdhnjickkkdbjoemdmbfginb?hl=en

それでは先ほどのページに戻りましょう。ソースコードの表示は必要ありません。
http://www.imdb.com/title/tt1490017/

繰り返しになりますが、ここで、上真ん中にある、7.8という数値がほしいとしましょう。
こんなページがたくさんあって、この位置にある数字がほしいということです。
まず、このページを表示したら、右上の虫眼鏡のところを左クリックします。

次にwebpage上のほしいところ、この場合だと、7.8にカーソルを合わせてみましょう。

7.8のところが黄色く囲われて、下にstrongと表示されているのが分かります。
それでは7.8を左クリックしてみましょう。

ほしい、7.8という数字が黄緑色になり、他のいくつかのところも黄色く表示されました。
下の方を見てみると、spanと書いてあります。

spanという条件だと、黄緑色のところだけでなくこの黄色のところもすべてとってきてしまうことになります。
なので、もっと厳しい条件にしないといけません。
上真ん中あたりの ”(2014)”を左クリックして除去しましょう。
下のようになります。

これで後は、7.8の数字の右にある数字を除去すればいいだけですね。
いらないものを左クリックしてみましょう。

これで、下のClearの数字が1になったので、ほしいものだけ取り出せる条件が得られました!
strong spanです!
では、まずこのwebpageをRで読み込むことからやっていきましょう。
使用する関数は、read_htmlです。
lego_movie <- read_html(“http://www.imdb.com/title/tt1490017/”)
これで、lego_movieに先ほどのwebpageが読み込まれました。
lego_movie
と入力してみて、中身を見てみましょう。

二つのリストとして読み込まれていますね。
次に、データが格納されているlego_movieから目的の数字を取ってきます。
html_nodeという関数と、さきほど導き出した、”strong span”という条件を使います。
ここで注意点なのですが、rvestでは、条件をnestせずにpipe処理します。magrittrパッケージでのpipe処理です。
たとえばAというデータに、B,C,Dという順で処理をかけていきXという変数に代入するとき、
nestするとは、
X<-D(C(B(A)))
のように記述するのですが、
pipe処理するとは、
X<- A %>% B %>% C %>% D
のように書きます。
magrittrパッケージはrvestパッケージのダウンロードの時にdependencies=Tで入れていれば、ダウンロードはできているはずなので、library(magrittr)から書き始めましょう。
library(magrittr)
rating <- lego_movie %>%
html_nodes(“strong span”) %>%
html_text() %>%
as.numeric()
rating

html_nodes(“strong span”)
でhtmlデータのからほしいところを取り出し、
html_text()
でその中からテキストだけ取り出し、
as.numeric()
で実数型に変換しています。
どうでしょうか?
結構簡単そうにみえますね!
しかし、実際は結構大変です。
知識として必要なのが
1、HTML
2、CSS
3、pipe処理
4、XPathまたはCSS Selector(SelectorGadgetで学習コストは軽減する)
それに加え、Rとrvestの知識が必要です。
また今回はhtmlで書かれたものをscrapingしましたが、もしJapaScriptで書かれていた場合は、さらに、phantomJSの知識が必要です。
多少ツールを使うと楽になるとはいえ、それなりに大変です。
メリットも大きいので仕方ないですね。
webscrapingだけで生計をたてられている人もたくさんいるわけですから。
それなりに有名な企業のコア技術だったりもするので侮れません。
それでは今日はここまで。
何かご質問があれば下記まで、
machine.learning.r@gmail.com
鈴木瑞人
東京大学大学院 新領域創成科学研究科 メディカル情報生命専攻 博士課程1年
一般社団法人Bizjapan
東京大学機械学習勉強会