如何使用rvest爬取URL锚点(#)片段对应菜单下的网页数据
问题根因
你拿到空结果的核心原因有两个:
- URL里的
#锚点只在浏览器本地生效,不会提交到服务端,你带锚点发起请求和请求默认地址拿到的初始HTML完全一致 - 「Studies」板块的表格数据是页面加载后通过JS动态渲染的,
rvest只能解析初始静态HTML,不会执行JS,所以匹配不到对应元素
解决方案
推荐优先使用接口抓取方案,效率更高;如果需要模拟页面操作可以使用无头浏览器方案。
方案1:直接调用后端数据接口(推荐)
该站点的「Studies」数据有公开的后端接口,是页面加载对应板块时实际请求的数据源,返回结构化JSON,不需要自行解析HTML,稳定性和效率都更高:
library(httr) library(jsonlite) # 发起接口请求 resp <- GET("https://www.neurosynth.org/api/analyses/terms/dorsomedial%20prefrontal/studies") # 解析返回的JSON数据 studies_raw <- fromJSON(content(resp, as = "text")) # 提取你需要的研究名称、作者、期刊字段 target_df <- studies_raw$data[, c("title", "authors", "journal")]
方案2:使用RSelenium模拟浏览器动态渲染
如果需要直接爬取渲染后的页面内容,可以使用RSelenium模拟浏览器执行JS、加载动态内容后再解析:
library(RSelenium) library(rvest) # 启动Chrome驱动(需提前安装匹配浏览器版本的ChromeDriver) rd <- rsDriver(browser = "chrome", port = 4444L, chromever = "你的Chrome浏览器对应版本号") driver <- rd$client # 访问目标页面 driver$navigate("https://www.neurosynth.org/analyses/terms/dorsomedial%20prefrontal/#studies") # 等待动态内容加载完成,可根据网速调整等待时长 Sys.sleep(3) # 获取渲染完成的页面源码 page_html <- read_html(driver$getPageSource()[[1]]) # 提取表格内的链接元素 study_elements <- page_html %>% html_elements("#analysis-studies-table a") # 提取文本内容 study_texts <- html_text(study_elements) # 运行结束关闭驱动 driver$close() rd$server$stop()
内容的提问来源于stack exchange,提问作者Tzen
相关产品推荐
相关产品推荐

