で今や主流であるやを学ぶべく
を読んでいく。
なお以降で読み込むファイルは、本書著者が公開しているから取得した*1。
前回
2. スクレイピングによるデータ収集
状の情報をプログラミング・コードで取得することをスクレイピングといい、その方法を学んでいく。
2.1 スクレイピングに必要なWeb知識
スクレイピングにはおよびの知識が必要になる。
- :に何を表示させるかを記述するための言語
- :ドキュメントに肉付けするための言語
<html> <head> <title>タイトル</title> </head> <body> <h1>見出し1</h1> <li><a href="http://gihyo.jp/book">ページ1</a></li> <li><a href="http://kabutan.jp/stock/kabuka?code=0000"></li> </body> </html>
ドキュメントは基本的にという開始タグとという終了タグで囲む。この<>とで囲まれたセットで要素と呼ばれ、普通は要素同士を入れ子にする。開始タグ内で「属性=値」と表すことで、タグに属性を与える。スクレイピングを行なう場合、①特定の要素にアクセスしその中身を取り出す、②特定の属性にアクセスしその値を取り出す、のいずれかを行う。
- の例
<html> <head> <title>タイトル</title> <link rel="stylesheet" href="example.css"> </head> <body> <h1>見出し1</h1> <li><a href="https://gihyo.jp/book">ページ1</a></li> <li><a href="https://kabutan.jp/stock/kabuka?code=0000">ページ2</a></li> <h2>見出し2</h2> <p class="ex1">classの例</p> <p id="ex2">idの例</p> </body> </html>
- の例
h2 { font-style: italic; background: yellow; } p.ex1{ color: red; } p#ex2{ border: 1px solid; color: blue; }
を用いるには、ファイルを用意し、ファイルとは分けて管理することが多い。
2.2 XMLとXPath
を用いることでセレクタ*2と同じことができる。はタグを自分で定義できる。
<?xml version="1.0" encoding="UTF-8> <foods> <food> <name>メロン</name> <color>緑</color> </food> <food> <name>リンゴ</name> <color>紫</color> </food> </foods>
はのようなタグの入れ子構造があり、この特定の箇所にアクセスするための構文がである。
2.3 Rによるスクレイピング入門
スクレイピングの大きな流れは、「を読み込み、中の要素または属性にアクセスして値を取得する」である。でスクレイピングするには、パッケージを用いるのが代表的である。
library("rvest") # まずはread_html()関数でスクレイピング対象のURLを読み込む kabu_url <- "http://kabutan.jp/stock/kabuka?code=0000" # スクレイピングしたいURLを読み込む url_res <- read_html(kabu_url) url_res # URLの読み込み結果から、title要素を抽出 url_title <- html_element(url_res, css = "head > title") url_title title <- html_text(url_title) title ### 以上は以下のようにまとめて書ける title2 <- read_html(kabu_url) %>% html_element(css = "head > title") %>% html_text() # Ctrl+Shift+Mで%>%を挿入できる kabuka <- read_html(kabu_url) %>% # コピーしたXPathを指定 html_element(xpath = "//*[@id='stock_kabuka_table']/table[2]") %>% html_table() head(kabuka,10)
_関数で読み込むとサイトを( )に変換する
### 複数の頁から取得する urls <- NULL kabukas <- list() # page番号抜きのURLを用意する base_url <- "https://kabutan.jp/stock/kabuka?code=0000&ashi=day&page=" # 1~5に対して同じ処理を行う for (i in 1:5){ # Pageの番号付きURLを作成 pgnum <- as.character(i) urls[i] <- paste0(base_url, pgnum) # 各URLにスクレイピングを実行 kabukas[[i]] <- read_html(urls[i]) %>% html_element(xpath = "//*[@id='stock_kabuka_table']/table[2]") %>% html_table() %>% # 前日比の列は一旦文字列に変換 dplyr::mutate(前日比 = as.character(前日比)) # 1頁取得したら1秒停止 Sys.sleep(1) } dat <- dplyr::bind_rows(kabukas) str(dat)