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

如何在Google Apps Script中使用Cheerio抓取雅虎财经的HTML表格数据?

问题原因
  • 你抓取的静态页面本身就没有全量数据:雅虎财经历史行情页首次加载的静态HTML里,默认只返回最近100条左右的交易数据,差不多就是5个月的量。你在浏览器里看到的一整年数据,是滚动页面的时候,页面自动调用接口拉取剩下的内容再插到表格里的,静态请求初始页面根本拿不到后面的部分。
  • 请求头缺失导致返回数据被限制:雅虎会检查请求的身份标识,你直接用UrlFetchApp默认参数请求,没有带浏览器的User-Agent等字段,被识别为爬虫,返回的数据量会被进一步压缩。
修复方案

不建议爬HTML页面解析表格,直接用雅虎公开的历史行情结构化接口,不用解析DOM,还能自定义时间范围,稳定性高很多,修复后代码如下:

function getFullCLFHistory() {
  // 自定义抓取的时间范围:最近一整年,时间戳转换为秒级
  const endTimestamp = Math.floor(Date.now() / 1000);
  const startTimestamp = endTimestamp - 365 * 24 * 60 * 60;
  const stockCode = 'CL=F';
  // 直接请求结构化CSV数据接口,自动返回对应时间范围的全量数据
  const reqUrl = `https://query1.finance.yahoo.com/v7/finance/download/${encodeURIComponent(stockCode)}?period1=${startTimestamp}&period2=${endTimestamp}&interval=1d&events=history`;

  const reqOptions = {
    muteHttpExceptions: true,
    // 补充浏览器UA头,避免被拦截限制
    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'
    }
  };

  const csvData = UrlFetchApp.fetch(reqUrl, reqOptions).getContentText();
  // 拆分CSV得到所有行数据,第一行是表头,后面都是交易数据
  const allDataRows = csvData.split('\n').filter(row => row.trim() !== '');
  // 打印时间范围最早的那条数据的日期
  console.log(allDataRows[allDataRows.length - 1].split(',')[0]);
}

如果你一定要解析原页面的HTML表格,需要用支持模拟浏览器行为的工具(比如Puppeteer),模拟页面滚动直到所有数据加载完成后再提取表格内容,但是效率和稳定性都远不如直接调用结构化接口。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 21:48:04