【问题标题】:Downloading multiple files in R with variable length, nested URLs在 R 中以可变长度、嵌套 URL 下载多个文件
【发布时间】:2016-12-16 13:40:47
【问题描述】:

这里有新成员。尝试从 R 中的网站下载大量文件(但也接受建议,例如 wget。)

来自this post,我知道我必须创建一个带有所需 URL 的向量。我最初的问题是写这个向量,因为我有 27 个州和每个州内的 34 个机构。我必须为所有州的每个机构下载一个文件。州代码始终为两个字符,而机构代码则为 2 到 7 个字符。 URL 如下所示:

http://website.gov/xx_yyyyyyy.zip

其中xx 是州代码,yyyyyyy 是机构代码,长度在 2 到 7 个字符之间。我不知道如何建立一个这样的循环。

我假设我可以使用以下功能下载此 url 列表:

for(i in 1:length(url)){
download.file(urls, destinations, mode="wb")}

这有意义吗?

(免责声明:此帖子的早期版本较早上传但不完整。我的错误,对不起!)

【问题讨论】:

  • 这个简单的例子可能对paste0(rep(letters[1:4], 4), rep(1:4, each=4))有帮助。如果没有更多关于机构名称的信息,就无法说得更多。
  • 感谢您的意见。机构名称是首字母缩略词:FAA、DEA、NTSB 等。我用这些首字母缩写词创建了一个向量 agency,以及一个包含我需要的 27 个状态的 states 向量。将尝试您的建议并回复。
  • 谢谢,@Imo!你的意见对我帮助很大。现在我了解了添加字符串变量的动态。

标签: r url web-scraping concatenation


【解决方案1】:

这将分批下载它们,并利用download.file() 更快的同时下载功能,如果您安装的 R 中提供了libcurl 选项:

library(purrr)

states <- state.abb[1:27]
agencies <- c("AID", "AMBC", "AMTRAK", "APHIS", "ATF", "BBG", "DOJ", "DOT",
              "BIA", "BLM", "BOP", "CBFO", "CBP", "CCR", "CEQ", "CFTC", "CIA",
              "CIS", "CMS", "CNS", "CO", "CPSC", "CRIM", "CRT", "CSB", "CSOSA",
              "DA", "DEA", "DHS", "DIA", "DNFSB", "DOC", "DOD", "DOE", "DOI")

walk(states, function(x) {
   map(x, ~sprintf("http://website.gov/%s_%s.zip", ., agencies)) %>% 
    flatten_chr() -> urls
    download.file(urls, basename(urls), method="libcurl")
}) 

【讨论】:

  • 这是一个非常优雅的解决方案,@hrbrmstr。感谢您的输入。我将对其进行测试并回帖。
  • 您的脚本运行完美——而且是我见过的最快的下载。非常感谢!
【解决方案2】:

这应该可以完成工作:

agency <- c("FAA", "DEA", "NTSB")
states <- c("AL", "AK", "AZ", "AR")

URLs <-
paste0("http://website.gov/",
       rep(agency, length(agency)),
       "_",
       rep(states, length(states)),
       ".zip")

然后循环遍历URLs 向量以提取 zip 文件。如果使用apply函数会更快。

【讨论】:

  • 这行得通,但只是因为机构和州的长度相对而言是素数。为了使其更通用,rep 命令之一应指定each,另一个应指定times。在这种情况下,apply 真的会更快吗?
  • 谢谢@epo3。它工作得很好。现在我想我可以使用download.file() 并循环浏览所有网址。再次感谢!
  • @Miff:我想我需要为每个州指定一个timeeach 机构27 次?
  • @questionMarc paste0("http://website.gov/", rep(agency, each=length(agency)), "_", rep(states, times=length(states)), ".zip")
  • 太棒了,@Miff。非常有道理,非常感谢。
【解决方案3】:

如果您在每个州代码中的所有代理代码都相同,您可以使用下面的代码来创建要循环的网址向量。 (您还需要一个相同大小的目的地向量)。

#Getting all combinations
States <- c("AA","BB")
Agency <- c("ABCDEFG","HIJKLMN")
AllCombinations <- expand.grid(States, Agency)
AllCombinationsVec <- paste0("http://website.gov/" ,AllCombinations$Var1, "_",AllCombinations$Var2,".zip" )

然后您可以尝试像这样遍历每个文件:

#loop method

for(i in seq(AllCombinationsVec)){
  download.file(AllCombinationsVec[i], destinations[i], mode="wb")}

这也是循环项目的另一种方式应用函数将函数应用于列表或向量中的每个项目。

#lapply method

mapply(function(x, y) download.file(x,y, mode="wb"),x = AllCombinationsVec, y = destinations)

【讨论】:

  • 感谢您的建议。它也很有效!
猜你喜欢
  • 2018-08-30
  • 1970-01-01
  • 2017-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
相关资源
最近更新 更多