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

调用Opensea API生成CSV数据时报IndexError: list index out of range如何解决

报错根因

你遇到的IndexError: list index out of range报错,本质是API返回的assets数组为空,你尝试访问索引为0的元素触发了越界。导致assets为空的常见原因有三个:

  1. 循环中offset参数的取值已经超过了该collection的总藏品数量,没有更多数据可以返回
  2. Opensea v1版本的assets接口有固定限制:offset参数最大仅支持到10000,即使collection藏品总量超过1万,offset>=10000时也会返回空数组
  3. 你请求参数中的collection值为带空格的bit birds,未做URL编码也可能导致请求异常,无法匹配到对应collection
解决方案
  • 增加返回值校验逻辑:每次拿到响应后先判断assets数组是否为空,为空直接终止分页循环,避免强行访问不存在的索引
  • 调大单次请求的limit参数:Opensea v1 API的limit最大支持50,你当前设置的limit=1请求效率极低,还容易触发频率限制,修改为limit=50可大幅减少请求次数
  • 补全异常处理:增加HTTP状态码校验逻辑,遇到限流、请求失败的情况自动重试,避免异常返回导致程序崩溃
  • 超过1万条数据的场景换用v2接口:如果该collection藏品总量超过1万,直接换用Opensea v2版本的assets接口,使用cursor分页方式,没有1万条的偏移量限制
  • 配置请求头增加API Key:Opensea公开接口未携带API Key时限流规则非常严格,容易返回异常数据,申请官方免费API Key放到请求头中可大幅提升请求成功率
  • 增加请求间隔:每次请求后增加1秒左右的等待时间,避免触发频率限制
优化后代码示例
import requests
import time
import csv

# 基础配置
COLLECTION_SLUG = "bit-birds" # 替换为实际的collection slug,通常为连字符格式无空格
REQUEST_INTERVAL = 1
LIMIT_PER_PAGE = 50
# 可选:填写你申请的Opensea API Key
OPENSEA_API_KEY = ""

offset = 0
result_list = []

while True:
    # 构造请求
    url = f"https://api.opensea.io/api/v1/assets?collection={COLLECTION_SLUG}&order_direction=asc&offset={offset}&limit={LIMIT_PER_PAGE}"
    headers = {}
    if OPENSEA_API_KEY:
        headers["X-API-KEY"] = OPENSEA_API_KEY
    
    # 发起请求加异常捕获
    try:
        resp = requests.get(url, headers=headers, timeout=10)
        resp.raise_for_status()
    except Exception as e:
        print(f"请求异常:{e},5秒后重试")
        time.sleep(5)
        continue
    
    resp_data = resp.json()
    assets = resp_data.get("assets", [])
    # 无数据时终止循环
    if not assets:
        print("已拉取完全部数据")
        break
    
    # 处理当前页数据
    for asset in assets:
        item = {
            "name": asset.get("name", ""),
            "description": asset.get("description", "")
        }
        result_list.append(item)
        print(f"Name: {item['name']}")
        print(f"Description: {item['description']}")
    
    # 更新偏移量
    offset += LIMIT_PER_PAGE
    # 请求控速
    time.sleep(REQUEST_INTERVAL)

# 写入CSV文件
with open("bitbirds_data.csv", "w", encoding="utf-8-sig", newline="") as f:
    writer = csv.DictWriter(f, fieldnames=["name", "description"])
    writer.writeheader()
    writer.writerows(result_list)

print(f"数据导出完成,共导出{len(result_list)}条记录")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 03:30:05