如何使用rvest正确提取gnomad数据库中的变异位点ID信息
问题根因
- gnomad 是基于React构建的动态单页应用,
rvest::read_html()仅能抓取服务端返回的初始静态HTML骨架,你要的变异列表数据是页面在浏览器端加载完成后,通过JavaScript异步请求接口动态渲染的,静态抓取到的源码里根本不存在对应的变异节点,无论怎么调整CSS选择器、XPath表达式都无法匹配到内容。 - 你通过selectorgadget获取的
.cmvTB、.bxQxTC属于前端工程化打包时生成的随机混淆类名,没有固定语义,站点迭代发布后类名就会变化,本身就不适合作为爬取定位的依据。
可行方案
最稳定高效的方式是直接调用gnomad自带的公开GraphQL接口取数,不需要依赖无头浏览器渲染页面,可直接拿到结构化的变异数据,参考代码如下:
library(httr) library(jsonlite) # 构造GraphQL查询语句 gql_query <- ' query GetRegionVariants($chrom: String!, $start: Int!, $end: Int!, $dataset: DatasetId!) { region(chrom: $chrom, start: $start, stop: $end) { variants(dataset: $dataset) { variant_id } } } ' # 发起接口请求 api_resp <- POST( url = "https://gnomad.broadinstitute.org/api/", body = list( query = gql_query, variables = list( chrom = "1", start = 55516868, end = 55516908, dataset = "gnomad_r3" ) ), encode = "json" ) # 解析返回结果 resp_data <- fromJSON(content(api_resp, as = "text"), flatten = TRUE) variant_list <- resp_data$data$region$variants$variant_id
运行代码后variant_list即为目标变异ID向量,完全匹配你预期的4个结果:1-55516880-T-C、1-55516902-T-G、1-55516903-G-GC、1-55516905-C-CT。
如果必须通过页面解析的方式获取数据,需要使用chromote、RSelenium这类可驱动真实浏览器的工具,等待页面JS渲染完成后再提取节点,但这类方案效率低、易受页面变动影响,不推荐使用。
内容的提问来源于stack exchange,提问作者Krutik
相关产品推荐
相关产品推荐

