如何无需手动指定页码获取REST API请求的全部分页数据
实现方法
这种返回lastPage总页数字段、但不返回下一页链接的分页接口,不需要手动指定页码就能拉全量数据,核心逻辑是靠首页响应自动拿到总页数,再自动完成循环遍历:
- 固定
perPage为接口支持的最大值250,尽可能减少请求次数 - 首先发起第1页的请求,解析响应后一方面暂存第一页的条目数据,另一方面直接从
stats.lastPage读取总页数,全程不需要你手动查、手动填总页码 - 从第2页开始逐页发起请求,直到当前页码等于总页数时停止,每拉完一页就把条目追加到总结果集里
- 如果接口返回第一页的
lastPage就是1(比如你给出的示例场景),后续循环不会触发,直接返回结果,不会出现逻辑错误
实际使用时可以根据接口的限流规则加适当的请求间隔、失败重试逻辑,避免请求被拦截。
完整修改后的代码
import requests import json # 基础接口地址,不需要手动拼接page参数 base_url = "https://api-v2.pitchbook.com/deals/search" # 固定公共请求参数 req_params = { "keywords": "machine learning accelerator", "perPage": 250 } headers = { "Authorization": "PB-Token 1234567" } all_deals = [] # 拉取第一页数据 first_resp = requests.get(base_url, params=req_params, headers=headers) first_data = first_resp.json() all_deals.extend(first_data["items"]) # 自动从响应中获取总页数,不需要手动指定 total_page = first_data["stats"]["lastPage"] # 循环拉取剩余所有页 for current_page in range(2, total_page + 1): # 动态传入当前页码参数 current_params = req_params.copy() current_params["page"] = current_page resp = requests.get(base_url, params=current_params, headers=headers) page_data = resp.json() all_deals.extend(page_data["items"]) # 组装最终全量结果 full_data = { "total_count": first_data["stats"]["total"], "deals": all_deals } # 打印/存储结果 print(json.dumps(full_data, indent=2, ensure_ascii=False))
逻辑说明
- 用
requests的params参数传参比手动拼接URL更可靠,不会出现参数格式错误 - 边界场景已经做了兼容:不管总页数是1还是上百页,逻辑都能正常运行,不需要手动调整
- 所有页码都是程序自动计算传入,你只需要改基础的搜索参数、鉴权信息即可,不需要手动修改URL里的页码值
内容的提问来源于stack exchange,提问作者Pballer88
相关产品推荐
相关产品推荐

