使用 RCurl 或任何其他 R 包
Using RCurl or any other R package
是否有人热衷于简要解释如何使用 RCurl 包(或任何其他 RPackage)从以下 ftp 服务器...下载文件?
http://hermes.acri.fr/index.php?class=ftp_access
我是这个领域的新手,当然需要一些动力...
非常感谢...
嗯,老实说,你没有做任何研究并希望人们给你特殊待遇,这很好,但不会让你在 SO 上走得太远。 RCurl
关于 SO 有很多问题,还有大量网站专门讨论如何在 FTP 下载的上下文中使用它。
但是,以下内容可能会帮助那些已经做过一些研究并真正陷入困境的人,此外还将展示如何使用更现代的 curl
和 httr
包。
除了一些 RCurl 辅导之外,您还有点希望人们注册该站点(因为有人可能认为该站点的 FTP 服务器中存在导致 RCurl 问题的特性......我的意思是,我们没有上下文,所以这是一个和任何假设一样有效的假设。
将这些放入 ~/.Renviron
并重新启动你的 R session:
ACRI_FTP_USERNAME=your-username
ACRI_FTP_PASSWORD=your-password
做一些关于将环境变量导入 R 的基础研究(在 R-Project 站点的手册中),如果您以前没有这样做的话。
如果您至少不这样做,那么您就是将裸凭据放入脚本中,这对安全性来说是可怕的。还有其他方法可以更正式地管理 "secrets",但我怀疑这些 FTP 凭据并不完全是 "super-secret" 位信息。这样做还可以使任何脚本更通用(即其他人可以使用它们,如果他们遵循相同的模式并使用他们自己的信誉)。
我们将使用 curl
和 httr
:
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 我已经阅读并回答了很多关于它们的问题。
我们将使用 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
命令具有适当的魔法 headers:
$ 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 服务器进行身份验证、执行目录遍历和下载内容的内容。现在又添加了一个到那个语料库。
是否有人热衷于简要解释如何使用 RCurl 包(或任何其他 RPackage)从以下 ftp 服务器...下载文件?
http://hermes.acri.fr/index.php?class=ftp_access
我是这个领域的新手,当然需要一些动力...
非常感谢...
嗯,老实说,你没有做任何研究并希望人们给你特殊待遇,这很好,但不会让你在 SO 上走得太远。 RCurl
关于 SO 有很多问题,还有大量网站专门讨论如何在 FTP 下载的上下文中使用它。
但是,以下内容可能会帮助那些已经做过一些研究并真正陷入困境的人,此外还将展示如何使用更现代的 curl
和 httr
包。
除了一些 RCurl 辅导之外,您还有点希望人们注册该站点(因为有人可能认为该站点的 FTP 服务器中存在导致 RCurl 问题的特性......我的意思是,我们没有上下文,所以这是一个和任何假设一样有效的假设。
将这些放入 ~/.Renviron
并重新启动你的 R session:
ACRI_FTP_USERNAME=your-username
ACRI_FTP_PASSWORD=your-password
做一些关于将环境变量导入 R 的基础研究(在 R-Project 站点的手册中),如果您以前没有这样做的话。
如果您至少不这样做,那么您就是将裸凭据放入脚本中,这对安全性来说是可怕的。还有其他方法可以更正式地管理 "secrets",但我怀疑这些 FTP 凭据并不完全是 "super-secret" 位信息。这样做还可以使任何脚本更通用(即其他人可以使用它们,如果他们遵循相同的模式并使用他们自己的信誉)。
我们将使用 curl
和 httr
:
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 我已经阅读并回答了很多关于它们的问题。
我们将使用 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
命令具有适当的魔法 headers:
$ 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 服务器进行身份验证、执行目录遍历和下载内容的内容。现在又添加了一个到那个语料库。