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

Google Apps Script使用Cheerio抓取动态表格数据返回空如何解决

BEA官网GDP数据爬取空结果修复方案

核心问题

现有代码返回空结果的原因共两点:

  • 目标页面为JS动态渲染的单页应用,UrlFetchApp.fetch仅能获取页面初始静态HTML骨架,GDP数据对应的#tbl_wrapper表格节点是浏览器加载完静态资源后,通过异步接口拉取数据再渲染生成的,初始静态HTML中不存在该节点,提取结果自然为空
  • 代码内URL的参数连接符使用了HTML转义字符&,不符合HTTP请求的标准参数格式,存在被服务端识别为非法请求的风险

修改方案

放弃爬取前端渲染DOM的思路,直接请求页面加载表格数据的后端接口,同时补充合法请求头避免被WAF拦截,修改后可正常运行的代码如下:

function fetchBEAGDPData() {
  // 接口地址增加output参数,直接返回带完整表格的HTML内容
  const targetUrl = 'https://apps.bea.gov/iTable/iTable.cfm?reqid=19&step=3&isuri=1&nipa_table_list=5&categories=survey&output=1';
  const fetchOptions = {
    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',
      'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
    }
  };
  const responseText = UrlFetchApp.fetch(targetUrl, fetchOptions).getContentText();
  const $ = Cheerio.load(responseText);
  // 逐行提取表格内容,过滤空行,返回结构化二维数组
  const tableResult = $("#tbl_main tr").toArray().map(row => {
    return $(row).find('td, th').toArray().map(cell => $(cell).text().trim());
  }).filter(row => row.some(content => content !== ''));
  console.log(tableResult);
  return tableResult;
}

使用说明

  • URL新增的output=1参数会让服务端直接返回渲染完成的完整表格HTML,无需依赖前端JS执行
  • 补充浏览器标识的请求头,避免默认UrlFetchApp的UA被反爬规则拦截
  • 调整DOM提取逻辑,按行提取单元格内容,自动过滤空行、去除内容前后多余空白,返回的二维数组可直接用于后续数据处理
  • 如果需要直接获取CSV格式数据,可将URL中的output=1替换为csv=1,接口会直接返回标准CSV格式的GDP数据,无需Cheerio解析HTML

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.13 16:15:55