首页 文章

使用R刮取多个页面的HTML表格

提问于
浏览
4

我试图通过从网上抓取来制作数据框 . 但是有很多页面组成了我试图 grab 的表格 . 相同的链接,但页面是不同的 .

对于第一页,我就是这样做的:

library(XML)
CB.13<- "http://www.nfl.com/stats/categorystats?tabSeq=1&season=2013&seasonType=REG&experience=&Submit=Go&archive=false&conference=null&d-447263-p=1&statisticPositionCategory=DEFENSIVE_BACK&qualified=true"
CB.13<- readHTMLTable(CB.13, header=FALSE)
cornerback.function<- function(CB.13){
  first<- "1"
  last<- "1"
  for (i in 1:length(CB.13)){
    lastrow<- nrow(CB.13[[i]])
    lastcol<- ncol(CB.13[[i]])
    if(as.numeric(CB.13[[i]] [1,1]) ==first & as.numeric(CB.13[[i]] [lastrow, lastcol]) ==last) {
      tab <- i
    }
  }
}
cornerback.function(CB.13)
cornerbacks.2013<- CB.13[[tab]]
cb.names<- c("Rk", "name", "Team", "Pos", "Comb", "Total", "Ast", "Sck", "SFTY", "PDef", "Int", "TDs", "Yds", "Lng", "FF", "Rec", "TD")
names(cornerbacks.2013)<- cb.names

我需要多年这样做,所有这些都有多个页面 - 所以有更快的方法来获取数据的所有页面而不必为表格的每个页面执行此操作并合并它们吗?下一个链接是http://www.nfl.com/stats/categorystats?tabSeq=1&season=2013&seasonType=REG&Submit=Go&experience=&archive=false&conference=null&d-447263-p=2&statisticPositionCategory=DEFENSIVE_BACK&qualified=true

今年有8页 - 也许是for循环遍历页面?

1 回答

  • 7

    您可以使用 paste0 动态创建网址,因为它们略有不同 . 在某一年中,您只需更改页码 . 你得到一个网址结构,如:

    url <- paste0(url1,year,url2,page,url3) ## you change page or year or both
    

    您可以创建一个循环遍历不同页面的函数,并返回一个表 . 然后你可以使用经典 do.call(rbind,..) 绑定它们:

    library(XML)
    url1 <- "http://www.nfl.com/stats/categorystats?tabSeq=1&season="
    year <- 2013
    url2 <- "&seasonType=REG&experience=&Submit=Go&archive=false&conference=null&d-447263-p="
    page <- 1
    url3 <- "&statisticPositionCategory=DEFENSIVE_BACK&qualified=true"
    
    getTable <- 
      function(page=1,year=2013){
        url <- paste0(url1,year,url2,page,url3)
        tab = readHTMLTable(url,header=FALSE) ## see comment !!
        tab$result
    }
    ## this will merge all tables in a single big table
    do.call(rbind,lapply(seq_len(8),getTable,year=2013))
    

    一般方法

    一般方法是使用一些xpath标记废弃下一页url并循环直到没有任何新的下一页 . 这可能更难做到,但它是最干净的解决方案 .

    getNext <- 
    function(url=url_base){
      doc <- htmlParse(url)
      XPATH_NEXT = "//*[@class='linkNavigation floatRight']/*[contains(., 'next')]"
      next_page <- unique(xpathSApply(doc,XPATH_NEXT,xmlGetAttr,'href'))
      if(length(next_page)>0)
        paste0("http://www.nfl.com",next_page)
      else ''
    }
    ## url_base is your first  url
    res <- list()
    while(TRUE){
      tab = readHTMLTable(url_base,header=FALSE)
      res <- rbind(res,tab$result)
      url_base <- getNext(url_base)
      if (nchar(url_base)==0)
        break
    }
    

相关问题