如何使用R语言无需手动点击下载网页中的ZIP格式文件
R环境自动批量下载FDA Drugs@FDA ZIP数据文件实现方案
完全可以在R语言环境内完成全流程自动下载,不需要手动点击页面链接,具体实现方法如下:
实现逻辑
通过R包抓取目标页面上所有ZIP格式数据文件的真实下载地址,模拟正常浏览器请求批量拉取文件到本地指定目录,支持自动跳过已下载文件,重复运行不会重复拉取资源。
操作步骤
- 安装并加载所需依赖包
用到rvest做页面内容解析、httr处理HTTP请求,首次运行先安装依赖:install.packages(c("rvest", "httr", "dplyr")) library(rvest) library(httr) library(dplyr) - 抓取页面所有ZIP文件下载链接
不要硬编码固定下载地址,FDA会不定期更新文件版本和存储路径,直接从页面动态抓取链接能保证拿到最新的有效地址# 目标数据页面地址 page_url <- "https://www.fda.gov/drugs/drug-approvals-and-databases/drugsfda-data-files" # 配置浏览器标识请求头,避免被站点反爬规则拦截返回403 req_header <- user_agent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36") # 读取页面源码 page_content <- read_html(GET(page_url, req_header)) # 提取、清洗所有ZIP文件的完整下载链接 zip_download_links <- page_content %>% html_elements("a") %>% html_attr("href") %>% # 筛选后缀为.zip的链接 grep("\\.zip$", ., value = TRUE, ignore.case = TRUE) %>% # 拼接相对路径为完整可访问地址 paste0("https://www.fda.gov", .) %>% # 去重 unique() # 打印链接列表确认,你提到的3.54MB Drugs@FDA核心文件会在输出列表中 print(zip_download_links) - 批量下载所有ZIP文件到本地
# 配置本地保存目录,不存在则自动创建 local_save_path <- "./fda_drug_data" if (!dir.exists(local_save_path)) { dir.create(local_save_path, recursive = TRUE) } # 循环下载文件 for (url in zip_download_links) { # 解析文件名 file_name <- basename(URLdecode(url)) file_local_path <- file.path(local_save_path, file_name) # 跳过已下载完成的文件,避免重复消耗流量 if (file.exists(file_local_path)) { message(paste("跳过已下载文件:", file_name)) next } # 执行下载,设置60秒超时避免大文件下载中断 GET( url = url, config = c(req_header, timeout(60)), write_disk(file_local_path, overwrite = FALSE) ) message(paste("下载完成:", file_name)) }
补充说明
- 下载完成的ZIP文件可以直接在R内调用
unzip()函数解压,不需要手动操作:unzip(zipfile = file_local_path, exdir = local_save_path) - 如果运行时返回403错误,优先检查请求头的浏览器标识是否配置正确,R默认的请求标识会被多数政务站点的反爬规则拦截
- 脚本支持重复运行,不会重复下载已存在的文件,适合定期拉取FDA最新更新的数据
内容的提问来源于stack exchange,提问作者A S
相关产品推荐
相关产品推荐

