、データがHTMLへをレンダリングされます。サーバーから直接HTML経由で配信されることはありません。したがって、(a)レンダリングされたコンテンツを擦るためにRSelenium
のようなものを使用するか、または(b)データを含む<script>
タグからデータを抽出することができます。
@ agstudyの仕事について説明するために、データは一連のstopArray.push()
コマンド(多くの)スクリプトタグの1つに含まれていることがわかりました。たとえば:
stopArray.push({
"id" : "562310",
"name" : "Chicago Amtrak: 225 S Canal St, IL 60606",
"shortName" : "Chicago Amtrak, IL",
"ticketName" : "CHD",
"category" : 2,
"linkName" : "Chicago_Amtrak_IL",
"direction" : "empty",
"lat" : 41.87858963012695,
"lon" : -87.63985443115234,
"polyline" : "elr~Fnb|[email protected]@[email protected][email protected][email protected]`[email protected]`CCzBC~BE|CEdCA^[email protected]"
});
さて、これは各関数呼び出しの内部に含まれるjson
データです。私は誰かが機械可読フォーマットでデータをフォーマットする作業に踏み込んだとしても、それを感謝しなければならないと思う傾向があります。次のようにこの問題への
tidyverse
アプローチがある:
- は
rvest
パッケージを使用してページをダウンロードしてください。
- 文字
url =
を含むscript
タグをすべて検索するxpath
式を使用して、使用する適切なscript
タグを特定します。
- 正規表現を使用して、各
stopArray.push()
コール内のすべてを引き出します。
- (a)各ブロックをカンマで区切って、(b)
[]
で文字列を囲んでjson
のリストを示すように、結果のオブジェクトの書式設定を修正します。
jsonlite::fromJSON
を使用してdata.frame
に変換してください。
最後に近いpolyline
列は、あまりにも大きすぎるため適切ではないため、非表示にします。
library(tidyverse)
library(rvest)
library(stringr)
library(jsonlite)
url <- "http://bustracker.greyhound.com/routes/4511/I/Chicago_Amtrak_IL-Cincinnati_OH/4511/10-26-2016"
page <- read_html(url)
page %>%
html_nodes(xpath = '//script[contains(text(), "url = ")]') %>%
html_text() %>%
str_extract_all(regex("(?<=stopArray.push\\().+?(?=\\);)", multiline = T, dotall = T), F) %>%
unlist() %>%
paste(collapse = ",") %>%
sprintf("[%s]", .) %>%
fromJSON() %>%
select(-polyline) %>%
head()
#> id name
#> 1 562310 Chicago Amtrak: 225 S Canal St, IL 60606
#> 2 560252 Chicago: 630 W Harrison St, IL 60607
#> 3 561627 Chicago 95th & Dan Ryan: 14 W 95th St, IL 60628
#> 4 260337 Gary: 100 W 4th Ave, IN 46402
#> 5 260447 Lafayette (e): 401 N 3rd St, IN 47901
#> 6 260392 Indianapolis: 350 S Illinois St, IN 46225
#> shortName ticketName category
#> 1 Chicago Amtrak, IL CHD 2
#> 2 Chicago, IL CHD 2
#> 3 Chicago 95th & Dan Ryan, IL CHD 1
#> 4 Gary, IN GRY 2
#> 5 Lafayette (e), IN XIN 1
#> 6 Indianapolis, IN IND 2
#> linkName direction lat lon
#> 1 Chicago_Amtrak_IL empty 41.87859 -87.63985
#> 2 Chicago_IL empty 41.87485 -87.64352
#> 3 Chicago_95th_&_Dan_Ryan_IL empty 41.72233 -87.62473
#> 4 Gary_IN empty 41.60392 -87.33869
#> 5 Lafayette_e_IN empty 40.42098 -86.89420
#> 6 Indianapolis_IN empty 39.76178 -86.16102
ありがとうございました。私は間違っていたところを多く説明しました。また、@Michael Griffithsから、stopArray自体がデータをどのように格納しているのかがわかります。そこからGreyhoundウェブサイトがテーブルの値の大部分(停止名や住所など)にどのように入力されているかがわかります。 ソースコードを見ると、ウェブサイトがスケジュールとステータスのタイミングをどこから取得したのか正確に特定するのに問題があります。 – sdr1975