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

无法用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:47:03