无需Selenium的R语言网页爬取:ICICI网站表格抓取故障排查
解决R语言抓取ICICI Direct动态表格的问题
我帮你分析下问题所在,再给你可行的解决方案:
问题原因
你用rvest直接请求页面后得到空值,核心原因是这个页面的表格是动态加载的:服务器返回的初始静态HTML里根本没有#Table1这个元素,表格内容是页面加载完成后通过JavaScript渲染生成的。而rvest只能抓取服务器直接返回的静态HTML,自然找不到目标节点。
你可以验证这一点:运行read_html(Link) %>% html_text()查看返回的内容,会发现里面只有页面框架和JS加载代码,完全没有表格的实际数据。
解决方案
针对动态加载的页面,有两种常用的解决思路:
思路1:提取内嵌的JavaScript数据(更高效)
有些网站会把数据内嵌在页面的JS变量里,不需要模拟浏览器就能直接提取。你可以尝试以下步骤:
- 读取页面源码,找到包含表格数据的JS脚本
- 用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
相关产品推荐
相关产品推荐

