在R中刮一个分页表

时间:2018-05-27 23:05:55

标签: r web-scraping

如果这是非常基本的话,请在高级中道歉,但我迷失了!

我想在R中删除下表,

http://dgsp.cns.gob.mx/Transparencia/wConsultasGeneral.aspx

但是,我相信这个页面是用Java编写的。我尝试使用RSelenium,但是我没有成功地抓住这张桌子的17页。

你能否告诉我如何抓取这张桌子的全部内容?

1 个答案:

答案 0 :(得分:0)

鉴于它只有17页,我会手动点击页面并保存HTML源代码。这种方式不会超过3-5分钟。

但是,如果你想以编程方式进行,我们可以先编写一个带有页码的函数,查找该页面的链接,点击链接,然后返回该页面的HTML源代码:

get_html <- function(i) {
  webElem <- remDr$findElement(using = "link text", as.character(i))
  webElem$clickElement()
  Sys.sleep(s)
  remDr$getPageSource()[[1]]
}

初始化一些值:

s <- 2 # seconds to wait between each page
total_pages <- 17
html_pages <- vector("list", total_pages)

启动浏览器,导航到第1页,然后保存来源:

library(RSelenium)
rD <- rsDriver()
remDr <- rD[["client"]]
base_url <- "http://dgsp.cns.gob.mx/Transparencia/wConsultasGeneral.aspx"
remDr$navigate(base_url)
src <- remDr$getPageSource()[[1]]
html_pages[1] <- src

对于第2页到第17页,我们使用for循环并调用我们上面写的函数,特别注意第11页:

for (i in 2:total_pages) {
  if (i == 11) {
    webElem <- remDr$findElement(using = "link text", "...")
    webElem$clickElement()
    Sys.sleep(s)
    html_pages[i] <- remDr$getPageSource()[[1]]
  } else {
    html_pages[i] <- get_html(i)  
  }
}
remDr$close()

结果是html_pages,一个长度为17的列表,每个元素都是每个页面的HTML源代码。如何将HTML中的数据解析成其他形式(例如数据帧)本身可能是一个单独的问题。