You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R爬取OpenFDA API全量数据遇阻:仅能获取单页100条数据

OpenFDA全量数据爬取解决方案(R语言)

已知总共有6974条结果,API每页最多返回100条,需循环请求所有分页并合并数据,具体实现步骤如下:

  1. 计算所需请求的分页数量:总条数除以每页条数后向上取整,即 ceiling(6974 / 100) = 70 页
  2. 生成所有分页的skip参数序列:从0开始,每次递增100,最后一页的skip值为6900(对应剩余74条数据)
  3. 循环发送请求,解析每个页面的JSON数据并提取results部分
  4. 将所有页面的结果合并为一个完整数据框

以下是完整代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 11:55:39