用r自动化webscraping

时间:2014-02-05 10:55:20

标签: r loops automation web-scraping lapply

我已经设法为单个网址抓取内容,但我正在努力为多个网址自动化。

这里是如何为单个页面完成的:

library(XML); library(data.table)
theurl <- paste("http://google.com/",url,"/ul",sep="")
convertUTF <- htmlParse(theurl, encoding = "UTF-8")
tables <- readHTMLTable(convertUTF)
n.rows <- unlist(lapply(tables, function(t) dim(t)[1]))
table <- tables[[which.max(n.rows)]]
TableData <- data.table(table)

现在我有一个网址向量,想要抓取每个对应的表格:

在这里,我读了包含多个http链接的数据:

ur.l <- data.frame(read.csv(file.choose(), header=TRUE, fill=TRUE))

theurl <- matrix(NA, nrow=nrow(ur.l), ncol=1)
for(i in 1:nrow(ur.l)){
  url <- as.character(ur.l[i, 2])
   }

1 个答案:

答案 0 :(得分:1)

您提供的三个额外网址中的每一个都指的是不包含表格的网页,因此它不是一个特别有用的示例数据集。但是,处理错误的一种简单方法是使用tryCatch。下面我定义了一个从url u读入表的函数,计算该url中每个表的行数,然后返回最多行为data.table的表。 / p>

然后,您可以使用sapply将此功能应用于向量中的每个网址(或者,在您的情况下,每个组织ID,例如36245119)。

library(XML); library(data.table)
scrape <- function(u) {
  tryCatch({
    tabs <- readHTMLTable(file.path("http://finstat.sk", u, "suvaha"), 
                          encoding='utf-8')
    tab <- tabs[[which.max(sapply(tabs, function(x) nrow(x)))]]
    data.table(tab)  
  }, error=function(e) e)
}

urls <- c('36245119', '46894853', '46892460', '46888721')
res <- sapply(urls, scrape)

如果您想改进错误处理,请查看?tryCatch。目前,该函数只是简单地返回错误。