调用Opensea API生成CSV数据时报IndexError: list index out of range如何解决
报错根因
你遇到的IndexError: list index out of range报错,本质是API返回的assets数组为空,你尝试访问索引为0的元素触发了越界。导致assets为空的常见原因有三个:
- 循环中
offset参数的取值已经超过了该collection的总藏品数量,没有更多数据可以返回 - Opensea v1版本的assets接口有固定限制:
offset参数最大仅支持到10000,即使collection藏品总量超过1万,offset>=10000时也会返回空数组 - 你请求参数中的
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
相关产品推荐
相关产品推荐

