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

如何使用R语言爬取EPA CompTox Dashboard的实验平均沸点数据

解决思路
  • 该站点的化学品属性数据为前端动态加载,不会直接出现在静态HTML的节点中,你观察到数据存储在页面最后一个script标签的JSON结构里是完全正确的,直接解析该JSON是目前最稳定的爬取方案,不需要依赖动态渲染工具,也不受动态变化的单元格id影响。
  • 核心逻辑为:抓取页面→提取目标script内容→正则匹配沸点数据段→解析JSON提取实验平均值。
可直接运行的R代码

首先安装依赖包:

install.packages(c("rvest", "jsonlite", "stringr", "purrr"))

单化学品爬取函数

library(rvest)
library(jsonlite)
library(stringr)
library(purrr)

get_exp_av_bp <- function(dtxsid) {
  # 拼接请求URL
  url <- paste0("https://comptox.epa.gov/dashboard/chemical/properties/", dtxsid)
  tryCatch({
    # 读取页面
    page <- read_html(url)
    # 提取所有script标签,取最后一个的文本内容
    script_content <- page %>% 
      html_elements("script") %>% 
      last() %>% 
      html_text()
    # 正则匹配沸点对应的JSON块
    bp_pattern <- 'arrKey:"BOILING_POINT".*?\\}'
    bp_match <- str_extract(script_content, bp_pattern)
    # 补全JSON格式
    bp_json_str <- paste0("{", bp_match)
    # 补全JSON键的引号,适配解析规则
    bp_json_str <- str_replace_all(bp_json_str, '(\\w+):', '"\\1":')
    # 解析JSON
    bp_data <- fromJSON(bp_json_str)
    # 提取实验平均沸点
    exp_av_bp <- bp_data$experimental$mean
    return(data.frame(DTXSID = dtxsid, 实验平均沸点 = exp_av_bp))
  }, error = function(e) {
    # 错误处理,爬取失败返回NA
    return(data.frame(DTXSID = dtxsid, 实验平均沸点 = NA))
  })
}

批量爬取示例

# 替换为你需要爬取的化学品DTXSID列表
dtxsid_list <- c("DTXSID8021482", "DTXSID8025545")
# 批量爬取,自动合并结果为数据框
result <- map_dfr(dtxsid_list, ~{
  res <- get_exp_av_bp(.x)
  # 批量爬取加1秒延迟,避免请求频率过高被封禁
  Sys.sleep(1)
  return(res)
})
# 查看爬取结果
print(result)
适配说明

如果后续站点JSON结构发生调整,仅需要修改正则匹配规则和JSON字段提取路径即可,适配成本很低。

内容的提问来源于stack exchange,提问作者lawsq

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 21:54:02