Contents
R言語でのwebスクレピング
R言語で実際にウェブ上のHTML・XML形式のデータを取得するwebスクレイピングを行う際には、「rvest」というパッケージがオススメです。
rvestパッケージは、HTMLやXMLからデータを検索・抽出するための言語であるxpath(XML Path Language)をRで簡単に実行するために作られたパッケージで、このrvestによってr言語でWebサイトの情報を取得(スクレイピング)できるようになると共にその取得した情報の整理が簡単に行えるようになります。
Rvestのインストールと読み込み
#Rvestのインストールの読み込み >install.packages("rvest") >library(rvest)
RvestでHTMLデータを取得する
まず例として簡単なHTMLで構成されたwebサイト(https://ishidamotohiro.github.io/sample_check/simple.html)を読み込みます。
アクセスすれば分かりますが、なんか仕込んでるのか疑うレベルの本当に単純なやつです。では実際にこのサイトのHTMLを収集します。rvestパッケージでは「read_html()」という関数でwebサイトのHTMLデータを取得できます。そして、収集したデータをsimpleというオブジェクトに保存します。
#https:~simple.htmlのデータをsimpleという変数に保存する
> simple
<- read_html("https://IshidaMotohiro.github.io/sample_check/simple.html")
これでサイトのデータ取得できたはずなので、オブジェクトにアクセスして確認してみます。
> simple
{xml_document}
<html>
[1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset=UTF ...
[2] <body>\n <h1>大見出し</h1>\n <a href="http://www.okadajp.org/RWiki/"> ...
Rのデータってサンプルデータみたいな行列で区切られたデータが一般的なので、ちょっと意味が分からないというのが初めて見た感想だと思いますが、これはHTMLをツリー状で表現するDOMという形式で保存されています。そしてDOM内の要素をノードと言います。
例
html ↓ →head →title(ページタイトル) →body →h1(見出し)
取得したhtmlデータから特定のノードを抽出する
それではRを使ってノード(要素)を検索していきます。rvestパッケージでは「html_nodes()」という関数でノードの検索・抽出ができます。またDOMの操作には、dplyrパッケージをインストールすると使えるパイプ演算子(%<%)が便利です。
まず見出し要素(h1)を抽出してみます。
> simple %>% html_nodes("h1")
{xml_nodeset (1)}
[1] <h1>大見出し</h1>
タグを抜いて文字列だけを抽出したい場合は、「html_text()」関数を使います。
> simple %>% html_nodes("h1") %>% html_text() [1] "大見出し"
取得したHTMLからリンクを抽出する
次にリンクを抽出します。リンクはノード内では<a=href~”リンクURL”>リンクタイトル</a>という形で保存されており、これを取り出すには「html_attrs()」という関数を使います。
> simple %>% html_nodes(“a”) %>% html_attrs()
1
href
“http://www.okadajp.org/RWiki/“2
href target
“http://rmecab.jp” “_blank”>
> simple %>% html_nodes(“a”) %>% html_attr(“href”)
[1] “http://www.okadajp.org/RWiki/” “http://rmecab.jp”
>
見出しとリンクはこのようにして抽出することができます。今度はは実際に「Rvest」を使ってWikipedia のサイトの情報を取得し必要な情報だけ抽出していきます。
まとめ
・RでWebスクレイピングするには、rvest
・HTMLの読み込み⇨read_html()
・特定タグの抽出⇨html_nodes(“h1”)
・パイプ演算子 %>%
・タグを抜いて文字列だけを抽出したいとき⇨html_text()
・リンク抽出⇨html_attrs()
以上がwebスクレイピングとhtml解析の基本ですが、実務でいちいち1ページずつスクレイピングしていてはキリがないので、基本的には一括でスクレイピングします。大量のwebページをfor文を使って一気にスクレイピングする方法は以下の記事に書きましたので興味のある方はぜひ読んでみてください。
コメント