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
相关产品推荐
相关产品推荐

