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

为何UrlfetchApp.fetch无法获取完整HTML?谷歌Apps Script爬取问题

问题分析

你遇到的核心问题是目标网站属于单页应用(SPA),页面内容是通过JavaScript动态渲染生成的。UrlFetchApp.fetch()只能获取服务器返回的初始静态HTML,此时<div id="root">还未被填充实际内容,自然匹配不到结果。

解决方案

方案1:直接请求网站的API接口(推荐)

这类赛事网站通常会通过API接口获取数据来渲染页面,直接请求API比解析HTML更高效可靠:

  1. 打开目标网站,按下F12打开浏览器开发者工具,切换到「Network」标签页。
  2. 刷新页面,在过滤器中选择「XHR/Fetch」,查看所有动态请求。
  3. 找到返回赛事数据的API请求(通常返回JSON格式),复制其请求URL和必要的请求头。
  4. 在Google Apps Script中直接请求该API,解析返回的JSON数据。示例代码如下:
function getTournamentData() {
  // 替换为实际找到的API地址
  var apiUrl = "https://turniere.schachklub-kelheim.de/api/tournament/BAD-2022-U16";
  var options = {
    "method": "get",
    "headers": {
      // 如有需要,添加从开发者工具中复制的请求头
      "Accept": "application/json"
    }
  };
  var response = UrlFetchApp.fetch(apiUrl, options);
  var data = JSON.parse(response.getContentText());
  console.log(data);
}

方案2:获取渲染后的完整HTML

如果找不到API接口,需要获取JavaScript渲染后的页面内容,可以借助支持JS执行的工具:
由于Google Apps Script本身不支持执行JavaScript,你需要借助外部的Headless Chrome服务(如Cloud Run、AWS Lambda部署的Puppeteer服务),让服务执行页面JS后返回完整HTML,再在GAS中请求该服务的结果。

额外提示:修正正则表达式(若后续用到)

即使拿到了完整HTML,你原代码中的正则表达式转义也有问题,正确的写法应该是:

var pattern = /<div id="root">(.*?)<\/div>/g;
var match = response.match(pattern);

但更推荐使用专门的HTML解析库(如Cheerio)来处理HTML,而非正则表达式,避免因HTML结构变化导致匹配失败。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:52:43