如何在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
相关产品推荐
相关产品推荐

