无页码标识的API查询如何实现分页遍历?
解决Meetup API无页码标识的分页遍历问题
我之前对接Meetup API的时候也碰到过一模一样的分页难题,其实它的分页逻辑是靠offset参数和返回结果里的元数据来控制的,不用传统页码也能轻松遍历全量数据。下面给你一步步拆解实现思路和代码:
核心逻辑梳理
Meetup的/2/groups接口返回的JSON里会包含一个meta字段,里面有两个关键值:total_count(结果总条数)和page(每页返回的数量)。我们只需要不断递增offset参数,每次请求下一页的数据,直到offset对应的起始位置超过总结果数,或者当前页返回的结果为空时停止循环即可。
完整可运行代码
import requests import pandas as pd import time # 把固定请求参数抽成字典,方便后续修改维护 base_url = "https://api.meetup.com/2/groups" request_params = { "zip": "b1+1aa", "format": "json", "lon": -1.89999997616, "category_id": 34, "photo-host": "public", "page": 500, # Meetup允许的单页最大返回数 "radius": 200.0, "lat": 52.4799995422, "order": "id", "desc": "false", "sig_id": "243750775", "sig": "ed49065d620a34c10e1f0f91dd58da2e36547af1" } # 初始化存储所有结果的列表 all_group_data = [] offset = 0 while True: request_params["offset"] = offset try: # 发送请求并检查是否成功 response = requests.get(base_url, params=request_params) response.raise_for_status() data = response.json() # 获取当前页数据,为空则终止循环 current_page_results = data.get("results", []) if not current_page_results: break all_group_data.extend(current_page_results) # 从元数据里判断是否还有下一页 meta_info = data.get("meta", {}) total_groups = meta_info.get("total_count", 0) per_page = meta_info.get("page", 500) # 更新offset,若超过总数据量则停止 offset += 1 if offset * per_page >= total_groups: break # 加个延迟,避免触发Meetup的API速率限制 time.sleep(1) except requests.exceptions.RequestException as e: print(f"请求过程出错: {str(e)}") break # 把所有数据转换成DataFrame final_df = pd.io.json.json_normalize(all_group_data) print(f"成功获取到 {len(final_df)} 条群组数据")
几个关键细节提醒
- 参数复用:把固定参数抽成字典,每次只更新
offset,代码更整洁也更容易维护。 - 异常处理:用
raise_for_status()捕获HTTP错误,避免因请求失败导致程序直接崩溃。 - 速率控制:Meetup API有请求频率限制,加
time.sleep(1)能有效降低被限流的概率。 - 双重终止条件:既判断当前页是否为空,也判断
offset是否超出总数据范围,确保不会请求无效页面。
内容的提问来源于stack exchange,提问作者snow_fall
相关产品推荐
相关产品推荐

