
文章目录一、痛点5,700 个数据集从哪下手二、data.gov.hk 的 API 结构先理解再动手三、核心代码三步管道Step 1: 发现数据集——CKAN API 批量拉取Step 2: 抓取样数据——Data Filtering APIStep 3: Claude API 自动分析——tool_use 强制结构化输出四、管道输出一份自动生成的「数据分析清单」五、实际运行结果六、框架的复用性七、三个避坑要点坑1: Data Filtering API 列号是 1-indexed坑2: CKAN 端点必须带语言前缀坑3: Claude tool_use 的 input 已经是 dict八、环境信息九、总结一、痛点5,700 个数据集从哪下手data.gov.hk 是香港政府的一站式开放数据平台。截至 2026 年 8 月上面有5,700 个数据集覆盖交通、天气、人口、住房、金融等 20 个类别。其中约 2,500 个提供了 API 接口。但问题来了——你打开网站面对 5,700 个数据集怎么快速找到「哪些数据值得分析」传统做法是一个一个点开看描述→看字段→判断是否有分析价值→手动记录。20 个数据集下来半小时就没了。这篇文章给你一个自动化方案用 Claude API 的 structured output 能力写一个 Python 管道自动帮你做三件事发现从 data.gov.hk CKAN API 拉取数据集列表抓取用 Data Filtering API 取每个数据集的前 5 行样本分析把样本元数据丢给 Claude让它自动生成结构化摘要和分析建议最终产出一份自动生成的「可分析数据集清单」包含每个数据集的字段说明、数据质量评估、推荐分析方法。二、data.gov.hk 的 API 结构先理解再动手data.gov.hk 提供了三层 API层级API用途端点示例发现层CKAN API列出数据集/分类/搜索package_list/package_show查询层Data Filtering API v2按条件查询排序分页/v2/filter?q{...}历史层Historical Archive API获取历史版本/v2/history?resource...我们用前两层就够了。CKAN API 关键端点所有端点都要带语言前缀/en-data/、/tc-data/、/sc-data/# 列出所有数据集IDGET https://data.gov.hk/en-data/api/3/action/package_list# 获取某个数据集的完整元数据含字段名、CSV/JSON资源URLGET https://data.gov.hk/en-data/api/3/action/package_show?id{dataset_id}Data Filtering API v2的结构注意列号是1-indexed不是0-indexed# 查询某个CSV资源的前5行query{resource:http://www.xxx.gov.hk/data.csv,section:1,format:json,filters:[],sorts:[],limit:5}GET https://api.data.gov.hk/v2/filter?q{url_encode(json.dumps(query))}三、核心代码三步管道完整代码约 150 行三步走。Step 1: 发现数据集——CKAN API 批量拉取importrequestsimportjsonimporttimefromtypingimportList,Dict BASE_CKANhttps://data.gov.hk/en-data/api/3/actiondeflist_all_datasets(limit:int100)-List[str]:拉取所有数据集ID可按limit截断用于测试resprequests.get(f{BASE_CKAN}/package_list)datasetsresp.json()[result]returndatasets[:limit]defget_dataset_meta(dataset_id:str)-Dict:获取单个数据集的完整元数据resprequests.get(f{BASE_CKAN}/package_show,params{id:dataset_id})resultresp.json()[result]return{id:result.get(id),title:result.get(title,),notes:result.get(notes,)[:500],# 截断长描述category:result.get(organization,{}).get(title,Unknown),resources:[{name:r.get(name),format:r.get(format),url:r.get(url)}forrinresult.get(resources,[])ifr.get(format)in[CSV,JSON,XLSX]]}# 拉取前50个数据集完整5700个需要约5分钟测试用50个dataset_idslist_all_datasets(limit50)print(f找到{len(dataset_ids)}个数据集)# 获取每个数据集的元数据metas[]fords_idindataset_ids:try:metaget_dataset_meta(ds_id)metas.append(meta)time.sleep(0.3)# 礼貌限速exceptExceptionase:print(f跳过{ds_id}:{e})Step 2: 抓取样数据——Data Filtering APIimporturllib.parsedeffetch_sample(resource_url:str,limit:int5)-List[Dict]:用Data Filtering API v2取CSV资源的前N行query{resource:resource_url,section:1,format:json,limit:limit}encodedurllib.parse.quote(json.dumps(query))resprequests.get(fhttps://api.data.gov.hk/v2/filter?q{encoded})returnresp.json()# 为每个数据集取第一个CSV资源的样本formetainmetas:csv_resources[rforrinmeta[resources]ifr[format]CSV]ifcsv_resources:try:samplefetch_sample(csv_resources[0][url],limit5)meta[sample_data]sample[:5]# 只保留前5行exceptException:meta[sample_data]NoneStep 3: Claude API 自动分析——tool_use 强制结构化输出这是整个管道的大脑。把元数据样本丢给 Claude让它输出结构化的分析建议。importanthropic clientanthropic.Anthropic()# 需要 ANTHROPIC_API_KEY 环境变量# 定义 Claude 的输出格式tool_use 100% schema 合规analysis_tool{name:dataset_analysis,description:分析一个公开数据集的价值和建议用法,input_schema:{type:object,properties:{dataset_title:{type:string},field_summary:{type:string,description:用一段话总结这个数据集包含哪些字段和数据维度},data_quality:{type:string,description:评估数据质量完整性、时效性、是否有缺失值},analysis_suggestions:{type:array,items:{type:string},description:推荐2-3个具体的数据分析方向},difficulty:{type:string,enum:[入门,中级,高级],description:分析难度评估},value_score:{type:integer,minimum:1,maximum:10,description:分析价值评分(1-10)}},required:[dataset_title,field_summary,analysis_suggestions,difficulty,value_score]}}defanalyze_dataset_with_claude(meta:Dict)-Dict:让Claude分析一个数据集promptf请分析以下香港公开数据集 标题:{meta.get(title,无标题)}描述:{meta.get(notes,无描述)[:300]}类别:{meta.get(category,未知)}资源格式:{, .join(set(r[format]forrinmeta.get(resources,[])))}样本数据(前5行):{json.dumps(meta.get(sample_data,[]),ensure_asciiFalse)[:500]}responseclient.messages.create(modelclaude-sonnet-4-5,max_tokens1024,tools[analysis_tool],tool_choice{type:tool,name:dataset_analysis},messages[{role:user,content:prompt}])# tool_choice 强制 Claude 必须调用 tool → 100% 返回结构化 JSONtool_blocknext(bforbinresponse.contentifb.typetool_use)returntool_block.input# 已经是 dict不需要 json.loads()# 批量分析只分析有样本数据的results[]fori,metainenumerate(metas):ifmeta.get(sample_data):print(f分析中 ({i1}/{len(metas)}):{meta[title][:50]})analysisanalyze_dataset_with_claude(meta)analysis[dataset_id]meta[id]results.append(analysis)time.sleep(0.5)# API限速print(f\n完成! 分析了{len(results)}个数据集)四、管道输出一份自动生成的「数据分析清单」跑完后的results列表长这样截取一个真实示例——香港入境处每日旅客流量数据{dataset_title:Statistics on Daily Passenger Traffic,field_summary:包含日期、管制站(口岸)名称、入境/出境、香港居民/内地访客/其他访客分类的每日客流量。时间跨度2019年至今。,data_quality:数据完整无明显缺失。每日更新时效性优秀。字段命名使用英文缩写(需对照data dictionary理解)。,analysis_suggestions:[用pandas做2019-2026年各口岸客流趋势对比(疫情前后变化),按月份/weekday聚合发现客流季节性规律→可用于跨境通勤规划,结合天气数据做相关性分析恶劣天气对口岸客流的影响],difficulty:入门,value_score:9}50 个数据集中Claude 自动筛选出 38 个「有分析价值」value_score ≥ 6的数据集。整个过程从「面对 5,700 个数据集无从下手」变成「有一份带分析方法建议的精准清单」——全程自动化人类只需要在最后阶段做决策。五、实际运行结果在 M2 MacBook Air 上跑了 50 个数据集的完整管道找到 50 个数据集 获取元数据: 50/50 成功 抓取样数据: 41/50 有CSV资源 Claude分析中... 完成! 分析了 38 个数据集 价值分布: 9-10分(高价值): 12个 ████████████ 7-8分(中高价值): 18个 ██████████████████ 5-6分(中价值) : 8个 ████████ 总API费用: $0.17 (38次调用 × ~$0.0045/次, claude-sonnet-4-5) 总耗时: 约6分钟(含API限速等待)不到 2 毛钱、6 分钟38 个数据集的完整分析报告。手工做的话光看描述手工记录至少 3 小时。左图Claude 三种结构化输出方案的成本-合规率对比Tool Use 100% 合规、$0.0045/次右图实际运行后 38 个数据集的价值分布高价值 12 个 中高价值 18 个 76%六、框架的复用性这篇文章给的代码框架不限于 data.gov.hk——任何基于 CKAN 的开放数据平台都可以直接复用平台CKAN端点数据集数data.gov.hkdata.gov.hk/en-data/api5,700data.gov.ukdata.gov.uk/api50,000data.gov.sgdata.gov.sg/api1,800欧盟 data.europa.eudata.europa.eu/api1,700,000深圳市开放数据opendata.sz.gov.cn/api3,000只要换上 CKAN 端点 URL管道完全一样。如果你做数据分析咨询或企业内部数据整合这个框架就是一个「数据发现加速器」。七、三个避坑要点坑1: Data Filtering API 列号是 1-indexed# ❌ 错误Python思维以为第一列是0filters[[0,eq,[2024]]]# ✅ 正确data.gov.hk API 的列号从1开始filters[[1,eq,[2024]]]这个坑官网文档写了但很容易忽略。我调试了 15 分钟才发现 filter 完全不生效是因为列号错了。坑2: CKAN 端点必须带语言前缀# ❌ 错误不带语言前缀会返回空https://data.gov.hk/api/3/action/package_list# ✅ 正确必须带 /en-data/ 或 /tc-data/ 或 /sc-data/https://data.gov.hk/en-data/api/3/action/package_list坑3: Claude tool_use 的 input 已经是 dict# ❌ 错误把 tool_use input 当字符串再 json.loadsresultjson.loads(tool_block.input)# TypeError!# ✅ 正确tool_use block 的 input 本身就是 dictresulttool_block.input# 就是一个 Python dict八、环境信息项目版本/来源Python3.11anthropic SDK0.45requests2.31Claude 模型claude-sonnet-4-5数据源data.gov.hk CKAN API Data Filtering API v2运行环境macOS (M2) / Linux / Windows 均可✅ Python 3.11 anthropic 0.45 运行通过。九、总结这篇文章的核心不是「怎么分析香港数据」而是搭了一个可复用的框架发现层CKAN API 自动化数据集发现适用全球 100 开放数据平台抓取层Data Filtering API 精准取样本不用下载整个大 CSV分析层Claude structured output 自动生成结构化分析建议tool_use 100% 格式合规50 个数据集、38 份分析报告、总费用 $0.17、总耗时 6 分钟。这个投入产出比手工操作完全无法比拟。参考链接:data.gov.hk API 规范: https://data.gov.hk/en/help/api-specAnthropic Claude Structured Outputs: https://docs.anthropic.com/en/docs/build-with-claude/tool-useCKAN API 官方文档: https://docs.ckan.org/en/latest/api/说明本文使用的 data.gov.hk 数据均为公开政府数据。Claude API 分析结果供参考最终分析决策应由人工复核。数据集分析价值评分基于样本数据自动评估全量数据可能有不同结论。