如何使用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
相关产品推荐
相关产品推荐

