原库只有 18 家(认监委批准的审定与核查机构),低于 MIN_ROWS=60 的硬门槛,被自动下架。这次从省市主管部门公布的核查机构备案/评估名单真实扩采:先解决"怎么找到名单页"(360 检索 → 解析跳转页 → 真实 URL),再解决"名单在附件里"(纯标准库 xlsx 解析,不装第三方包)。
新增来源均为官方公告,逐条带 src_url 可回溯:
| 来源文件 | 抓取结果 |
|---|---|
| 深圳市 2022 年碳排放核查机构备案名录(深圳市市场监管局,xlsx 附件) | 28 家 |
| 上海市首批碳排放核查第三方机构备案名单(市发改委,正文表格) | 10 家 |
| 辽宁省 2013-2015 年碳排放第三方核查机构备案(省发改委) | 13 家 |
| 福建省碳排放核查机构评估结果公示(2025,省生态环境厅) | 11 家 |
| 原认监委批准机构(cnca_announcement / official) | 18 家(去重后保留) |
入库去重后共 74 家,其中 74 家有官方来源链接(100%)。按地区:广东 29 上海 13 辽宁 12 福建 8 全国 7 湖北 2 北京 2 未标注 1。
已恢复上架 当前可售库 126 个,四个变动库随全量包一并重建。
.doc/.pdf 附件,生产机无 doc/pdf 解析库,按"解析不出就报、不猜"的原则跳过,未强行造数;python-docx/pypdf 后重跑 carbon_compliance_expand.py,或对 403/412 站点改用带 Cookie 的会话。src_url,解析不出机构名就报 0 家跳过。没有为凑 60 行编任何机构。此前认为"GS 单查询上限 2,000"。实测发现两件事:
country=、status=、methodology= 传了也被忽略,返回的永远是首页前 N 条。所以没法靠"按状态/国别切片"扩量,只能全量拉取后本地切片;size=100 抓到 20 页就以为到顶,换成 size=150 一路翻到 page=29 才见底。改为 size=150 全量翻页 + 429 指数退避,取到 4,236 个唯一项目(含 122 国、769 家开发机构)。
| 维度 | 数量 |
|---|---|
| 项目总数 | 4,236 |
| 已认证(CERTIFIED_PROJECT) | 2,291 |
| 列名(LISTED) | 1,074 |
| 设计阶段(CERTIFIED_DESIGN) | 871 |
| 覆盖国别 | 122 |
| 中国项目 | 276 |
| 造林/再造林 A/R | 180 |
| 开发机构 | 769 |
| institutions 表(派生) | 803 |
落地为 carbon_panorama.db: gs_projects(24 字段,含经纬度、签发期、SDG、SustainCERT 链接),并建 country/state/type/developer 四个索引;institutions 由开发机构真实聚合派生(458 → 803)。
原来那 1 宗 RGRP202609120309459FB523 是内部演示数据(无任何官方来源),本轮已如实标注 src=internal_demo,不再冒充"已挂牌"。
ccer.cets.org.cn 可达,但 /api/* 全部 401,项目列表需登录,抓不到;把 Gold Standard 官方登记的造林/再造林项目按可交易性分三层入库,每条带登记号与 registry 链接:
| 层级 | 含义 | 数量 | 可直接交易 |
|---|---|---|---|
| T1 | 已认证(CERTIFIED_PROJECT),可洽谈采购/合作 | 26 | 是 |
| T2 | 已列名/设计阶段,可提前锁定、签发后供货 | 154 | 否 |
| T3 | 弱证据项(仅项目名/摘要强匹配),待核 | 1 | 否 |
覆盖 51 国、中国 3 个;方法学表由 8 条扩到 48 条(GS 真实方法学聚合);原候选池 2,188 条保留为 T3 线索,明确标注"待林权证与计量验真"。
page 参数不生效,每页都返回同一批。这正是过去只有 491 条的真正原因——23 页翻下来全是首页 1,000 条去重后的结果。换成 os(offset)后才拿到全量 3,241 条(151 国)。sector1 本身就是空对象 {"Name":"","Percent":0},真实部门在 sectordata 字段里(code$name$percent 逗号串)。上游只取了 sector1,所以 2024 年 167 条里 151 条为空。现在解析 sectordata 多值部门 + 官方 themev2_level3_exact 三级主题,并如实记录来源:
| sector 来源 | 条数 | 说明 |
|---|---|---|
| sectordata | 2722 | WB 真实部门字段,多值 |
| sector1 | 345 | 旧字段,2015-2023 项目 |
| theme_inferred | 6 | 部门真缺时用官方 level3 主题兜底,已标注 |
| none | 168 | WB 自身确实未填(多为 2024+ DPL 政策贷款) |
绿色/气候标记改为只看主部门(前 3 项)+ 官方 level3 主题,不再用标题关键词猜:green_flag=1 共 1,318 条、climate_flag=1 共 2,136 条。早期版本曾把 Social Protection、Health 判成绿色(2,399 条),收紧后降到 1,318 条。
zero_carbon_park_engine.py 只是个静态页生成器(gen_page() 输出 HTML),客户点不了、填不了、算不出。这次新建交互式申报引擎 carbon_desk_pro.py(端口 8718,路径 /cd/)。
cd_region_std):填了"江苏省苏州市",报告自动带出《江苏省零碳园区建设指南(试行)》与申报口径要点;POST /cd/api/calc?kind=park 返回 JSON,可嵌入客户自有系统。| 输入 | 值 |
|---|---|
| 外购电量 | 12,000 万kWh |
| 其中绿电 | 9,600 万kWh |
| 绿证 | 20,000 张(=2,000 万kWh) |
| 天然气 / 热力 | 120 万m³ / 5,000 GJ |
| 工业总产值 | 800,000 万元 |
| 碳汇 | 200 tCO2e |
| 核算结果 | 值 | 校验 |
|---|---|---|
| 排放总量 | 67,562.80 tCO2 | 64,392 + 2,620.8 + 550 = 67,562.8 ✓ |
| 绿电+绿证抵扣 | 62,245.60 tCO2 | 11,600 万kWh × 0.5366 × 10 ✓ |
| 抵扣后净排放 | 5,117.20 tCO2 | 67,562.8 − 62,245.6 − 200 ✓ |
| 综合能耗 | 16,514.60 tce | 14,748 + 1,596 + 170.6 ✓ |
| 判定 | 92.5 分 / 零碳达标(引领级) | — |
| 环节 | 做了什么 | 产出编号 |
|---|---|---|
| 填报 | 主体、地块、面积、方法学、权属凭证(可后补) | PH+日期+序号 |
| 确权 | 登记权属凭证号与剩余年限,生成确权编号 | RT…A |
| 核准(MRV) | 碳密度 × 核准面积 = 核准量;记录影像来源与抽样比例 | MV…B |
| 定价 | 以 CEA 真实行情为锚 × 自愿市场折价 45%/55% × 第三方核查加成,给区间与中值,可人工覆盖 | — |
| 挂牌 | 生成撮合标的,进市场列表 | OD… |
| 撮合 | 买方提交意向(数量/金额/用途),不构成合同 | IN… |
| 结算归档 | 全链事件流水可导出,作为核算与审计底稿 | — |
定价不是拍脑袋:直接读 carbon_feed.db 的 CEA 最新价(当前 97.56 元/吨,2026-10-19,源为上海环交所公开行情),再按方法学折价与核查质量加成给区间。取不到行情就明确提示"请手工填写",不编价。
| 测试项 | 结果 |
|---|---|
| 10 个页面全部 200 | 通过 |
| 园区核算三项数字与手算一致 | 通过 |
| 工厂申报出报告 | 通过 |
| 核算 API 返回 8 项指标 JSON | 通过 |
| 碳普惠七步全链走通 | 通过 |
| 中文全程无乱码(含 GB18030 回退) | 通过 |
| 未知路径返回 404 | 通过 |
| 验收数据已清理(不留假单) | 通过 |
入口:https://ilumegroup.cn/cd 服务:ilume-carbon-desk.service(active,端口 8718) 运营库 carbon_desk_pro.db 已进 SKIP_BASE,不会变成可售资产。
数据变动必须重建交付包,否则 G16/G18 立刻红。本轮踩到的坑:full_export.py all 只重建 tar.gz,build 才刷 csv.gz;而且必须先跑 module_vault.py 刷索引,否则打包读的还是旧行数。
正确顺序:数据更新 → module_vault → full_export build → full_export all --force → 门禁
| 库 | tar.gz 全库包 | csv.gz 主表包 |
|---|---|---|
| carbon-panorama | 5,173 行 / 10 表 | 4,236 行 |
| beltcarb-belt-carbon | 3,289 行 / 5 表 | 3,241 行 |
| carbon-compliance | 74 行 / 1 表 | 74 行 |
| carbon-sink-net | 2,897 行 / 8 表 | 2,188 行 |
run_id=86 total=65 ok=65 fail=0 warn=0 耗时 147997ms
全部门禁 PASS
| 文件 | 作用 |
|---|---|
| gs_full.py | GS 全量采集(size=150 翻页 + 429 退避),sync/stats/audit |
| wb_sector_fix.py | WB os 翻页 + sectordata 解析 + 绿色/气候标记 |
| carbon_compliance_expand.py | 省市核查机构名单采集(360 检索 + xlsx 解析) |
| sink_supply.py | 碳汇供给池分层(T1/T2/T3),方法学聚合 |
| carbon_desk_pro.py | 碳资产服务中心:零碳申报 + 碳普惠全链 + 撮合 + 核算 API |
| carbon_desk_init.py | 31 个省区市零碳建制(文件名 + 申报口径) |
| module_vault.py | SKIP_BASE 增加 carbon_desk_pro(就地补丁,锚点校验) |
| nginx.conf | 新增 /cd/ → 8718(80 与 443 两个 server 块) |
运维:systemctl status ilume-carbon-desk 日志 /var/log/ilume-carbon-desk.log 重启 systemctl restart ilume-carbon-desk