使用R抓取PubChem化合物同义词:html_nodes定位器选择遇阻
解决PubChem化合物同义词批量抓取问题
为啥直接用rvest抓网页会失败?因为PubChem的页面内容很多是JavaScript动态加载的,read_html()只能拿到静态的HTML骨架,根本抓不到动态渲染出来的同义词数据,你试的那些CSS选择器自然也找不到内容。
最靠谱的方案是用PubChem官方提供的REST API,比网页抓取稳定得多,还支持批量操作,代码实现也简单:
单化合物同义词抓取代码
library(httr) library(jsonlite) get_pubchem_synonyms <- function(cid) { # 拼接API请求地址 api_url <- paste0("https://pubchem.ncbi.nlm.nih.gov/rest/pug/compound/cid/", cid, "/synonyms/JSON") # 发送请求并处理响应 resp <- GET(api_url) if (http_status(resp)$category != "Success") { warning(paste("CID", cid, "请求出错")) return(NULL) } # 解析JSON数据并提取同义词 json_result <- fromJSON(content(resp, "text")) synonyms <- json_result$InformationList$Information$Synonyms[[1]] return(synonyms) } # 测试单个CID(比如你提供的440917) get_pubchem_synonyms(440917)
批量抓取实现
# 准备要查询的CID列表 target_cids <- c(440917, 1071, 2244) # 批量获取同义词,返回以CID命名的列表 batch_results <- lapply(target_cids, get_pubchem_synonyms) names(batch_results) <- target_cids # 查看结果 batch_results
为啥优先用API?
- 不会因为PubChem网页改布局就失效,稳定性拉满
- 支持批量请求,比循环抓网页效率高很多
- 返回的是结构化JSON数据,解析起来比HTML简单
- 完全符合官方使用规则,不用担心被反爬拦截
如果非要坚持网页抓取,得用能处理JS渲染的工具(比如RSelenium或者playwright),但这种方案维护成本高,不如API省心。
内容的提问来源于stack exchange,提问作者user7264
相关产品推荐
相关产品推荐

