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
相关产品推荐
相关产品推荐

