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

使用Puppeteer获取Google Finance股票数据时选择器报错

解决Google Finance数据爬取的Puppeteer问题

Chrome开发者工具复制的复杂选择器大多依赖动态生成的类名、索引或DOM结构,这类选择器会随着页面更新或渲染逻辑变化失效,导致waitForSelector找不到元素。以下是更稳定的爬取方案:

核心思路

放弃动态生成的复杂选择器,改用语义化属性(如data-testid)或文本匹配的XPath定位元素,这类标识通常是为自动化测试预留的,稳定性更高。

完整代码示例

const puppeteer = require('puppeteer');

async function fetchAAPLData() {
  const browser = await puppeteer.launch({ headless: 'new' });
  const page = await browser.newPage();

  // 模拟真实浏览器UA,规避基础反爬
  await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36');

  try {
    // 等待网络空闲确保页面完全加载
    await page.goto('https://www.google.com/finance/quote/AAPL:NASDAQ', {
      waitUntil: 'networkidle2',
      timeout: 30000
    });

    // 获取变动价格:使用页面预留的data-testid属性定位
    const changePrice = await page.$eval('div[data-testid="price-change"]', el => el.textContent.trim());

    // 获取利润率:通过XPath匹配文本标签,取相邻数值元素
    const profitMarginXPath = '//div[contains(text(), "Profit margin")]/following-sibling::div';
    await page.waitForXPath(profitMarginXPath);
    const [profitMarginEl] = await page.$x(profitMarginXPath);
    const profitMargin = await page.evaluate(el => el.textContent.trim(), profitMarginEl);

    console.log('变动价格:', changePrice);
    console.log('利润率:', profitMargin);
  } catch (err) {
    console.error('爬取失败:', err.message);
  } finally {
    await browser.close();
  }
}

fetchAAPLData();

关键注意事项

  • 避免动态选择器:永远不要依赖Chrome复制的带随机字符的类名(如div.some-random-abc123),这类会随页面更新失效。
  • 等待策略:用networkidle2替代默认的load,确保异步加载的内容完全渲染。
  • 反爬规避:设置真实UA、控制请求频率,必要时添加随机延迟(await page.waitForTimeout(1000)),避免触发Google的反爬机制。
  • XPath适配:如果"Profit margin"文本有本地化差异,需调整XPath中的匹配文本。

内容的提问来源于stack exchange,提问作者Vinay Guda

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 00:55:38