无法用rvest/V8抓取动态网页表格的技术求助
动态表格抓取解决方案(针对SEIA目标网站)
问题定位
报错ReferenceError: UbicaciónPlazos is not defined的核心原因是你调用的JS变量UbicaciónPlazos不在页面全局作用域内——它要么被封装在局部闭包里,要么需要等待页面JS完全执行后才会生成。
替代解决方法(无需Selenium/Java)
1. 直接抓取接口数据(最稳定)
打开浏览器开发者工具(F12)→ 切换到Network标签页,刷新页面:
- 筛选XHR/Fetch类型请求,找到返回表格数据的JSON接口
- 复制该接口的URL、请求头(重点保留
Cookie和User-Agent) - 用R的
httr或curl包直接请求接口,解析JSON生成表格
示例R代码:
library(httr) library(jsonlite) # 替换为你找到的目标接口URL api_url <- "https://seia.sea.gob.cl/对应接口路径" headers <- add_headers( "User-Agent" = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36", "Cookie" = "你的浏览器Cookie内容" ) # 请求并解析数据 response <- GET(api_url, headers) raw_data <- fromJSON(content(response, "text")) table_df <- as.data.frame(raw_data) # 保存为CSV write.csv(table_df, "seia_table.csv", row.names = FALSE)
2. 修复V8调用逻辑
如果坚持用V8,放弃依赖未暴露的变量,直接从DOM提取表格内容:
library(V8) ctx <- v8() # 读取页面HTML并加载到V8上下文 page_html <- readLines("https://seia.sea.gob.cl/expediente/expedientesEvaluacion.php?modo=ficha&id_expediente=7673283", warn = FALSE) ctx$eval(paste0("document.body.innerHTML = '", paste(page_html, collapse = ""), "';")) # 提取表格数据 table_data <- ctx$eval(" let table = document.querySelector('table'); // 根据页面实际表格选择器调整 let result = []; let rows = table.rows; for (let i = 0; i < rows.length; i++) { let row = []; let cells = rows[i].cells; for (let j = 0; j < cells.length; j++) { row.push(cells[j].textContent.trim()); } result.push(row); } result; ") # 转换为数据框并保存 final_df <- as.data.frame(do.call(rbind, table_data)) write.csv(final_df, "seia_table.csv", row.names = FALSE)
调试技巧
- 打开目标页面的开发者工具→Console标签,直接输入
UbicaciónPlazos,确认变量是否存在 - 若变量不存在,在Sources标签搜索该变量,查看它的定义位置和作用域范围
- 优先选择接口抓取方案,比解析DOM更不易受页面结构变更影响
内容的提问来源于stack exchange,提问作者Raimundo
相关产品推荐
相关产品推荐

