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

使用Google Apps Script爬取FINRA网页表格返回无数据问题求助

问题根因

现有脚本无法获取有效数据的核心逻辑有两点:

  • 目标页面的FINRA TRACE债券市场活动表格属于前端动态渲染内容:UrlFetchApp发起请求仅能获取页面初始返回的静态HTML骨架,这部分HTML中并未填充任何表格实际数据。表格内容是页面在浏览器环境下加载完成后,执行前端JavaScript脚本、异步调用后端数据接口拿到数据后才插入到DOM结构中的。
  • Cheerio仅能解析已经拿到的静态HTML文本,不具备执行页面内前端JavaScript的能力,自然无法选中不存在于初始HTML中的表格内容。你测试的第二个相关页面采用完全一致的动态渲染逻辑,因此同样无法拿到有效返回结果。
可行方案

跳过爬取渲染后页面的步骤,直接抓取页面加载数据时调用的后端数据接口,拿到结构化的JSON格式数据,稳定性和解析效率远高于爬取HTML后解析的方案。

可直接运行的GAS实现代码

function fetchFINRATraceBondStats() {
  // 目标表格对应的后端数据接口
  const apiEndpoint = "https://finra-markets.morningstar.com/transferPage.jsp";
  // 接口请求参数
  const reqParams = {
    path: "http://muni-internal.morningstar.com/public/MarketBreadth/C",
    ts: Date.now().toString()
  };
  // 请求配置,模拟正常浏览器访问避免被反爬拦截
  const fetchOptions = {
    method: "GET",
    muteHttpExceptions: true,
    headers: {
      "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
      "Referer": "https://finra-markets.morningstar.com/BondCenter/TRACEMarketAggregateStats.jsp",
      "Accept": "application/json, text/javascript, */*; q=0.01"
    }
  };
  // 拼接完整请求地址
  const requestUrl = `${apiEndpoint}?path=${encodeURIComponent(reqParams.path)}&_=${reqParams.ts}`;
  const response = UrlFetchApp.fetch(requestUrl, fetchOptions);
  // 解析接口返回的JSON格式数据
  const bondStatsData = JSON.parse(response.getContentText());
  Logger.log(bondStatsData);
  // 后续可直接遍历bondStatsData提取需要的字段,无需再用Cheerio解析HTML
  return bondStatsData;
}

扩展说明

  • 如果需要抓取同站点下的其他表格数据,打开浏览器开发者工具的「网络」面板,筛选Fetch/XHR类型请求,刷新页面后找到返回对应表格数据的请求,替换代码中path参数的取值即可。
  • 请求时请控制频率,添加合理的请求间隔,避免被站点反爬策略拦截。
  • 该方案不需要额外引入Cheerio依赖,接口直接返回结构化数据,解析成本远低于HTML解析方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:18:53