Axios配合Cheerio爬取网页仅获取父级div无法获取子div问题求助
问题原因
你遇到的是服务端返回原始HTML和客户端渲染后DOM不一致的问题,核心原因如下:
axios仅能获取站点服务器直接返回的初始静态HTML内容,不会执行页面附带的JavaScript代码。你在浏览器开发者工具中看到的完整DOM结构,是页面加载后本地JS执行、动态插入元素后的最终结果。- sl.se 采用了客户端渲染的架构,初始返回的HTML里仅包含你拿到的那些父级div容器,所有嵌套子div都是JS运行后动态生成的,自然无法用cheerio从初始HTML里提取到。
- 你测试的另一个站点aftonbladet是服务端直出全量DOM结构,初始HTML就包含所有层级的div,所以原有代码可以正常运行。
解决方案
有两种常用的解决路径:
方案1:使用支持JS执行的无头爬虫工具
替换原有axios+cheerio的组合,改用Puppeteer、Playwright这类可以模拟真实浏览器运行的工具,等页面JS执行完成后再提取DOM元素,示例代码如下:
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://sl.se/', { waitUntil: 'networkidle0' // 等待网络请求全部完成,确保JS执行完毕 }); // 提取所有div的class const divClasses = await page.evaluate(() => { return Array.from(document.querySelectorAll('div')).map(div => div.className); }); console.log(divClasses); await browser.close(); })();
方案2:直接抓取站点异步数据接口
打开浏览器控制台的「网络」面板,筛选XHR/Fetch类型的请求,找到sl.se加载页面内容时调用的后端接口,直接用axios请求这些接口获取原始数据,不需要解析DOM,效率更高。
额外注意
请求时建议添加和真实浏览器一致的User-Agent请求头,避免被站点反爬策略拦截,同时遵守目标站点的robots.txt规则。
内容的提问来源于stack exchange,提问作者Brewsli
相关产品推荐
相关产品推荐

