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

如何循环调用英国慈善委员会多API并生成对应命名DataFrame

批量调用英国慈善委员会API并生成对应DataFrame

我正在使用英国慈善委员会(UK Charity Commission)API处理数据,已获取慈善编号列表charityNum,希望基于该列表调用多个API接口,并将返回数据分别存入指定名称的DataFrame中。相关接口与对应DataFrame名称如下:

calls = ['allcharitydetails',
         'charityaraccounts', 
         'charityareaofoperation', 
         'charityassetsliabilities', 
         'checkprimarygrants', 
         'charityfinancialhistory',
         'charitygoverningdocument',
         'charityoverview',
         'charitypolicyinformation',
         'charityregulatoryreport']

dfNames = ['allDetailsDF',
           'accountsDF',
           'areaDF',
           'assetsDF',
           'grantsDF',
           'financialDF',
           'governingDF',
           'overviewDF',
           'policyDF',
           'regulatoryDF']

目前我仅实现了单接口循环调用所有慈善编号的逻辑(代码如下),但希望通过循环同时遍历所有接口与所有慈善编号,自动生成对应DataFrame,无需重复复制代码:

detailsDF = pd.DataFrame([])
for num in charityNum:
    url = "https://api.charitycommission.gov.uk/register/api/allcharitydetails/{}/0"
    hdr ={
    'Cache-Control': 'no-cache',
    'Ocp-Apim-Subscription-Key': '******************',
    }
    req = urllib.request.Request(url.format(num), headers=hdr)
    req.get_method = lambda: 'GET'
    response = urllib.request.urlopen(req)
    string = response.read().decode('utf-8')
    data = json.loads(string)
    df_temp = pd.json_normalize(data)
    detailsDF = pd.concat([detailsDF, df_temp],ignore_index=True,sort=False)

解决方案

可以通过配对接口与DataFrame名称,结合嵌套循环实现批量调用,同时用字典统一管理所有生成的DataFrame,避免重复代码。以下是优化后的完整代码,还加入了异常处理避免请求失败导致程序中断:

import urllib.request
import json
import pandas as pd

# 初始化请求头(只需定义一次)
hdr = {
    'Cache-Control': 'no-cache',
    'Ocp-Apim-Subscription-Key': '******************',  # 替换为你的密钥
}

# 存储所有DataFrame的字典
dfs = {}

# 遍历配对后的接口与DataFrame名称
for endpoint, df_name in zip(calls, dfNames):
    # 初始化当前接口对应的空DataFrame
    current_df = pd.DataFrame([])
    # 遍历所有慈善编号
    for num in charityNum:
        try:
            # 构造当前接口的请求URL
            url = f"https://api.charitycommission.gov.uk/register/api/{endpoint}/{num}/0"
            req = urllib.request.Request(url, headers=hdr)
            req.get_method = lambda: 'GET'
            response = urllib.request.urlopen(req)
            # 解析返回的JSON数据
            string = response.read().decode('utf-8')
            data = json.loads(string)
            df_temp = pd.json_normalize(data)
            # 拼接临时DataFrame到当前接口的总DataFrame
            current_df = pd.concat([current_df, df_temp], ignore_index=True, sort=False)
        except Exception as e:
            print(f"处理慈善编号 {num} 的接口 {endpoint} 时出错: {str(e)}")
            continue
    # 将当前接口的DataFrame存入字典
    dfs[df_name] = current_df

# 可选:将字典中的DataFrame导出为全局变量(直接使用dfNames中的名称调用)
globals().update(dfs)

使用说明

  1. 运行代码后,所有生成的DataFrame都存储在dfs字典中,例如获取accountsDF可使用dfs['accountsDF']
  2. 如果执行了globals().update(dfs),则可以直接通过变量名(如allDetailsDF、grantsDF)访问对应的DataFrame
  3. 异常处理会捕获请求过程中的错误并打印提示,不会中断整个批量处理流程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 10:25:45