ヘッダにべた書きされたjsonデータを取り出したいこと、あると思います。 そんな時はrvestとV8パッケージを使います。 まずはヘッダのjavascriptをrvestで取り出す。
library("rvest")
h <- html("http://runmeter.com/316fcda34d2b67ab/Run-20150307-1730")
js <- h %>% html_nodes("head script") %>% html_text()
ソースをみるとわかるが、今回欲しいデータは上記jsオブジェクトの4つ目に格納されている。 これをV8パッケージでjavascriptとして評価することでデータを取り出す。
library("V8")
ct <- new_context()
ct$eval(js[[4]])
javascriptとして評価されているオブジェクト一覧は以下のようにして確認できる。
ct$get(I("Object.keys(this)"))
## [1] "console" "print" "global" "ArrayBuffer"
## [5] "Int8Array" "Uint8Array" "Int16Array" "Uint16Array"
## [9] "Int32Array" "Uint32Array" "Float32Array" "Float64Array"
## [13] "DataView" "json" "jsonData" "jsonMap"
## [17] "kml"
jsonDataが目的のデータなのでget関数でRのオブジェクトに変換する。 あとは煮るなり焼くなり好きにしたら良い。
res <- ct$get("jsonData")
str(res)
## List of 11
## $ timeOffset: num [1:557] 8.4 16.7 31.5 57.2 102.2 ...
## $ runTime : num [1:557] 8.4 16.7 31.5 44.4 44.4 44.4 44.4 44.4 56.6 65.6 ...
## $ distance : num [1:557] 0 28.2 41.9 55.9 76.5 ...
## $ speed : num [1:557] 2.11 2.11 2.11 2.11 1.24 ...
## $ altitude : num [1:557] 20.6 24.8 32.1 44.4 44.4 44.4 44.4 44.4 50.6 53 ...
## $ ascent : num [1:557] 0 4.2 11.5 17.9 17.9 17.9 17.9 17.9 37.2 37.2 ...
## $ descent : num [1:557] 0 0 0 0 0 0 0 0 7.2 11.8 ...
## $ calories : int [1:557] 0 0 2 5 5 5 5 5 6 8 ...
## $ heartRate : int [1:557] 147 146 147 142 141 143 149 151 147 149 ...
## $ latitude : num [1:557] 35.7 35.7 35.7 35.7 35.7 ...
## $ longitude : num [1:557] 140 140 140 140 140 ...