如何通过GAS的Cheerio正确获取Google Flights指定机票价格?
解决Google Flights价格爬取失败的问题
问题根源
- 动态渲染限制:Google Flights的价格数据并非直接嵌入初始HTML,而是页面加载后通过JavaScript异步拉取并渲染的。UrlFetchApp只能抓取静态页面源码,无法获取JS生成的动态内容,因此拿不到价格数据。
- 选择器过于宽泛:原代码用
$('div,span').text()会把页面所有div、span的文本全部拼接,就算有价格也会被无关内容淹没,无法有效提取。
解决方案
方法1:用支持JS渲染的工具(推荐)
Google Apps Script自带的UrlFetchApp不支持执行JavaScript,需要借助能模拟浏览器渲染的工具(比如Puppeteer)。可以部署Google Cloud Function运行Puppeteer,再在Apps Script中调用该函数获取渲染后的页面内容。
Cloud Function代码(Node.js)
const puppeteer = require('puppeteer'); exports.getFlightPrices = async (req, res) => { const url = "https://www.google.com/travel/flights/s/fhfbNzzwytaS3Xgs8"; const browser = await puppeteer.launch({ headless: 'new' }); const page = await browser.newPage(); await page.goto(url, { waitUntil: 'networkidle2' }); // 等待网络空闲,确保内容加载完成 // 定位价格元素,类名需根据当前页面结构调整(可通过Chrome开发者工具查看) const prices = await page.evaluate(() => { const priceElements = document.querySelectorAll('.U3gSDe'); return Array.from(priceElements).map(el => el.textContent); }); await browser.close(); res.status(200).send(prices); };
Apps Script调用代码
function fetchFlightPrices() { const cloudFunctionUrl = "你的Cloud Function部署URL"; const response = UrlFetchApp.fetch(cloudFunctionUrl); const prices = JSON.parse(response.getContentText()); Logger.log(prices); }
方法2:直接调用API接口(稳定性差)
通过Chrome开发者工具的Network面板,找到Google Flights加载价格时的API请求,分析请求参数和签名规则,在Apps Script中模拟请求。但这类接口无公开文档,参数规则随时可能变动,不推荐长期使用。
注意事项
- Google Flights的页面类名、结构经常更新,需定期检查价格元素的选择器是否有效(用Chrome右键检查元素查看最新标识)。
- 频繁爬取可能触发反爬机制,导致IP被限制,需控制请求频率。
内容的提问来源于stack exchange,提问作者Michael Wu
相关产品推荐
相关产品推荐

