You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无需Selenium的R语言网页爬取:ICICI网站表格抓取故障排查

解决R语言抓取ICICI Direct动态表格的问题

我帮你分析下问题所在,再给你可行的解决方案:

问题原因

你用rvest直接请求页面后得到空值,核心原因是这个页面的表格是动态加载的:服务器返回的初始静态HTML里根本没有#Table1这个元素,表格内容是页面加载完成后通过JavaScript渲染生成的。而rvest只能抓取服务器直接返回的静态HTML,自然找不到目标节点。

你可以验证这一点:运行read_html(Link) %>% html_text()查看返回的内容,会发现里面只有页面框架和JS加载代码,完全没有表格的实际数据。

解决方案

针对动态加载的页面,有两种常用的解决思路:

思路1:提取内嵌的JavaScript数据(更高效)

有些网站会把数据内嵌在页面的JS变量里,不需要模拟浏览器就能直接提取。你可以尝试以下步骤:

  1. 读取页面源码,找到包含表格数据的JS脚本
  2. 用V8引擎解析JS代码,提取数据并转换成数据框

示例代码:

library(rvest)
library(V8)

# 读取页面静态内容
page <- read_html("https://www.icicidirect.com/idirectcontent/Research/TechnicalAnalysis.aspx/balancesheet/tcs")

# 筛选包含数据的脚本标签(需要根据页面实际情况调整关键词)
target_script <- page %>% 
  html_nodes("script") %>% 
  html_text() %>% 
  grep("balancesheet|financialData", ., value = TRUE) # 用相关关键词定位脚本

# 初始化V8引擎解析JS
ctx <- v8()
ctx$eval(target_script)

# 提取数据(变量名需要根据页面实际的JS变量调整)
raw_data <- ctx$get("balancesheetData") # 假设数据存在这个变量里
# 转换为数据框
result_df <- as.data.frame(raw_data)

如果找不到对应的内嵌JS变量,就用下面的通用方案。

思路2:模拟浏览器加载页面(通用方案)

用工具模拟真实浏览器的行为,等待JS渲染完成后再抓取页面内容。推荐用playwrightr(比RSelenium更轻量、稳定):

示例代码:

library(playwrightr)
library(rvest)

# 首次运行需要安装浏览器依赖
playwright_install()

# 启动无头浏览器(不显示窗口)
browser <- chromium_launch(headless = TRUE)
page <- browser %>% page_new()

# 导航到目标页面,等待网络空闲确保JS加载完成
page %>% 
  page_goto(
    "https://www.icicidirect.com/idirectcontent/Research/TechnicalAnalysis.aspx/balancesheet/tcs",
    wait_until = "networkidle"
  )

# 抓取渲染后的完整HTML
rendered_html <- page %>% page_content() %>% read_html()

# 提取目标表格
table_result <- rendered_html %>% 
  html_nodes("#Table1") %>% 
  html_table(fill = TRUE) # fill=TRUE处理不规则表格

# 关闭浏览器
browser %>% browser_close()

# 查看结果
print(table_result)

这个方法几乎能解决所有动态页面的抓取问题,因为它模拟了真实用户浏览的过程,页面所有JS渲染的内容都会被抓取到。

内容的提问来源于stack exchange,提问作者Bogaso

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:00:32