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

Marvel API调用仅返回单页数据,如何获取全量角色数据?

解决Marvel API分页获取所有角色的通用技巧

我太懂这种官方文档挂掉的憋屈了!不过别担心,REST API的分页逻辑大多是通用的,咱们可以靠返回数据里的元信息来搞定批量获取角色的需求。

通用分页技巧(适用于大多数REST API)

  • 先扒返回数据里的分页元数据:你现在打印的data对象里肯定藏着关键信息——比如data['data']['total']是平台上总共有多少个角色,data['data']['count']是当前请求返回的角色数量,data['data']['offset']是当前请求的起始位置。这些字段几乎是所有分页API的标配,是实现批量获取的核心依据。
  • 循环请求直到拿完所有数据:每次请求时给URL加上offset参数,每次递增当前页的count(Marvel API默认是20),直到offset的值超过total,或者当前页返回的角色数量为0时停止循环。
  • 记得处理API速率限制:别一股脑猛发请求,很多API都有请求频率限制,最好在每次请求后加个短暂的延迟(比如1秒),避免被临时封禁。

修改后的完整代码

结合你的示例,我调整出了支持分页获取所有角色的版本:

import urllib.request
import urllib.parse
import json
import time  # 用于添加请求间隔,避免触发速率限制

API_KEY = '<your_api_key>'
BASE_URL = 'http://gateway.marvel.com/v1/public/characters'
ts = '1'

# 初始化分页相关变量
offset = 0
total_characters = None
all_characters = []

while True:
    # 构造带分页参数的请求URL
    request_params = {
        'ts': ts,
        'apikey': API_KEY,
        'offset': offset
    }
    encoded_params = urllib.parse.urlencode(request_params)
    full_url = f"{BASE_URL}?{encoded_params}"
    
    try:
        # 发送请求并解析返回数据
        response = urllib.request.urlopen(full_url)
        data = json.load(response)
        
        # 首次请求时获取总角色数,方便跟踪进度
        if total_characters is None:
            total_characters = data['data']['total']
            print(f"检测到总共有 {total_characters} 个角色需要获取")
        
        # 提取当前页的角色名称并加入总列表
        current_page_chars = [char['name'] for char in data['data']['results']]
        all_characters.extend(current_page_chars)
        
        # 打印当前获取进度
        print(f"已完成:{len(all_characters)}/{total_characters} 个角色")
        
        # 更新offset,准备请求下一页
        offset += data['data']['count']
        
        # 终止循环条件:已获取全部角色,或当前页无数据返回
        if offset >= total_characters or len(current_page_chars) == 0:
            print("\n所有角色已获取完成!")
            break
        
        # 添加1秒延迟,避免请求过于频繁
        time.sleep(1)
        
    except Exception as e:
        print(f"请求过程中出现错误:{str(e)}")
        break

# 输出所有角色(也可以根据需求保存到文件等)
print("\n所有角色名称:")
for character in all_characters:
    print(character)

代码关键点说明

  • 用urllib.parse.urlencode处理请求参数,比手动拼接URL更规范,避免参数格式错误。
  • 加入了异常处理,避免单个请求失败导致整个程序崩溃。
  • 增加了进度跟踪,方便你查看获取状态。
  • 添加了time.sleep(1)来控制请求频率,降低被API封禁的风险。

内容的提问来源于stack exchange,提问作者Michelle Whalen Kaiser

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:00:55