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

如何用offset参数实现fetch循环分页拉取OpenSea API全量数据

你当前的写法只会执行1次fetch请求,offset的累加也没有和后续的请求逻辑绑定,自然没法实现分页循环拉取。可以用async/await的方式实现需求,修改后的代码如下:

// 存储所有拉取到的assets数据
const allAssets = [];
// 初始偏移量
let offset = 0;
// 每页限制条数
const LIMIT = 50;

// 用async函数处理异步逻辑更清晰
const fetchAllData = async () => {
  while (true) {
    try {
      const response = await fetch(`https://api.opensea.io/api/v1/assets?collection=womenandweapons&format=json&offset=${offset}&limit=${LIMIT}&order_direction=desc`, {
        method: 'GET',
        headers: {
          'Accept': 'application/json'
        }
      });
      const data = await response.json();
      const currentAssets = data.assets || [];
      // 把当前页的数据加入总数组
      allAssets.push(...currentAssets);
      
      console.log(`已拉取${currentAssets.length}条,累计${allAssets.length}条`);
      
      // 满足终止条件:当前页返回条数小于限制值,说明已经到最后一页
      if (currentAssets.length < LIMIT) {
        break;
      }
      
      // 偏移量累加,进入下一次循环拉取下一页
      offset += LIMIT;
      
      // 可选:如果遇到接口限流,可以在这里加延迟,比如每次请求间隔1秒
      // await new Promise(resolve => setTimeout(resolve, 1000));
    } catch (err) {
      console.error('请求出错:', err);
      // 出错处理逻辑:可以选择重试,或者直接终止
      break;
    }
  }
  
  // 循环结束后,allAssets就是完整的数据集
  console.log('全部拉取完成,总条数:', allAssets.length);
  // 后续可以在这里处理allAssets的业务逻辑
}

// 执行拉取
fetchAllData();

逻辑说明

  • 用while(true)实现无限循环,只有当返回数据条数小于50或者请求报错时才终止循环
  • 每次请求拿到的单页数据通过扩展运算符...拼接进总数组allAssets,最终得到完整数据集
  • 加入了基础的错误捕获逻辑,避免单页请求失败导致整个流程中断
  • 如果Opensea接口对你的请求有限流,可以打开代码里的延迟注释,避免触发接口频率限制

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:15:05