libs <- c("bench", "tidyverse", "yaml", "rvest")
for (lib in libs) 
  require(lib, character.only = TRUE)
config <- read_yaml( "config.yaml" )

Rによるスクレイピング入門

Webページのタイトルを取得

read_htmlはHTMLドキュメントをDOM構造に 返還をしているらしい.

# HTMLをDOM変換
kabu_url <- "https://kabutan.jp/stock/kabuka?code=0000"
url_res <- read_html(kabu_url)
url_res
## {xml_document}
## <html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja">
## [1] <head>\n<meta http-equiv="Content-Type" content="text/html; charset= ...
## [2] <body>\r\n<!-- Google Tag Manager -->\r\n<noscript><iframe src="//ww ...

DOMの説明で次のような文章があったが, 「樹木のような階層構造」っていう言い方は通常通じるものなのだろうか? 樹木と構造がリンクするような知識の方には不要だし, はじめてHTMLを見る人には意味がわからない気がする.

DOMとは、HTMLの要素をを樹木のような階層構造に変換した者です.

読み込んだDOMからタイトルを抽出する.

# 本ではCSSセレクタが, html > head > titleになっている
url_title <- html_nodes(url_res, css = "head > title")
url_title
## {xml_nodeset (1)}
## [1] <title>日経平均 (日経平均) 【0000】:株価時系列データ [日々/週間/月間] | 株探</title>\n

抽出したタイトル要素から中身を抽出.

title <- html_text(url_title)
title
## [1] "日経平均 (日経平均) 【0000】:株価時系列データ [日々/週間/月間] | 株探"

一連の処理をパイプで記述すると次のようになる.

title2 <- 
  kabu_url %>% 
  read_html() %>% 
  html_nodes(css = "head > title") %>% 
  html_text()
title2
## [1] "日経平均 (日経平均) 【0000】:株価時系列データ [日々/週間/月間] | 株探"

スクレイピング実践

表を直接読み込む. XPathはChoromのデベロッパーツールから, 要素を右クリックすることで, Copy→Copy XPathを実行した結果を貼り付ける

kabuka <- 
  kabu_url %>%
  read_html() %>%
  html_node(xpath = '//*[@id="stock_kabuka_table"]/table[2]') %>%
  html_table()

head(kabuka)

複数のページから取得

複数ページにわたる表のアドレスをURLから推定し, そのURLに対してスクレイピングをする.

# アロケート
urls <- NULL
kabukas <- list()

# ベージ番号抜きのURLを用意
base_url <- "https://kabutan.jp/stock/kabuka?code=0000&ashi=day&page="

# ページ1~5に対して処理をする
for (i in 1:5) {
  pgnum <- as.character(i)
  urls[i] <- paste0(base_url, pgnum)
  
  kabukas[[i]] <- read_html(urls[i]) %>%
    html_node(xpath = '//*[@id="stock_kabuka_table"]/table[2]') %>% 
    html_table() %>% 
    dplyr::mutate_at("前日比", as.character)
  
  Sys.sleep(1)
}

dat <- dplyr::bind_rows(kabukas)

ブラウザの自動取得

e-Statの小地域境界(シェープファイル)が 逆ジオコーディングに使われているわしい?? 逆ジオコーディングにそんなめんどくさいことをしているのか? というか, 小地域統計境界がシェープファイルと呼ばれているわけでは ないのでないか?

といーか, RSeleniumがインストールできなかったので, 今回は諦める.

いつも思うのだけど, Rでスクレイピング系は再現できないことが多いので, Pythonに任せた方が良いと思う…

…と思ってたけど, サポートページで更新されていた.

インストール

install.packages("devtools")
library(devtools)
install_github("johndharrison/binman")
install_github("johndharrison/wdman")
install_github("ropensci/RSelenium", force=TRUE)

小地域統計をRSeleniumでダウンロードする. サーバを立ち上げようとすると, JAVAを いれろって怒られるので保留. やりたくなったらやる.

# chromeのドライバとSeleniumサーバの準備
# wdman::selenium(retcommand = TRUE)