使用R刮取HTML网页

时间:2017-08-25 23:23:39

标签: html r function web-scraping

我正试图在cover.com上搜索每个MLB团队的结果,可以追溯到2007年。可以在这里找到一个示例页面:http://www.covers.com/pageLoader/pageLoader.aspx?page=/data/mlb/teams/pastresults/2016/team2979.html

我有以下代码:

for (year in 2007:2016) {
    for (id in 2955:2984){
        url <- paste0("http://www.covers.com/pageLoader/pageLoader.aspx?page=/data/mlb/teams/pastresults/", year, "/team", id, ".html")
    data <- readHTMLTable(url, stringsAsFactors = FALSE)
    data <- data[[1]]
    data$year <- year
    data$id <- id
    }
}

乍一看有效,但只返回一个数据框,其中包含9个变量的9个观测值,这些变量是2016年10月多伦多9场季后赛的比赛。显然,我在这里缺少一些东西?任何帮助深表感谢!提前谢谢!

2 个答案:

答案 0 :(得分:2)

每次获得新数据时,您都会覆盖旧数据。你需要追加它。我还必须在这里做一点点黑客,因为你试图加载的300个表名称略有不一致。此外,下载300张桌子花了太长时间,所以我改变了你的限制,只让两支球队连续两年。如果您确信它正在工作,您可以将其更改为全部300.

尽量贴近您的代码:

library("XML")
data = c()
for (year in 2007:2008) {
    for (id in 2955:2956){
            url <- paste0("http://www.covers.com/pageLoader/pageLoader.aspx?page=/data/mlb/teams/pastresults/", 
                year, "/team", id, ".html")
            temp <- readHTMLTable(url, stringsAsFactors = FALSE)
            temp <- temp[[1]]
            temp$year <- year
            temp$id <- id
        if(is.data.frame(data)) { 
            names(temp) = names(data)
            data = rbind(data, temp) 
        } else {
            data=temp
        }
    }
}
dim(data)
[1] 498   9

答案 1 :(得分:0)

另一种选择:

data <- lapply(2007:2016,function(x){
    lapply(2955:2956,function(y){
    url <- paste0("http://www.covers.com/pageLoader/pageLoader.aspx?page=/data/mlb/teams/pastresults/", x, "/team", y, ".html")
    readHTMLTable(url, stringsAsFactors = FALSE)
        })
})

names(data) <- paste0("x",as.character(2007:2016))
for(i in paste0("x",as.character(2007:2016))) names(data[[i]]) <- paste0("x",as.character(2955:2956))

您的数据将在之后称为数据的嵌套列表中。然后,您可以使用:data$x2007$x2955访问每个表,因为它是嵌套列表。