如何保存API请求返回的scroll_token供后续分页请求使用
基于scroll_token游标分页的实现方案
核心思路是用无限循环+游标变量维护的方式实现,不需要提前计算总页数,完全以接口返回值作为终止判断,逻辑最简洁也最不容易出问题。
先修正现有代码的明显问题
你当前写的请求头里重复定义了两次Content-Type,发JSON请求只需要保留application/json即可,冗余的application/x-www-form-urlencoded可以直接删掉,避免参数冲突。
具体实现步骤
- 初始化一个
scroll_token变量,首次请求时设为None,请求体里不传入scroll相关参数 - 进入循环发起请求,每次拿到响应后先提取当前页的业务数据存入总结果集
- 从当前响应里提取
scroll_token字段:- 如果字段存在且有值,就更新到游标变量里,带入下一次请求
- 如果字段不存在/值为空,说明已经到最后一页,直接终止循环
可直接复用的代码示例
首先安装依赖:
pip install requests
实现代码:
import requests search_url = 'https://api/v3/videos' search_headers = { "Content-Type": "application/json", "Authorization": "bearer token" } # 固定的基础查询参数,不包含scroll配置 base_query = { "query": { "include_filter": { "creator_list": 1 } } } all_videos = [] scroll_token = None # 首次请求游标为空 while True: # 拷贝基础参数构造当前请求的payload,避免污染原始查询配置 current_payload = base_query.copy() # 非首次请求才追加scroll_token参数 if scroll_token: current_payload["scroll"] = {"scroll_token": scroll_token} # 发起请求,建议加上超时避免卡死 response = requests.post( search_url, headers=search_headers, json=current_payload, timeout=10 ) # 遇到HTTP错误直接抛出,避免解析错误响应 response.raise_for_status() resp_data = response.json() # 注意:这里把data替换成你接口实际返回业务列表的字段名,比如部分接口是items/list page_data = resp_data.get("data", []) all_videos.extend(page_data) # 更新游标,没有拿到新的scroll_token就终止循环 scroll_token = resp_data.get("scroll_token") if not scroll_token: break print(f"数据拉取完成,共获取{len(all_videos)}条视频记录")
注意事项
- 不要用固定页数做循环终止条件,必须以接口返回的
scroll_token是否存在作为判断依据,避免漏拉数据或者发起无效请求 - 大部分scroll类型的游标都有有效期(通常是几分钟到十几分钟),拉取过程不要加过长的等待时间,否则游标失效会导致请求失败
- 生产环境使用建议加上异常重试逻辑,遇到网络波动、接口限流的情况可以自动重试,避免拉取中断
内容的提问来源于stack exchange,提问作者KristiLuna
相关产品推荐
相关产品推荐

