R语言爬取PubMed子页面摘要失败的技术求助
PubMed摘要抓取代码修复方案
核心问题诊断
你的代码存在几个致命错误:
get_pubmed函数里硬编码覆盖了传入的链接参数,导致始终访问搜索主页面,而非单篇文献的详情页- 尝试直接对字符串类型的链接向量调用
html_nodes,这完全不符合rvest的使用逻辑——必须先读取每个链接对应的HTML页面 - 搜索结果页的短摘要选择器错误,详情页的摘要抓取逻辑混乱
修复后的完整代码
library(rvest) library(dplyr) library(purrr) # 搜索链接 link <- "https://pubmed.ncbi.nlm.nih.gov/?term=((((((%E2%80%98Food%20Supply%E2%80%99%20(MeSH))%20OR%20%E2%80%98Food%20Storage%E2%80%99%20(MeSH))%20OR%20%E2%80%98Hunger%E2%80%99(MeSH)%20OR%20food%20security%20OR%20food%20insecurity%20OR%20household%20food%20security%20OR%20global%20food%20security)%20OR%20household%20food%20insecurity)))%20AND%20((%E2%80%98Prevalence%E2%80%99%20(MeSH))%20OR%20%E2%80%98Cross-Sectional%20Studies%E2%80%99%20(MeSH)%20OR%20cross-sectional%20study%20OR%20Prevalence%20Studies%20OR%20prevalence%20study%20OR%20Cross-Sectional%20Analyses%20OR%20CrossSectional%20Analysis%20OR%20Cross%20Sectional%20Analysis%20OR%20Cross%20Sectional%20Analyses)&filter=lang.english&filter=lang.portuguese" # 读取搜索结果页面 page <- read_html(link) # 提取搜索结果的基础信息 pubmed <- tibble( title = page %>% html_nodes(".docsum-title") %>% html_text2(), authors = page %>% html_nodes(".full-authors") %>% html_text2(), pmid = page %>% html_nodes(".docsum-pmid") %>% html_text2(), snippet = page %>% html_nodes(".docsum-snippet") %>% html_text2(), detail_link = page %>% html_nodes(".docsum-title") %>% html_attr("href") %>% paste0("https://pubmed.ncbi.nlm.nih.gov", .) ) # 定义抓取单篇文献摘要的函数 get_abstract <- function(detail_url) { # 读取详情页HTML detail_page <- read_html(detail_url) # 提取英文摘要(合并段落,处理无摘要的情况) abstract <- detail_page %>% html_nodes("#eng-abstract .abstract-content p") %>% html_text2() %>% paste(collapse = " ") # 无摘要时返回NA if(length(abstract) == 0) abstract <- NA_character_ return(abstract) } # 批量抓取所有摘要(加入延迟避免被网站封禁) pubmed$abstract <- map_chr(pubmed$detail_link, ~{ Sys.sleep(1) # 每次请求间隔1秒,可根据情况调整 get_abstract(.x) }) # 查看结果 print(pubmed)
关键修改说明
- 函数逻辑修正:
get_abstract函数接收传入的详情页链接,单独读取每个页面的HTML后再提取摘要,不再硬编码主页面链接 - 选择器修正:搜索结果页的短摘要改用
.docsum-snippet(PubMed搜索结果预览的正确类名),详情页摘要使用#eng-abstract .abstract-content p精准定位英文摘要内容 - 防封禁处理:加入
Sys.sleep(1)控制请求频率,避免触发PubMed的反爬机制 - 容错处理:对无摘要的文献返回NA,避免代码中断
- 数据结构优化:使用
tibble替代data.frame,更适配tidyverse生态,同时用html_text2()替代html_text(),自动处理换行和空格
内容的提问来源于stack exchange,提问作者Ileeo
相关产品推荐
相关产品推荐

