对如何从该站点抓取数据感到困惑(使用 R)
stumped on how to scrape the data from this site (using R)
我正在尝试使用 R 从此站点抓取数据:
http://www.soccer24.com/kosovo/superliga/results/#
我可以做到以下几点:
library(rvest)
doc <- html("http://www.soccer24.com/kosovo/superliga/results/")
但我对如何真正获取数据感到困惑。这是因为网站上的实际数据似乎是由 Javascript 生成的。我能做的是
html_text(doc)
但这会给出一长串奇怪的文本(其中确实包含数据,但散布着奇怪的代码,我完全不清楚我将如何解析它。
我要提取的是所有比赛的比赛数据(日期、时间、球队、结果)。不需要此站点的其他数据。
任何人都可以提供一些关于如何从该网站提取数据的提示吗?
使用 Selenium
和 phantomjs
library(RSelenium)
pJS <- phantom()
remDr <- remoteDriver(browserName = "phantomjs")
appURL <- "http://www.soccer24.com/kosovo/superliga/results/#"
remDr$open()
remDr$navigate(appURL)
如果你想按下更多数据按钮直到它不可见(假定显示所有匹配项):
webElem <- remDr$findElement("css", "#tournament-page-results-more a")
while(webElem$isElementDisplayed()[[1]]){
webElem$clickElement()
Sys.sleep(5)
webElem <- remDr$findElement("css", "#tournament-page-results-more a")
}
doc <- htmlParse(remDr$getPageSource()[[1]])
删除不需要的回合数据并使用 XML::readHTMLTable
为简单起见
# remove unwanted rounds html. Sometimes there are end of season extra games.
# These are presented in a seperate table.
invisible(doc["//table/*/tr[@class='event_round']", fun = removeNodes])
appData <- readHTMLTable(doc, which = seq(length(doc["//table"])-1), stringsAsFactors = FALSE, trim = TRUE)
if(!is.data.frame(appData)){appData <- do.call(rbind, appData)}
row.names(appData) <- NULL
names(appData) <- c("blank", "Date", "hteam", "ateam", "score")
pJS$stop()
> head(appData)
blank Date hteam ateam score
1 01.04. 18:00 Ferronikeli Ferizaj 4 : 0
2 01.04. 18:00 Istogu Hajvalia 2 : 1
3 01.04. 18:00 Kosova Vushtrri Trepca Mitrovice 1 : 0
4 01.04. 18:00 Prishtina Drenica 3 : 0
5 31.03. 18:00 Besa Peje Drita 1 : 0
6 31.03. 18:00 Trepca 89 Vellaznimi 2 : 0
> tail(appData)
blank Date hteam ateam score
115 17.08. 22:00 Besa Peje Trepca 89 3 : 3
116 17.08. 22:00 Ferronikeli Hajvalia 2 : 5
117 17.08. 22:00 Trepca Mitrovice Ferizaj 1 : 0
118 17.08. 22:00 Vellaznimi Drenica 2 : 1
119 16.08. 22:00 Kosova Vushtrri Drita 0 : 1
120 16.08. 22:00 Prishtina Istogu 2 : 1
根据需要进行进一步格式化。
我正在尝试使用 R 从此站点抓取数据: http://www.soccer24.com/kosovo/superliga/results/#
我可以做到以下几点:
library(rvest)
doc <- html("http://www.soccer24.com/kosovo/superliga/results/")
但我对如何真正获取数据感到困惑。这是因为网站上的实际数据似乎是由 Javascript 生成的。我能做的是
html_text(doc)
但这会给出一长串奇怪的文本(其中确实包含数据,但散布着奇怪的代码,我完全不清楚我将如何解析它。
我要提取的是所有比赛的比赛数据(日期、时间、球队、结果)。不需要此站点的其他数据。
任何人都可以提供一些关于如何从该网站提取数据的提示吗?
使用 Selenium
和 phantomjs
library(RSelenium)
pJS <- phantom()
remDr <- remoteDriver(browserName = "phantomjs")
appURL <- "http://www.soccer24.com/kosovo/superliga/results/#"
remDr$open()
remDr$navigate(appURL)
如果你想按下更多数据按钮直到它不可见(假定显示所有匹配项):
webElem <- remDr$findElement("css", "#tournament-page-results-more a")
while(webElem$isElementDisplayed()[[1]]){
webElem$clickElement()
Sys.sleep(5)
webElem <- remDr$findElement("css", "#tournament-page-results-more a")
}
doc <- htmlParse(remDr$getPageSource()[[1]])
删除不需要的回合数据并使用 XML::readHTMLTable
为简单起见
# remove unwanted rounds html. Sometimes there are end of season extra games.
# These are presented in a seperate table.
invisible(doc["//table/*/tr[@class='event_round']", fun = removeNodes])
appData <- readHTMLTable(doc, which = seq(length(doc["//table"])-1), stringsAsFactors = FALSE, trim = TRUE)
if(!is.data.frame(appData)){appData <- do.call(rbind, appData)}
row.names(appData) <- NULL
names(appData) <- c("blank", "Date", "hteam", "ateam", "score")
pJS$stop()
> head(appData)
blank Date hteam ateam score
1 01.04. 18:00 Ferronikeli Ferizaj 4 : 0
2 01.04. 18:00 Istogu Hajvalia 2 : 1
3 01.04. 18:00 Kosova Vushtrri Trepca Mitrovice 1 : 0
4 01.04. 18:00 Prishtina Drenica 3 : 0
5 31.03. 18:00 Besa Peje Drita 1 : 0
6 31.03. 18:00 Trepca 89 Vellaznimi 2 : 0
> tail(appData)
blank Date hteam ateam score
115 17.08. 22:00 Besa Peje Trepca 89 3 : 3
116 17.08. 22:00 Ferronikeli Hajvalia 2 : 5
117 17.08. 22:00 Trepca Mitrovice Ferizaj 1 : 0
118 17.08. 22:00 Vellaznimi Drenica 2 : 1
119 16.08. 22:00 Kosova Vushtrri Drita 0 : 1
120 16.08. 22:00 Prishtina Istogu 2 : 1
根据需要进行进一步格式化。