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

Fetch抓取页面缺失tbody、非JSON站点数据获取的技术咨询

问题解答

问题1:抓取股票行业信息时table缺失tbody

你拿到的是服务器返回的原始静态HTML,tbody是页面加载后由前端JavaScript动态生成的——fetch只会获取服务器初始响应,不会执行页面内的JS,所以直接用DOMParser解析静态文本根本拿不到动态渲染的内容,和“等待页面加载”无关。

解决方法

方法1:直接调用官方API(推荐)

NSE India提供了公开API接口,可直接获取股票行业数据,无需抓取页面:

fetch('https://www.nseindia.com/api/quote-equity?symbol=3IINFOLTD')
  .then(res => res.json())
  .then(data => {
    const industry = data.info.industry;
    const sector = data.info.sector;
    console.log('行业:', industry, '板块:', sector);
  })
  .catch(err => console.error(err));

返回的JSON里直接包含所需的行业、板块信息,比抓页面高效可靠。

方法2:用无头浏览器模拟完整渲染

若必须抓取页面内容,可使用Puppeteer模拟浏览器环境,等待JS执行完毕后再获取DOM:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  // 等待网络请求基本完成,确保JS渲染完数据
  await page.goto('https://www.nseindia.com/get-quotes/equity?symbol=3IINFOLTD', { waitUntil: 'networkidle2' });
  
  const tableData = await page.evaluate(() => {
    const rows = document.querySelectorAll('#industryInfo tbody tr');
    return Array.from(rows).map(row => {
      return Array.from(row.querySelectorAll('td')).map(cell => cell.textContent.trim());
    });
  });
  
  console.log(tableData);
  await browser.close();
})();

问题2:不支持JSON的网站,await和setTimeout无效的解决办法

await和setTimeout没用的核心原因是:fetch仅获取静态HTML,setTimeout只是延迟解析静态内容,不会触发页面JS执行,自然拿不到动态生成的数据。可尝试以下方案:

  • 查找隐藏的API接口:打开浏览器开发者工具的「网络」面板,刷新页面后过滤XHR/fetch请求,查看页面加载时是否调用后端接口获取数据。找到后直接调用这些接口,返回的通常是JSON格式,比抓页面更高效。
  • 用无头浏览器渲染页面:参考问题1的方法2,使用Puppeteer或Playwright模拟完整浏览器环境,等待页面完全渲染(包括JS执行)后提取数据,能覆盖所有动态渲染场景。
  • 解析页面内的script标签:部分网站会把数据放在HTML的<script>标签中(如window.__INITIAL_STATE__这类全局变量),可解析HTML后提取script内容,再用正则或JSON.parse获取数据:
fetch('目标URL')
  .then(res => res.text())
  .then(html => {
    const parser = new DOMParser();
    const doc = parser.parseFromString(html, 'text/html');
    const scriptTags = doc.querySelectorAll('script');
    for (const script of scriptTags) {
      if (script.textContent.includes('__INITIAL_STATE__')) {
        const match = script.textContent.match(/window.__INITIAL_STATE__ = (.*?);/);
        if (match) {
          const data = JSON.parse(match[1]);
          console.log(data);
        }
      }
    }
  });

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:10:36