如何使用Apps Script抓取OLG网站动态渲染的彩票奖池数据?
解决OLG动态渲染彩票数据抓取问题的可行方案
由于目标数据是JavaScript动态渲染的,ImportXML和普通UrlFetchApp调用只能获取静态HTML,无法拿到实际展示的开奖金额。以下是三种可行的解决方法:
1. 用Apps Script + Google Cloud Function + Puppeteer渲染页面
这种方法通过无头浏览器完整渲染页面后提取数据,兼容性最强:
步骤1:创建Cloud Function(处理渲染和抓取)
在Google Cloud控制台创建HTTP触发的Cloud Function,使用Node.js环境,安装puppeteer依赖,代码如下:
const puppeteer = require('puppeteer'); exports.scrapeOLGJackpots = async (req, res) => { const browser = await puppeteer.launch({ args: ['--no-sandbox', '--disable-setuid-sandbox'] }); const page = await browser.newPage(); // 等待页面完全渲染 await page.goto('https://www.olg.ca/en/home.html', { waitUntil: 'networkidle2' }); // 提取目标数据 const results = await page.evaluate(() => { return { lottoMax: { jackpot: document.querySelector('[data-testid="lotto-max-jackpot"]')?.textContent.trim() || 'N/A', maxMillions: document.querySelector('[data-testid="max-millions-count"]')?.textContent.trim() || 'N/A' }, lotto649: { goldBallJackpot: document.querySelector('[data-testid="lotto-649-gold-ball-jackpot"]')?.textContent.trim() || 'N/A' }, lottario: { jackpot: document.querySelector('[data-testid="lottario-jackpot"]')?.textContent.trim() || 'N/A' } }; }); await browser.close(); res.json(results); };
步骤2:在Google Sheets的Apps Script中调用云函数
部署Cloud Function后,复制其HTTP触发URL,在Sheet的脚本编辑器中编写调用函数:
function getOLGJackpotData() { const cloudFuncUrl = '替换为你的Cloud Function HTTP URL'; const response = UrlFetchApp.fetch(cloudFuncUrl); const data = JSON.parse(response.getContentText()); const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 写入数据到指定单元格 sheet.getRange('A1').setValue(`LottoMax头奖: ${data.lottoMax.jackpot}`); sheet.getRange('A2').setValue(`Max Millions数量: ${data.lottoMax.maxMillions}`); sheet.getRange('A3').setValue(`Lotto649金球奖: ${data.lotto649.goldBallJackpot}`); sheet.getRange('A4').setValue(`LOTTARIO头奖: ${data.lottario.jackpot}`); }
2. 挖掘OLG内部API(最高效方案)
OLG官网的动态数据大概率来自内部API,可通过浏览器开发者工具找到:
- 打开目标页面,按F12打开开发者工具,切换到Network面板
- 刷新页面,筛选Fetch/XHR类型的请求,查找返回彩票开奖数据的接口(通常路径包含
jackpot、lottery等关键词) - 找到接口后,直接用
UrlFetchApp调用获取结构化JSON数据
示例代码(假设找到API端点):
function fetchOLGAPIData() { const apiEndpoint = '替换为你找到的OLG内部API URL'; const response = UrlFetchApp.fetch(apiEndpoint); const jackpotData = JSON.parse(response.getContentText()); const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet(); // 根据API返回的结构提取数据,以下为示例,需对应实际字段 sheet.getRange('A1').setValue(`LottoMax头奖: ${jackpotData.lottoMax.jackpot}`); sheet.getRange('A2').setValue(`Max Millions: ${jackpotData.lottoMax.maxMillions}`); sheet.getRange('A3').setValue(`Lotto649金球奖: ${jackpotData.lotto649.goldBall}`); sheet.getRange('A4').setValue(`LOTTARIO头奖: ${jackpotData.lottario.jackpot}`); }
3. 使用支持JS渲染的第三方抓取工具(简化方案)
如果不想搭建Cloud Function,可使用支持动态页面渲染的抓取工具生成目标页面的静态快照,再用IMPORTHTML提取数据。注意选择可信工具,避免数据泄露风险。
内容的提问来源于stack exchange,提问作者T White
相关产品推荐
相关产品推荐

