Python请求GraphQL API如何实现游标分页循环拉取全量数据
实现方法
你需要做两处核心修改:一是调整GraphQL查询结构支持传入分页游标参数,二是编写循环逻辑持续拉取直到没有下一页数据,具体代码和说明如下。
关键修改点
- 给GraphQL查询增加变量定义,让
cards字段支持接收after游标参数 - 初始化全量数据存储列表、游标变量、分页状态标记
- 循环发起请求,首次请求不传游标,后续请求复用上次响应返回的
endCursor作为分页起点 - 每次请求完成后合并当前页数据,更新分页状态,直到
hasNextPage为False时退出循环 - 增加基础的异常判断和请求间隔,避免请求失败或触发接口限流
完整可运行代码
import requests import json import time # 修改查询:增加after游标参数支持 query = """ query GetPlayerCards($after: String) { player(slug:"lionel-andres-messi-cuccittini"){ cards(rarities:[limited], after: $after) { nodes { slug userOwnerWithRate { from } } pageInfo{ startCursor hasNextPage endCursor } } } } """ url = 'https://api.sorare.com/graphql/' # 初始化变量 all_cards = [] after_cursor = None has_next_page = True while has_next_page: # 构造请求变量 variables = {} if after_cursor: variables["after"] = after_cursor # 发起请求 r = requests.post(url, json={'query': query, 'variables': variables}) # 基础请求错误判断 r.raise_for_status() json_data = json.loads(r.text) # 提取当前页数据 cards_data = json_data["data"]["player"]["cards"] current_nodes = cards_data["nodes"] # 合并到全量列表 all_cards.extend(current_nodes) # 更新分页状态 page_info = cards_data["pageInfo"] has_next_page = page_info["hasNextPage"] after_cursor = page_info["endCursor"] # 打印进度,可选 print(f"已拉取{len(all_cards)}条数据,是否有下一页:{has_next_page}") # 加500ms间隔,避免触发接口限流 time.sleep(0.5) # 最终全量数据 print(f"拉取完成,总计{len(all_cards)}条卡片数据") print(all_cards)
注意事项
- 如果接口需要鉴权,你需要在
requests.post里增加headers参数,带上对应的Authorization令牌,否则可能返回权限错误 - 你可以根据接口的限流规则调整
time.sleep的间隔,避免请求被拦截 - 如果需要处理请求失败重试的场景,可以在请求逻辑外层加try-except捕获网络异常,设置重试次数
内容的提问来源于stack exchange,提问作者Bertrand Faure
相关产品推荐
相关产品推荐

