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

使用Puppeteer爬取NBA官网表格返回空数组求助

解决NBA Stats表格爬取空数组问题

问题根源

NBA Stats页面的表格是动态渲染的,你的代码在页面还没完成表格加载时就执行了抓取;另外默认的Puppeteer配置可能被网站识别为爬虫,限制了内容加载。

修复方案

调整代码,加入等待元素加载、模拟真实浏览器配置:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({
    headless: false, // 先开可视化模式验证加载情况,上线后可改回true
    args: ['--no-sandbox', '--disable-setuid-sandbox'],
    defaultViewport: null, // 使用默认浏览器视口
  });
  const page = await browser.newPage();
  
  // 设置真实浏览器User-Agent,规避反爬拦截
  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');
  
  // 等待网络空闲再执行后续操作,确保页面资源加载完成
  await page.goto('https://www.nba.com/stats/teams/isolation?PerMode=Totals&TypeGrouping=offensive', {
    waitUntil: 'networkidle2',
    timeout: 60000, // 延长超时时间,适配页面加载速度
  });
  
  // 等待目标tbody元素出现,确保表格已渲染完成
  await page.waitForSelector('tbody.Crom_body__UYOcU', { timeout: 30000 });

  const data = await page.evaluate(() => {
    const rows = Array.from(document.querySelectorAll('tbody.Crom_body__UYOcU tr'));
    return rows.map((row) => {
      const tds = Array.from(row.querySelectorAll('td'));
      return tds.map(td => td.textContent.trim());
    });
  });

  console.log(data);
  await browser.close();
})();

关键调整说明

  • 等待元素加载:用page.waitForSelector确保目标表格tbody存在后再抓取,避免过早执行导致空数组。
  • 模拟真实浏览器:设置User-Agent和默认视口,降低被网站反爬机制识别的概率。
  • 延长超时与网络等待:networkidle2等待网络请求基本完成,延长超时时间适配页面加载速度。
  • 可视化调试:开启headless: false可以直观看到页面加载状态,方便排查弹窗、加载失败等问题。

如果仍无法获取数据,可补充排查:

  • 检查页面是否有需要手动关闭的弹窗,若有则加入点击关闭的代码(比如抓取前定位弹窗关闭按钮并点击)。
  • 验证选择器有效性:在浏览器开发者工具控制台执行document.querySelectorAll('tbody.Crom_body__UYOcU tr'),确认是否能获取到行元素,避免class名动态变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:32:48