彼得表示,您可以使用Selenium做到这一点。我还喜欢使用出色的选择器程序包。 其想法是与网站进行短暂交互,然后在其他地方进行其余操作。squawkData应该包含所需的一切。
# RSelenium::startServer() # if needed
require(RSelenium)
remDr <- remoteDriver()
remDr$open()
remDr$setImplicitWaitTimeout(3000)
remDr$navigate("http://epl.squawka.com/stoke-city-vs-arsenal/01-03-2014/english-barclays-premier-league/matches")
squawkData <- remDr$executeScript("return new XMLSerializer().serializeToString(squawkaDp.xml);", list())
require(selectr)
example <- querySelectorAll(xmlParse(squawkData[[1]]), "crosses time_slice")
example[[1]]
<time_slice name="0 - 5" id="1">
<event player_id="531" mins="4" secs="39" minsec="279" team="44" type="@R_301_1455@">
<start>73.1,87.1</start>
<end>97.9,49.1</end>
</event>
</time_slice>
免责声明我是RSelenium软件包的作者。可以在RSelenium基础知识和RSelenium:Testing Shiny应用程序中查看有关操作的基本信息。
使用选择器可以轻松访问更多信息:
> xmlValue(querySelectorAll(xmlParse(squawkData[[1]]), "players #531 name")[[1]])
[1] "Charlie Adam"
> xmlValue(querySelectorAll(xmlParse(squawkData[[1]]), "game team#44 long_name")[[1]])
[1] "Stoke City"
更新: 要将示例处理为数据框,您可以执行以下操作
out <- lapply(example, function(x){
# handle each event
if(length(x['event']) > 0){
res <- lapply(x['event'], function(y){
matchAttrs <- as.list(xmlAttrs(y))
matchAttrs$start <- xmlValue(y['start']$start)
matchAttrs$end <- xmlValue(y['end']$end)
matchAttrs
})
return(do.call(rbind.data.frame, res))
}
}
)
> head(do.call(rbind, out))
player_id mins secs minsec team type start end
event 531 4 39 279 44 @R_301_1455@ 73.1,87.1 97.9,49.1
event5 311 6 33 393 31 @R_301_1455@ 92.3,13.1 93.0,31.0
event1 376 8 57 537 31 @R_301_1455@ 97.7,6.1 96.7,16.4
event6 311 13 50 830 31 @R_301_1455@ 99.5,0.5 94.9,42.6
event11 311 14 11 851 31 @R_301_1455@ 99.5,0.5 93.1,51.0
event7 311 17 41 1061 31 @R_301_1455@ 99.5,99.5 92.6,50.1