如何调用单请求上限50条的API获取全量数据,解决打印异常与连接报错
问题原因
- 缺失OpenSea API必要请求头:OpenSea v1接口要求请求必须携带
X-API-KEY请求头,未携带的请求会直接被拒绝,返回401/403状态码,这也是你加状态码校验后直接报连接错误的核心原因。
- 缺失OpenSea API必要请求头:OpenSea v1接口要求请求必须携带
- 请求参数格式错误:你直接给
token_ids传Python列表,requests默认会将列表参数序列化为token_ids[]=xxx的格式,不符合OpenSea API要求的多token_ids参数传递规范。
- 请求参数格式错误:你直接给
- 循环次数逻辑错误:总数据量2000条,单请求返回50条的话仅需要40次循环,你设置400次循环会导致后续请求的
token_ids超出实际存在的范围,返回无效结果。
- 循环次数逻辑错误:总数据量2000条,单请求返回50条的话仅需要40次循环,你设置400次循环会导致后续请求的
- MongoDB连接写法错误:你将
client直接赋值为连接字符串,没有实例化MongoClient对象,后续操作数据库时也会抛出异常。
- MongoDB连接写法错误:你将
修复方案
前置准备
申请OpenSea API密钥,后续请求需要带入请求头。
修正后代码
from helpers import parse_meebit_data, parse_sale_data import requests import pandas as pd import json import time import matplotlib import matplotlib.pyplot as plt plt.style.use('ggplot') import pymongo from pymongo import MongoClient # 修正MongoDB连接 client = MongoClient('你的MongoDB连接字符串') # 创建数据库 db = client['meebitsDB'] # 创建集合/表 meebits_collection = db['meebitsCollection'] sales_collection = db['salesCollection'] # 配置API参数 url = "https://api.opensea.io/api/v1/assets" # 替换为你自己的OpenSea API Key API_KEY = "你申请的OpenSea API密钥" headers = { "X-API-KEY": API_KEY, "Accept": "application/json" } # 总数据2000条,50条/次,循环40次即可 for i in range(0, 40): start_id = i*50 + 1 end_id = i*50 + 51 param = { "token_ids": list(range(start_id, end_id)), "asset_contract_address": "0x7Bd29408f11D2bFC23c34f18275bBf23bB716Bc7", "order_direction": "desc", "limit": 50 } # 加超时、异常捕获和重试逻辑 try: response = requests.get(url, params=param, headers=headers, timeout=10) response.raise_for_status() data = response.json() # 此处可添加解析数据存入MongoDB的逻辑 print(f"第{i+1}次请求成功,获取{len(data['assets'])}条数据") # 控制请求频率,避免触发限流 time.sleep(1) except Exception as e: print(f"第{i+1}次请求失败,错误信息:{str(e)}") time.sleep(2) continue
额外注意事项
OpenSea免费API密钥有请求频率限制,若出现429状态码可适当延长请求间隔时间。
内容的提问来源于stack exchange,提问作者RedRum
相关产品推荐
相关产品推荐

