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

如何保存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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:39:16