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

使用Cheerio+Node.js无法抓取Solscan代币持有者数量问题求助

解决Solscan代币持有者数量抓取失败的问题

问题根源

你遇到的问题是因为Solscan是单页应用(SPA),通过axios.get直接获取的HTML只是页面骨架,持有者这类动态数据是页面加载完成后通过AJAX请求异步获取并渲染的。Cheerio只能解析静态HTML,自然抓不到动态生成的DOM元素。

解决方案

方案1:使用无头浏览器(Puppeteer)模拟页面加载

Puppeteer可以模拟真实浏览器的渲染过程,等待页面动态数据加载完成后再抓取内容:

  1. 先安装依赖:
npm install puppeteer
  1. 修改抓取代码:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 09:53:33