如何循环调用英国慈善委员会多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)
使用说明
- 运行代码后,所有生成的DataFrame都存储在
dfs字典中,例如获取accountsDF可使用dfs['accountsDF'] - 如果执行了
globals().update(dfs),则可以直接通过变量名(如allDetailsDF、grantsDF)访问对应的DataFrame - 异常处理会捕获请求过程中的错误并打印提示,不会中断整个批量处理流程
内容的提问来源于stack exchange,提问作者cal192
相关产品推荐
相关产品推荐

