如何将TED API分页返回的JSON全量数据导入pandas DataFrame
问题背景
操作步骤
url = "https://ted.europa.eu/api/v2.0/notices/search?&q=TD%3D%5B3%5D&reverseOrder=true&scope=3&sortField=PD" # 从url获取数据 response = requests.get(url) # 返回json数据并读取输出字典的键 data = response.json() data
获取到的JSON结构如下:
{'took': 205, 'total': 1703997, 'results': [{'AA': '1', 'AC': '2', 'BI': [], 'CY': 'MK', 'DI': '1046/2018', 'TY': '1'}, {'AA': '6', 'AC': '1', 'BI': [], 'CY': 'RS', 'DI': 'CODE_OTHERS', 'TY': '1'}, {'AA': '5', 'AC': '1', 'BI': [], 'CY': 'BE', 'DI': '1046/2018', 'TY': '1'}, ...
# 读取输出字典的键 data.keys()
输出结果:
dict_keys(['took', 'total', 'results'])
将数据转为pandas DataFrame的代码:
# 从目标键生成dataframe df = pd.DataFrame(data["results"]) df.head()
执行后返回符合预期的DataFrame,统计行数代码:
# 统计行数 len(df.index)
输出结果:
1000
问题描述
接口返回的总数据量为1703997条,当前仅获取到单页1000条数据,需要将全量数据导入pandas DataFrame。
解决方案
该API默认做了分页限制,单页最大返回1000条数据,通过追加page分页参数循环拉取所有页数据再合并即可,具体实现如下:
import requests import pandas as pd import time base_url = "https://ted.europa.eu/api/v2.0/notices/search?&q=TD%3D%5B3%5D&reverseOrder=true&scope=3&sortField=PD" all_results = [] # 先拉取第一页获取总数据量 first_resp = requests.get(base_url + "&page=1") first_data = first_resp.json() total_count = first_data["total"] all_results.extend(first_data["results"]) # 计算总页数 total_page = total_count // 1000 + 1 if total_count % 1000 != 0 else total_count // 1000 # 循环拉取剩余页 for page in range(2, total_page + 1): # 加延迟避免触发接口限流 time.sleep(1) try: resp = requests.get(base_url + f"&page={page}") resp.raise_for_status() page_data = resp.json() all_results.extend(page_data["results"]) # 每拉10页打印一次进度 if page % 10 == 0: print(f"已完成:{page}/{total_page}页,累计拉取{len(all_results)}条") except Exception as e: print(f"第{page}页拉取失败:{e},重试中") time.sleep(3) resp = requests.get(base_url + f"&page={page}") page_data = resp.json() all_results.extend(page_data["results"]) # 全量数据转为DataFrame full_df = pd.DataFrame(all_results) print(f"全量数据拉取完成,共{len(full_df)}条")
注意事项
- 170万条数据拉取耗时较长,建议拉取过程中每100页存一次本地csv,避免中途中断数据丢失
- 若设备内存不足以承载全量DataFrame,可以分批存本地文件后再做合并处理
内容的提问来源于stack exchange,提问作者valdereo
相关产品推荐
相关产品推荐

