【问题标题】:Validate data from website before downloading in R在 R 中下载之前验证来自网站的数据
【发布时间】:2021-12-30 20:54:29
【问题描述】:

我有一堆我想下载的天气数据文件,但是有一些网站 url 有数据和没有数据。我正在使用 R 中的 download.file 函数来下载文本文件,它工作正常,但我也下载了很多空文本文件,因为所有 url 都是有效的,即使没有数据存在。

例如,这个 url 提供了很好的数据。

http://weather.uwyo.edu/cgi-bin/sounding?region=naconf&TYPE=TEXT%3ALIST&YEAR=2021&MONTH=12&FROM=3000&TO=3000&STNM=72645

但是这个没有。

http://weather.uwyo.edu/cgi-bin/sounding?region=naconf&TYPE=TEXT%3ALIST&YEAR=1970&MONTH=12&FROM=3000&TO=3000&STNM=72645

有没有办法在下载之前检查文本文件中是否有有效数据?我在 RCurl 包中寻找了一些东西,但没有看到我需要的东西。谢谢。

【问题讨论】:

    标签: r download rcurl


    【解决方案1】:

    您可以在下载前使用httr::HEAD 确定数据大小。请注意,这为节省了下载的“痛苦”;如果服务器端有任何费用,即使你不下载它也会感到查询痛苦。 (这两个看起来足够快,也许这不是问题。)

    # good data
    res1 <- httr::HEAD("http://weather.uwyo.edu/cgi-bin/sounding?region=naconf&TYPE=TEXT%3ALIST&YEAR=2021&MONTH=12&FROM=3000&TO=3000&STNM=72645")
    httr::headers(res1)$`content-length`
    # [1] "9435"
    
    # no data
    res2 <- httr::HEAD("http://weather.uwyo.edu/cgi-bin/sounding?region=naconf&TYPE=TEXT%3ALIST&YEAR=1970&MONTH=12&FROM=3000&TO=3000&STNM=72645")
    httr::headers(res2)$`content-length`
    # NULL
    

    如果 API 提供了用于估计大小(或至少存在数据)的函数,那么远程端使用该函数而不是使用此技术可能会更好。例如:假设 API 调用需要 20 秒的 SQL 查询。调用HEAD 需要20 秒,就像调用GET 一样,唯一的区别是你没有得到数据。如果您看到您将获取数据然后随后调用httr::GET(.),那么您将再等待 20 秒(除非远程端正在缓存查询)。

    或者,他们可能有一个启发式来查找数据的存在,也许只是一个简单的是/否,只需要几秒钟。在这种情况下,在调用 20 秒的完整查询调用之前进行 3 秒的“数据是否存在”API 调用会“更好”。

    底线:如果 API 有“数据大小”估算器,请使用它,否则 HEAD 应该可以正常工作。

    作为HEAD 的替代品,只需GET 数据,检查内容长度,并仅在找到时才保存到文件:

    res1 <- httr::GET("http://weather.uwyo.edu/cgi-bin/sounding?region=naconf&TYPE=TEXT%3ALIST&YEAR=2021&MONTH=12&FROM=3000&TO=3000&STNM=72645")
    stuff <- as.character(httr::content(res1))
    if (!is.null(httr::headers(res1)$`content-length`)) {
      writeLines(stuff, "somefile.html")
    }
    # or do something else with the results, in-memory
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-12
      • 2015-12-04
      • 2016-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多