「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年12月10日改訂)。

MENU

Rでtidyverseを活用する(その02/X)

 \mathrm{R}で今や主流である\mathrm{RStudio}\mathrm{tidyverse}を学ぶべく

を読んでいく。
 なお以降で読み込むファイルは、本書著者が公開している\mathrm{gitHub}から取得した*1

2. スクレイピングによるデータ収集

 \mathrm{Web}状の情報をプログラミング・コードで取得することをスクレイピングといい、その方法を学んでいく。

2.1 スクレイピングに必要なWeb知識

 スクレイピングには\mathrm{HTML}および\mathrm{CSS}の知識が必要になる。

  • \mathrm{HTML}\mathrm{Web}に何を表示させるかを記述するための言語
  • \mathrm{CSS}\mathrm{HTML}ドキュメントに肉付けするための言語
<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>

\mathrm{HTML}ドキュメントは基本的にという開始タグとという終了タグで囲む。この<>とで囲まれたセットで\mathrm{html}要素と呼ばれ、普通は要素同士を入れ子にする。開始タグ内で「属性=値」と表すことで、タグに属性を与える。スクレイピングを行なう場合、①特定の要素にアクセスしその中身を取り出す、②特定の属性にアクセスしその値を取り出す、のいずれかを行う。

  • \mathrm{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>
  • \mathrm{CSS}の例
h2 {
    font-style: italic;
    background: yellow;
}
p.ex1{
    color: red;
}

p#ex2{
    border: 1px solid;
    color: blue;
}

 \mathrm{CSS}を用いるには、\mathrm{CSS}ファイルを用意し、\mathrm{HTML}ファイルとは分けて管理することが多い。

2.2 XMLXPath

 \mathrm{XPath}を用いることで\mathrm{CSS}セレクタ*2と同じことができる。\mathrm{XML}はタグを自分で定義できる。

<?xml version="1.0" encoding="UTF-8>
<foods>
   <food>
      <name>メロン</name>
      <color>緑</color>
   </food>

   <food>
      <name>リンゴ</name>
      <color>紫</color>
   </food>
</foods>

 \mathrm{XML}\mathrm{HTML}のようなタグの入れ子構造があり、この特定の箇所にアクセスするための構文が\mathrm{XPath}である。

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

 スクレイピングの大きな流れは、「\mathrm{URL}を読み込み、\mathrm{HTML}中の要素または属性にアクセスして値を取得する」である。\mathrm{R}スクレイピングするには、\mathrm{rvest}パッケージを用いるのが代表的である。

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)

\mathrm{read}_\mathrm{html}関数で読み込むとサイトを\mathrm{DOM}(\mathrm{Document} \mathrm{Object} \mathrm{Model})に変換する

### 複数の頁から取得する
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)
プライバシーポリシー お問い合わせ