Google Sheets异步加载数据问题:如何实现类Selenium等待机制?
Google Sheets动态数据加载问题解答
有没有类似Selenium的等待机制?
没有。Google Sheets内置的IMPORTHTML、IMPORTDATA这类导入函数都是一次性拉取页面的静态初始HTML,不会等待JavaScript动态渲染内容,没有Selenium那种显式/隐式等待的功能。
为什么=IMPORTHTML("https://www.cboe.com/delayed_quotes/vix/future_quotes/","table",1)返回空内容?
你要抓取的CBOE页面里的VIX期货表格是靠JavaScript动态加载的,页面刚加载的静态HTML里根本没这个表格的完整数据,IMPORTHTML只能读取静态内容,所以返回空很正常。
解决办法
用Google Apps Script写自定义抓取脚本
这是最靠谱的方式,脚本可以模拟浏览器加载页面、处理动态内容,步骤如下:
- 打开你的Google Sheet,点击「扩展程序」→「Apps Script」。
- 替换默认代码为下面的脚本(需要先在Apps Script的「库」中添加Cheerio库,库ID:
1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0):
function fetchVIXFutures() { const targetUrl = "https://www.cboe.com/delayed_quotes/vix/future_quotes/"; const userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"; // 拉取页面内容 const response = UrlFetchApp.fetch(targetUrl, {headers: {"User-Agent": userAgent}}); const htmlContent = response.getContentText(); // 用Cheerio解析HTML const $ = Cheerio.load(htmlContent); const targetTable = $("table").first(); const tableData = []; // 提取表格的每一行数据 targetTable.find("tr").each((_, row) => { const rowCells = []; $(row).find("th, td").each((_, cell) => { rowCells.push($(cell).text().trim()); }); if (rowCells.length > 0) tableData.push(rowCells); }); // 把数据写入当前工作表的A1开始位置 const activeSheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); activeSheet.getRange(1, 1, tableData.length, tableData[0].length).setValues(tableData); }
- 保存脚本后,运行
fetchVIXFutures,就能把动态加载的VIX期货表格数据导入Sheet了。
直接抓取数据源API
打开浏览器开发者工具的「网络」标签,刷新CBOE页面,找到加载数据的API请求(一般为JSON格式),然后用IMPORTJSON函数(可自定义编写或安装现成插件)直接拉取API数据,这种方式比抓取页面更高效稳定。
内容的提问来源于stack exchange,提问作者Michael WS
相关产品推荐
相关产品推荐

