使用requests-futures如何实现无固定范围的持续查询直到无数据返回?
基于requests-futures动态拉取全部分页数据的实现方案
核心思路是维护一个动态更新的异步请求集合,每次处理完已返回的分页响应时,根据返回的分页标识判断是否存在下一页,存在则即时生成新的分页请求加入待处理集合,直到所有分页拉取完成。
完整实现代码
from concurrent.futures import as_completed from pprint import pprint from requests_futures.sessions import FuturesSession # 初始化会话,可通过max_workers控制最大并发数 session = FuturesSession(max_workers=3) # 存储所有待处理/处理中的异步请求 futures = set() # 存储拉取到的所有分页数据 all_data = [] # 先提交第一页的请求,分页参数名根据实际接口调整 first_page = 1 futures.add(session.get('http://your-api-url/path', params={'page': first_page})) while futures: for future in as_completed(futures): # 先把已完成的future从集合中移除 futures.remove(future) try: resp = future.result() resp.raise_for_status() result = resp.json() current_page = resp.request.params['page'] # 处理当前页数据 pprint({ 'page': current_page, 'url': resp.request.url, 'content': result }) all_data.extend(result.get('data_list', [])) # 判断是否存在下一页,这里的判断逻辑根据接口实际返回调整 # 示例1:接口返回has_next字段标识是否有下一页 has_next = result.get('has_next', False) # 示例2:接口返回总页数total_pages,和当前页对比 # has_next = current_page < result.get('total_pages', 0) # 示例3:接口返回下一页地址next_url,判断是否不为空 # next_url = result.get('next_url') # has_next = bool(next_url) if has_next: next_page = current_page + 1 # 提交下一页请求,加入集合 futures.add(session.get('http://your-api-url/path', params={'page': next_page})) except Exception as e: print(f'请求处理失败,错误信息:{e}') # 可根据需求在此处添加重试逻辑,把失败的请求重新加入futures集合
关键说明
- 用动态可变的
set存储请求任务,替代预先生成所有请求的写法,适配未知总页数的场景 - 分页判断逻辑可根据实际接口规则灵活调整,无需固定写法
- 初始化
FuturesSession时可通过max_workers参数限制最大并发数,避免请求频率过高触发接口限流 - 可根据业务需求添加超时设置、失败重试、数据去重等逻辑,提升运行稳定性
内容的提问来源于stack exchange,提问作者user2896120
相关产品推荐
相关产品推荐

