如何在API请求循环中实现100条机场数据的批量调用?
问题描述
我有一个包含1000个机场的列表,需要调用API获取每个机场的航班数据。该API无法一次性处理全部列表,即便添加请求延迟也不行。测试发现每次仅处理100个机场时,数据返回完全正常;但全量调用会导致数据格式错误。
目前我的代码是逐个遍历机场列表并调用API,不清楚如何在现有API调用循环中加入批量处理逻辑,以下是我尝试的两段代码:
# Sample dataset for this post airport = [['HLZN'], ['HLLQ'],['HLLB'],['HLGT'],['HLMS'],['HLLS'],['HLTQ'],['HLLT'],['HLLM']] payload = {'max_pages': 500, 'type':'Airline'} seconds = 1 count = 1 #Create an empty list to hold responses json_responses = [] #Iterate through list for airports in airport: response = requests.get(apiUrl + f"airports/{airports[0]}/flights",params=payload, headers=auth_header) if response.status_code == 200: print(count, airports) count +=1 for i in trange(100): time.sleep(0.01) else: pass results = response.json() json_responses.append(response.json()) sleep(seconds)
total_count = len(airport) #Iterate through list for airports in airport: response = requests.get(apiUrl + f"airports/{airports[0]}/flights",params=payload, headers=auth_header) chunks = (total_count - 1) // 100 + 1 for i in range(chunks): batch = airport[i*100:(i+1)*100] #Tried batch code here if response.status_code == 200: print(count, airports) count +=1 for i in trange(100): time.sleep(0.01) else: pass results = response.json() json_responses.append(response.json()) sleep(seconds)
我是API批量调用和循环的新手,希望得到相关帮助。
解决方案
你的两段尝试代码都没实现正确的分批逻辑:第一段是纯逐个调用,完全没分批;第二段在单个机场的循环里嵌套了批次循环,导致每个机场都重复处理所有批次,逻辑混乱。
正确的思路是先把机场列表拆成每100个一组的批次,再逐个处理每个批次,批次内部逐个调用API,这样既符合API的限制,又能保证数据正常返回。
下面是修正后的代码:
import requests import time from tqdm import trange # 若使用trange需提前安装tqdm(pip install tqdm) # 示例机场数据,实际为1000个 airport = [['HLZN'], ['HLLQ'],['HLLB'],['HLGT'],['HLMS'],['HLLS'],['HLTQ'],['HLLT'],['HLLM']] payload = {'max_pages': 500, 'type':'Airline'} per_batch = 100 # 每批次处理100个机场 batch_delay = 2 # 批次间延迟(可选,缓解API压力) request_delay = 1 # 单次请求间的延迟 json_responses = [] count = 1 # 拆分机场列表为100个一组的批次 batches = [airport[i:i+per_batch] for i in range(0, len(airport), per_batch)] # 遍历每个批次 for batch_idx, batch in enumerate(batches, start=1): print(f"处理第 {batch_idx} 批次,共 {len(batch)} 个机场") # 处理批次内的每个机场 for air in batch: air_code = air[0] try: response = requests.get( f"{apiUrl}airports/{air_code}/flights", params=payload, headers=auth_header ) response.raise_for_status() # 主动抛出HTTP错误,方便捕获异常 print(f"成功获取 {count} - {air_code} 的数据") json_responses.append(response.json()) count += 1 time.sleep(request_delay) # 请求间隔延迟 except requests.exceptions.RequestException as e: print(f"获取 {air_code} 数据失败: {str(e)}") continue # 失败则跳过,也可添加重试逻辑 # 批次处理完成后延迟 print(f"第 {batch_idx} 批次处理完成,等待 {batch_delay} 秒") time.sleep(batch_delay) print("所有机场数据获取完成")
关键逻辑说明
- 批次拆分:用列表推导式按100个一组拆分原列表,自动适配最后一组不足100个的情况;
- 分层循环:先遍历批次,再处理批次内的单个机场,逻辑清晰,避免重复处理;
- 异常处理:加入
try-except捕获请求错误,防止单个请求失败导致程序中断; - 延迟控制:区分单次请求延迟和批次间延迟,灵活控制API请求频率;
- 进度跟踪:添加批次和单个请求的状态打印,方便查看处理进度。
额外注意事项
- 确认API限制是“每100个请求为一组”还是“请求频率限制”(比如每分钟最多100次),如果是频率限制,需调整延迟时间而非单纯分批;
- 若API支持批量查询(如一次传多个机场代码),优先使用批量接口,效率更高;
- 可添加重试机制(如失败后重试2-3次),避免网络波动导致的数据丢失。
内容的提问来源于stack exchange,提问作者CreTho_2020
相关产品推荐
相关产品推荐

