使用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
相关产品推荐
相关产品推荐

