使用R抓取网页嵌入表格报subscript out of bounds错误如何解决
问题根因
两次爬取失败的核心原因:目标页Performance Characteristics板块的内容是页面初始加载完成后,由JavaScript异步拉取数据渲染生成的,并非嵌在首次返回的静态HTML源码中。rvest::read_html()仅能获取首次请求返回的静态源码,不会执行页面JS逻辑,因此不管怎么调整XPath路径,都匹配不到动态生成的节点,自然拿不到目标数据。
实现方法
不用上RSelenium、Playwright这类重的浏览器模拟方案,直接抓页面调用的异步数据接口效率更高、稳定性更好:
- 打开浏览器开发者工具,切换到「网络」面板,筛选Fetch/XHR请求后刷新页面,就能找到对应产品基本面数据的接口,接口直接返回结构化JSON数据,省去解析HTML的步骤。
- 构造请求调用接口,直接提取目标字段即可,可复现代码如下:
library(httr) library(jsonlite) library(glue) # 从目标url提取产品ID,构造数据接口地址 product_id <- "251795" api_endpoint <- glue("https://www.ishares.com/uk/individual/en/products/{product_id}/fund/1506575576011.ajax?tab=performance") # 携带常规浏览器请求头,避免被反爬拦截 response <- GET( api_endpoint, add_headers( `User-Agent` = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36" ) ) # 解析返回的JSON格式数据 fund_perf_data <- fromJSON(content(response, as = "text")) # 提取目标字段:12个月滚动收益率 trailing_yield_12m <- fund_perf_data$performanceData$trailingYield12m print(trailing_yield_12m)
运行上述代码即可直接拿到目标值3.43%。如果后续接口路径有微调,只需要在开发者工具的网络面板里找到最新的接口地址替换即可,这类官方数据接口的字段结构很少变动,比解析HTML节点的方案鲁棒性更强。
内容的提问来源于stack exchange,提问作者Robbo
相关产品推荐
相关产品推荐

