【问题标题】:Using RCurl or any other R package使用 RCurl 或任何其他 R 包
【发布时间】:2018-10-18 11:19:52
【问题描述】:

是否有人热衷于简要解释如何使用 RCurl 包(或任何其他 RPackage)从以下 ftp 服务器下载文件...?

http://hermes.acri.fr/index.php?class=ftp_access

我是这个领域的新手,当然需要一些动力......

非常感谢...

【问题讨论】:

  • 手册页中内置的 RCurl 的哪些部分没有您需要的信息?知道这一点可能有助于贡献者 PR 通过更好的示例进入其中。另外——stackoverflow.com/questions/22235421/…——实际上是谷歌搜索“rcurl ftp download”的结果#1,这似乎有相当大的推动力。
  • 似乎你不是“热衷于简要解释如何使用 RCurl 包......”。还是谢谢...
  • RCurl 手册页已经简要解释了如何使用 RCurl。 omegahat.net/RCurl/installed/RCurl/html/getURL.html 甚至有一个示例说明如何使用 getURL() 执行经过身份验证的下载。

标签: r libcurl rcurl


【解决方案1】:

嗯,tbh,你没有做任何研究,希望人们给你特殊待遇,这很好,但不会让你在 SO 上走得太远。有大量关于 SO for RCurl 的问题以及大量专门讨论如何在 FTP 下载上下文中使用它的网站。

但是,以下内容可能会帮助那些做过一些研究并真正陷入困境的人,另外还将展示如何使用更现代的 curlhttr 包。

除了一些 RCurl 辅导之外,您还希望人们注册该站点(因为有人可能认为该站点的 FTP 服务器中存在导致 RCurl 问题的特性……我的意思是,我们没有上下文,所以这是任何假设都有效)。

将这些放入 ~/.Renviron 并重新启动您的 R 会话:

ACRI_FTP_USERNAME=your-username
ACRI_FTP_PASSWORD=your-password

做一些基础研究(在 R-Project 网站上的手册中),如果您以前没有这样做过,将环境变量导入 R。

如果您至少不这样做,您会将裸凭据放入脚本中,这对于安全性来说是非常糟糕的。还有其他方法可以更正式地管理“机密”,但我怀疑这些 FTP 凭据并不完全是“超级机密”信息。这样做还可以使任何脚本更加通用(即,如果其他人遵循相同的模式并使用自己的凭据,则可以使用它们)。

我们将使用curlhttr

library(curl)
library(httr)

您可能不想使用浏览器查看目录列表,并且浏览器可能很快就会停止支持 FTP(Mozilla 正在放弃对读取 RSS 提要的支持,而且 Chrome 和 Firefox 都无法读取 Gopher 站点,所以您永远不知道)。由于某种原因,浏览器在处理 FTP 事务时也往往非常慢。

我们将创建一个函数来简化目录列表:

get_dir_listing <- function(path = "/") {
  curl_fetch_memory(
    paste0("ftp://ftp.hermes.acri.fr", path),
    new_handle(
      username = Sys.getenv("ACRI_FTP_USERNAME"),
      password = Sys.getenv("ACRI_FTP_PASSWORD"),
      dirlistonly=TRUE
    )
  ) -> res

  strsplit(readBin(res$content, "character"), "\n")[[1]]

}

现在我们可以做(我们会砍下一棵树,砍掉很重要):

get_dir_listing()
## [1] "GLOB"      "animation" "OSS2015"   "EURO"     

get_dir_listing("/GLOB/")
## [1] "meris"   "viirsn"  "merged"  "olcia"   "modis"   "seawifs"

get_dir_listing("/GLOB/meris/")
## [1] "month" "8-day" "day"  

get_dir_listing("/GLOB/meris/month/")
## [1] "2011" "2002" "2006" "2012" "2005" "2009" "2004" "2008" "2007" "2010" "2003"

get_dir_listing("/GLOB/meris/month/2011/")
## [1] "09" "05" "01" "12" "06" "02" "11" "03" "10" "07" "08" "04"

get_dir_listing("/GLOB/meris/month/2011/09/")
## [[1]] "01"

大奖!

get_dir_listing("/GLOB/meris/month/2011/09/01/")
##  [1] "L3b_20110901-20110930__GLOB_4_AV-MER_KD490-LEE_MO_00.nc"       
##  [2] "L3m_20110901-20110930__GLOB_25_AV-MER_ZHL_MO_00.nc"            
##  [3] "L3b_20110901-20110930__GLOB_4_AV-MER_ZSD_MO_00.nc"             
##  [4] "L3m_20110901-20110930__GLOB_100_AV-MER_ZSD_MO_00.nc"           
##  [5] "L3b_20110901-20110930__GLOB_4_AV-MER_A865_MO_00.nc"            
##  [6] "L3m_20110901-20110930__GLOB_100_AV-MER_A865_MO_00.nc"          
##  [7] "L3m_20110901-20110930__GLOB_25_AV-MER_CHL1_MO_00.png"          
##  [8] "L3m_20110901-20110930__GLOB_25_AV-MER_CF_MO_00.png"            
##  [9] "L3m_20110901-20110930__GLOB_25_AV-MER_NRRS443_MO_00.png"       
## [10] "L3m_20110901-20110930__GLOB_4_AV-MER_CHL-OC5_MO_00.nc"         
## [11] "L3m_20110901-20110930__GLOB_100_AV-MER_KDPAR_MO_00.nc"         
## [12] "L3b_20110901-20110930__GLOB_4_AV-MER_NRRS670_MO_00.nc"         
## [13] "L3m_20110901-20110930__GLOB_25_AV-MER_NRRS490_MO_00.png"       
## [14] "L3b_20110901-20110930__GLOB_4_AV-MER_NRRS412_MO_00.nc"         
## [15] "L3m_20110901-20110930__GLOB_4_AV-MER_A865_MO_00.nc"            
## [16] "L3m_20110901-20110930__GLOB_4_AV-MER_NRRS490_MO_00.nc"         
## [17] "L3m_20110901-20110930__GLOB_25_AV-MER_KD490_MO_00.png"         
## [18] "L3m_20110901-20110930__GLOB_4_GSM-MER_CHL1_MO_00.nc"           
## [19] "L3b_20110901-20110930__GLOB_4_AV-MER_T550_MO_00.nc"            
## [20] "L3m_20110901-20110930__GLOB_25_AV-MER_CHL-OC5_MO_00.png"       
## [21] "L3m_20110901-20110930__GLOB_25_AV-MER_ZSD-DORON_MO_00.nc"  
## .. there are alot of them

现在您可能想要下载其中一个。我知道.nc 文件通常很大,即使我从不需要使用它们 b/c 我已经阅读并回答了很多关于它们的 SO 问题。

我们将使用httr 进行下载,因为它会为我们处理很多事情:

httr::GET(
  url = "ftp://ftp.hermes.acri.fr/GLOB/meris/month/2011/09/01/L3m_20110901-20110930__GLOB_4_GSM-MER_CHL1_MO_00.nc",
  httr::authenticate(Sys.getenv("ACRI_FTP_USERNAME"), Sys.getenv("ACRI_FTP_PASSWORD")),
  httr::write_disk("~/Data/L3m_20110901-20110930__GLOB_4_GSM-MER_CHL1_MO_00.nc"),
  httr::progress()
) -> res

httr::stop_for_status(res)

您可以放心地忽略警告和诊断:

## Warning messages:
## 1: In parse_http_status(lines[[1]]) :
##   NAs introduced by coercion to integer range
## 2: Failed to parse headers:
## 229 Entering Extended Passive Mode (|||28926|)
## 200 Type set to I
## 213 92373747
## 150 Opening BINARY mode data connection for L3m_20110901-20110930__GLOB_4_GSM-MER_CHL1_MO_00.nc (92373747 bytes)
## 226 Transfer complete

因为它有适合file 命令的魔术头:

$ file L3m_20110901-20110930__GLOB_4_GSM-MER_CHL1_MO_00.nc
L3m_20110901-20110930__GLOB_4_GSM-MER_CHL1_MO_00.nc: Hierarchical Data Format (version 5) data

希望这确实有助于真正陷入困境的人,因为 SO 和其他地方有(如前所述)关于如何向 FTP 服务器进行身份验证、执行目录遍历和下载内容的内容。现在,该语料库中又添加了一个。

【讨论】:

  • 嗯,这当然是我梦寐以求的 - 真正的答案的杰作。非常感谢@hrbrmstr - 这让我很开心......
  • 如果您的部门经常使用该网站,请发表评论,我可以将其打包成一个包以便于使用。
猜你喜欢
  • 2013-09-20
  • 2020-05-10
  • 2015-05-24
  • 1970-01-01
  • 1970-01-01
  • 2012-07-31
  • 1970-01-01
  • 2016-04-12
  • 2018-03-01
相关资源
最近更新 更多