从具有多个网址的网站刮取数据

时间:2016-08-10 19:17:37

标签: r web-scraping html-table

我一直试图从网站上删除一系列公司 - Company list 401.html。我可以使用以下代码从本页中删除单个表:

>fileurl = read_html("http://archive.fortune.com
/magazines/fortune/fortune500_archive/full/2005/1")
> content = fileurl %>%
+ html_nodes(xpath = '//*[@id="MagListDataTable"]/table[2]') %>%
+ html_table()
>contentframe = data.frame(content)
> view(contentframe)

但是,我需要从2005年开始追溯到1955年的所有数据以及1到500家公司的列表,而此列表仅显示100家公司和一年一次。我已经认识到对网址的唯一更改是“... fortune500_archive / full /”“/” 1,201,301或401(每个公司范围)示出)。

我也明白我必须创建一个循环来自动为我收集这些数据,而不是在保存每个表后手动替换url。我已经尝试过阅读其他帖子和观看视频的一些变化功能,但没有一个适合我,我迷路了。

1 个答案:

答案 0 :(得分:0)

一些建议可以帮助您入门。首先,编写一个下载和解析每个页面的函数可能很有用,例如

getData <- function(year, start) {
  url <- sprintf("http://archive.fortune.com/magazines/fortune/fortune500_archive/full/%d/%d.html", 
    year, start)
  fileurl <- read_html(url)
  content <- fileurl %>%
    html_nodes(xpath = '//*[@id="MagListDataTable"]/table[2]') %>%
    html_table()
  contentframe <- data.frame(content)
}

然后我们可以使用lapply(以及do.call(rbind, ...)循环遍历年份和页面,以便每年将所有5个数据帧组合在一起)。 E.g:

D <- lapply(2000:2005, function(year) {
  do.call(rbind, lapply(seq(1, 500, 100), function(start) {
    cat(paste("Retrieving", year, ":", start, "\n"))
    getData(year, start)
    }))
})