从R

时间:2016-01-15 10:35:00

标签: r url error-handling file-handling

我在将数据从网络读取到R中时遇到了一些问题。

我希望下载的数据存储here,您可以在此页面上插入电台号码,然后将其定向到数据集。例如,如果我在框中键入站号615071800000,我将被重定向到另一个页面,然后我可以选择数据并要求在浏览器中查看txt文件。

由于我有大量的工作站需要数据,所以我决定在R中编写一个脚本来执行此操作。这是一个例子:

site_id <- c('615071800000','629065900000','617106090000','617107080000',
             '615071900000','646066100000','646066420010','646067000000')
for (i in 1:length(site_id)){
  web_str <- 'http://data.giss.nasa.gov/tmp/gistemp/STATIONS/tmp_'
  str <- paste(web_str,site_id[i],'_14_0/station.txt', sep = '')

  # read data from web
  dat <- read.table(str, sep = "", header = TRUE,
                    fill = TRUE, na.string = c(999.9,999.90))
}

这些都是有效的网站ID,并且提供和用于生成'str'的链接应该引导我访问数据。但是,当我在此示例集上运行代码时,它会失败。运行这个例子,我得到:

Error in file(file, "rt") : cannot open the connection
In addition: Warning message:
In file(file, "rt") : cannot open: HTTP status was '404 Not Found'

对我而言发生在循环i == 7

因此,我将i = 7的'str'复制到我的浏览器中

http://data.giss.nasa.gov/tmp/gistemp/STATIONS/tmp_646066420010_14_0/station.txt

但该页面为空,我在页面顶部收到“未找到”消息。

但是,如果我回到主页面(即此处提供的第一个链接)并在字段中键入站号,它会转到我的数据,然后我将该页面的链接复制到R:

http://data.giss.nasa.gov/tmp/gistemp/STATIONS/tmp_646066420010_14_0/station.txt

结果与我之前尝试过的字符串完全相同。为什么这不起作用?更奇怪的是,如果我现在尝试再次运行代码,R现在在i == 8处返回相同的错误,即它找到了前一个文件而不是下一个文件。这里发生了什么?这是网站的问题,例如只有在手动搜索第一页上的电台时才会生成txt文件吗?有没有针对此的解决方法,或者是否有人建议如何使这项工作?或者有人可以证明这也是另一台机器上的问题。

1 个答案:

答案 0 :(得分:0)

您可以通过curlGetHeaders请求其标头来触发该网站。然后,创建临时文件,您就可以接收数据。 试试这个:

dat <- lapply(site_id, function(id) {
  web_str <- 'http://data.giss.nasa.gov/tmp/gistemp/STATIONS/tmp_'
  data_str <- paste(web_str,id,'_14_0/station.txt', sep = '')
  header_str <- paste('http://data.giss.nasa.gov/cgi-bin/gistemp/find_station.cgi?dt=1&ds=14&name=', id, sep = '')
  curlGetHeaders(header_str)
  read.table(data_str, sep = "", header = TRUE, fill = TRUE, na.string = c(999.9,999.90))
})