【问题标题】:Automate webscraping with r使用 r 自动化网页抓取
【发布时间】:2014-03-01 18:20:20
【问题描述】:

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

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

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)

现在我有一个 url 向量,并想为相应的表抓取每个:

在这里,我读入了包含多个 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])
   }

【问题讨论】:

  • 不要在 SO 上使用file.choose,您应该包含一个简短的网址示例向量。

标签: r loops automation web-scraping lapply


【解决方案1】:

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

然后您可以使用 sapply 将此函数应用于向量中的每个 url(或者,在您的情况下,每个组织 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。目前该函数只是简单地返回错误本身。

【讨论】:

    猜你喜欢
    • 2019-01-18
    • 1970-01-01
    • 2022-07-06
    • 2018-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    相关资源
    最近更新 更多