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

如何在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请求频率;
  • 进度跟踪:添加批次和单个请求的状态打印,方便查看处理进度。

额外注意事项

  1. 确认API限制是“每100个请求为一组”还是“请求频率限制”(比如每分钟最多100次),如果是频率限制,需调整延迟时间而非单纯分批;
  2. 若API支持批量查询(如一次传多个机场代码),优先使用批量接口,效率更高;
  3. 可添加重试机制(如失败后重试2-3次),避免网络波动导致的数据丢失。

内容的提问来源于stack exchange,提问作者CreTho_2020

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 03:20:52