使用R爬取OpenFDA API全量数据遇阻:仅能获取单页100条数据
OpenFDA全量数据爬取解决方案(R语言)
已知总共有6974条结果,API每页最多返回100条,需循环请求所有分页并合并数据,具体实现步骤如下:
- 计算所需请求的分页数量:总条数除以每页条数后向上取整,即
ceiling(6974 / 100) = 70页 - 生成所有分页的
skip参数序列:从0开始,每次递增100,最后一页的skip值为6900(对应剩余74条数据) - 循环发送请求,解析每个页面的JSON数据并提取
results部分 - 将所有页面的结果合并为一个完整数据框
以下是完整代码:
library(httr) library(jsonlite) library(purrr) library(dplyr) # 基础配置 base_url <- "https://api.fda.gov/drug/label.json" api_key <- "YOULLHAVETOGETAKEY" # 替换为你的实际API密钥 search_term <- "grapefruit" limit_per_page <- 100 total_records <- 6974 # 生成所有需要的skip参数 skip_values <- seq(from = 0, to = total_records - limit_per_page, by = limit_per_page) # 处理最后一页不足100条的情况 if (total_records %% limit_per_page != 0) { skip_values <- c(skip_values, total_records - (total_records %% limit_per_page)) } # 定义单页请求函数 fetch_single_page <- function(skip) { # 构造请求URL request_url <- modify_url(base_url, query = list( api_key = api_key, search = search_term, limit = limit_per_page, skip = skip )) # 发送请求并检查状态 response <- GET(request_url, accept_json()) if (http_status(response)$category != "Success") { warning(paste("请求失败,skip值:", skip, ",状态码:", response$status_code)) return(NULL) } # 解析并返回结果 raw_text <- content(response, "text") json_data <- fromJSON(raw_text) json_data$results } # 批量请求所有页面并合并数据 full_dataset <- map_dfr(skip_values, function(skip) { page_data <- fetch_single_page(skip) Sys.sleep(1) # 添加延迟,避免触发API频率限制 page_data }) # 查看最终数据 glimpse(full_dataset) View(full_dataset)
注意事项:
- 务必将
api_key替换为你自己的OpenFDA API密钥 Sys.sleep(1)用于控制请求频率,避免被API临时限制,可根据实际情况调整延迟时长- 代码包含请求失败的警告提示,便于排查异常问题
内容的提问来源于stack exchange,提问作者kfeye
相关产品推荐
相关产品推荐

