R语言 使用download.file下载多个pdf时出现问题

hwamh0ep  于 2023-10-13  发布在  其他
关注(0)|答案(1)|浏览(141)

我目前正试图从这个online repository下载大约1,200个pdf文件(链接有我内置的过滤参数),我很难让pdf文件下载。我目前有这样的代码,它要么无法下载任何PDF文件,要么一次只下载一篇文章并覆盖前一篇文章:

library(tidyverse)
library(rvest)

url <- "https://www.ssoar.info/ssoar/discover?scope=/&sort_by=score&order=desc&rpp=100&filtertype_0=dateIssued&filter_relational_operator_0=equals&filter_0=%5B2000+TO+2022%5D&filtertype=journal&filter_relational_operator=equals&filter=Historical+Social+Research"
page <- read_html(url)

urls_pdf <- page %>% 
  html_elements("a") %>% 
  html_attr("href") %>% 
  str_subset("\\.pdf") 

urls_pdf[1:100] %>% walk2(basename(.), download.file, mode = "wb")

dir(pattern = "\\.pdf")

当运行代码时,我希望所需的PDF文件都下载到我预选的文件夹中,但我一直得到错误“有50个或更多的警告(使用warnings()查看前50个)",进一步检查后显示:
警告消息:
1:In .f(.xi,.yi,.):URL https://www.ssoar.info/ssoar/bitstream/handle/document/6292/ssoar-hsr-2007-no_4__no_122-ambrosius_et_al-alte_pfade_der_integration_und.pdf?sequence=1&isAllowed=y&lnkname=ssoar-hsr-2007-no_4__no_122-ambrosius_et_al-alte_pfade_der_integration_und.pdf:无法打开destfile 'ssoar-hsr-2007-no_4__no_122-ambrosius_et_al-alte_pfade_der_integration_und.pdf?sequence=1&isAllowed=y&lnkname= ssoar-hsr-2007-no_4__no_122-ambrosius_et_al-alte_pfade_der_integration_und.pdf“,原因”参数无效"
2:In .f(.xi,.yi,.):下载具有非零退出状态
...
我会诚实地说,我不是最有经验的r,但我有点不确定我应该如何进行。
任何帮助将不胜感激。

14ifxucb

14ifxucb1#

尝试

lapply(X = urls_pdf,
       FUN = \(x) utils::download.file(url = x, 
                                       destfile = basename(path = x), 
                                       quiet = TRUE)
       )

lapply(X, FUN)的工作方式类似于for循环。\(x)function(x)的简写。download.file(){utils}导出。
要存储在预先选定的文件夹中,请执行以下操作:

path <- "path_to_your_prespecified_folder"

lapply(X = urls_pdf,
       FUN = \(x) utils::download.file(url = x, 
                                       destfile = file.path(path, basename(x)), 
                                       quiet = TRUE)
       )

参数quiet = TRUE不是必需的。如果我被要求下载多个文件,我宁愿工作是安静下来。
注意,我看不出使用{tidyverse}的理由。你可以重写你的代码来收集pdf网址,把管道操作符替换为|>,也就是base R

library(rvest)

url <- "https://www.ssoar.info/ssoar/discover?scope=/&sort_by=score&order=desc&rpp=100&filtertype_0=dateIssued&filter_relational_operator_0=equals&filter_0=%5B2000+TO+2022%5D&filtertype=journal&filter_relational_operator=equals&filter=Historical+Social+Research"
page <- read_html(url)

urls_pdf <- page |>
  html_elements("a") |>
  html_attr("href") |>
  str_subset("\\.pdf")

这允许你写一个管道代码块,像这样:

path <- "/Users/blablabla/Desktop/pdfs" # adjust accordingly!

page |>
  html_elements("a") |>
  html_attr("href") |>
  str_subset("\\.pdf") |>
  lapply(X = _,
         FUN = \(x) 
         download.file(url = x, 
                       destfile = file.path(path, basename(x)), 
                       quiet = TRUE)
  )

注意:使用|>时,_用作数据的占位符。|>_就像%>%.
您的代码目前收集了100个PDF。剩下的1,100个pdf怎么办?

相关问题