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

如何通过GAS的Cheerio正确获取Google Flights指定机票价格?

解决Google Flights价格爬取失败的问题

问题根源

  1. 动态渲染限制:Google Flights的价格数据并非直接嵌入初始HTML,而是页面加载后通过JavaScript异步拉取并渲染的。UrlFetchApp只能抓取静态页面源码,无法获取JS生成的动态内容,因此拿不到价格数据。
  2. 选择器过于宽泛:原代码用$('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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 11:26:16