使用Cheerio+Node.js无法抓取Solscan代币持有者数量问题求助
解决Solscan代币持有者数量抓取失败的问题
问题根源
你遇到的问题是因为Solscan是单页应用(SPA),通过axios.get直接获取的HTML只是页面骨架,持有者这类动态数据是页面加载完成后通过AJAX请求异步获取并渲染的。Cheerio只能解析静态HTML,自然抓不到动态生成的DOM元素。
解决方案
方案1:使用无头浏览器(Puppeteer)模拟页面加载
Puppeteer可以模拟真实浏览器的渲染过程,等待页面动态数据加载完成后再抓取内容:
- 先安装依赖:
npm install puppeteer
- 修改抓取代码:
const puppeteer = require('puppeteer'); async function getHolders() { try { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://solscan.io/token/EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v#analysis', { waitUntil: 'networkidle2' }); // 等待目标元素加载完成后提取内容 const holders = await page.$eval('div.ant-typography span.sc-doKvHv.hAxaGu', el => el.textContent); console.log('持有者数量:', holders); await browser.close(); } catch (err) { console.error(err); } } getHolders();
方案2:直接调用Solscan的API接口(更高效)
通过浏览器开发者工具抓包,可以找到Solscan获取持有者数据的API接口,直接请求接口比模拟浏览器更高效:
const axios = require('axios'); async function getHolders() { try { // 替换为实际抓包得到的API地址 const apiUrl = 'https://api.solscan.io/token/holders?tokenAddress=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&offset=0&limit=10'; const { data } = await axios.get(apiUrl, { headers: { // 添加必要请求头模拟浏览器请求 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' } }); // 从返回的JSON数据中提取总持有者数量(字段以实际API返回为准) const totalHolders = data.total; console.log('持有者数量:', totalHolders); } catch (err) { console.error(err); } } getHolders();
补充说明
你之前用的CSS选择器本身没问题,但因为初始HTML里没有这个元素,所以Cheerio无法匹配到。两种方案都能解决动态内容抓取的问题,优先推荐API方案,速度更快且资源消耗更低。
内容的提问来源于stack exchange,提问作者mzaidi
相关产品推荐
相关产品推荐

