如何在Python中获取CKAN指定组织的所有数据包?
在Python中获取CKAN指定组织的所有数据包
你可以通过CKAN的package_search API接口实现这个需求,这个接口支持通过owner_org参数筛选指定组织下的所有数据包,只是可能你没在文档里注意到这个参数的用法。下面提供两种实用实现方式:
方式一:直接调用REST API(用requests库)
这种方式无需额外安装CKAN专属库,用常见的requests发送HTTP请求即可,同时要处理分页(CKAN默认每次最多返回20条数据):
import requests CKAN_URL = "你的CKAN实例地址" ORG_NAME = "目标组织的名称或ID" rows_per_page = 100 # 可调整每页获取数量,最大一般为1000,取决于CKAN实例配置 def get_org_datasets(): datasets = [] start = 0 while True: params = { "q": "", "fq": f"owner_org:{ORG_NAME}", "start": start, "rows": rows_per_page } response = requests.get(f"{CKAN_URL}/api/3/action/package_search", params=params) response_json = response.json() if not response_json["success"]: print(f"请求失败: {response_json['error']}") break page_datasets = response_json["result"]["results"] datasets.extend(page_datasets) if len(page_datasets) < rows_per_page: break start += rows_per_page return datasets # 调用获取数据 org_datasets = get_org_datasets() print(f"找到{len(org_datasets)}个数据包")
方式二:使用官方ckanapi库
官方封装的ckanapi库简化了API调用逻辑,用起来更简洁:
先安装库:
pip install ckanapi
再编写代码:
from ckanapi import RemoteCKAN CKAN_URL = "你的CKAN实例地址" ORG_NAME = "目标组织的名称或ID" def get_org_datasets(): datasets = [] with RemoteCKAN(CKAN_URL) as ckan: start = 0 rows_per_page = 100 while True: result = ckan.call_action( "package_search", { "q": "", "fq": f"owner_org:{ORG_NAME}", "start": start, "rows": rows_per_page } ) page_datasets = result["results"] datasets.extend(page_datasets) if len(page_datasets) < rows_per_page: break start += rows_per_page return datasets # 调用获取数据 org_datasets = get_org_datasets() print(f"找到{len(org_datasets)}个数据包")
关键说明
owner_org参数可传入组织的名称或ID,两种形式都能生效rows参数控制每页返回数量,最大限制由CKAN实例配置决定,默认最大一般为1000- 必须处理分页逻辑,否则只能获取到第一页的数据包
内容的提问来源于stack exchange,提问作者Software Dev
相关产品推荐
相关产品推荐

