Install
openclaw skills install @chriskinhaha/real-estate-risk-analyst房地产风险分析全链路工作流(采集→去化→货值→授信)。覆盖:跨城房源与备案价采集(36城实战、WAF瑞数攻坚、CDP兜底)、去化率四档口径(毛B/净A/签约C/现金回笼D)、开发商穿透检索防JV漏归、预售信息失真核查、货值与授信量化(业态折扣、可变现货值、结清触发点)、实战案例协议、交付规范。适用于:查楼盘房源备案价、算去化率、排查房企在售项目与现金流、做房地产授信尽调。曾用名 real-estate-filing-query。
openclaw skills install @chriskinhaha/real-estate-risk-analyst最后更新:2026-09-04(周五) | 本次变更:⑳ 【更名】
real-estate-filing-query→real-estate-risk-analyst(能力已覆盖房企分析/去化口径/货值授信量化,「备案查询」名不副实;同步改 2 个自动化 prompt + 3 个 skill 交叉引用)+新增「授信量化四档口径(D 现金回笼)与结清触发点」专章+headless 反检测启动参数铁律;|⑲ C 级清零实战固化:山樾湾安居房核实初查时 6 批(2025-09/10、2026-01/02/03/04)为自媒体 C 级,逐一回查官方公示页 + 下载 xlsx 逐套校验后全部升 A(2025-09 实为住保售〔2025〕027号、2025-10 实为 030号、2026-01=054/03月=008/04月=021),C 级彻底清零;来源分级规范改为"不再保留 C 级残留"(发现自媒体线索必须回查升 A,最终交付物不留未升 C 级);去化率主数字改为全 A 级口径(39.0%),另给含 D 级认购中上限(70.9%)。同步修正此前误记文号 + 批次序列补 027/030。用户强制铁律:该一次性弄完的别虎头蛇尾、留尾巴反问用户——核实类任务发现残留项必须自己闭环,不得在交付后反问"要不要继续"。|⑱(前)安居房核实路径补充「跨年度多批次连续配售」铁律 + 来源分级标注规范(A官方xlsx/C自媒体/D认购中);去化率须同时给宽口径(含C级)与严口径(仅A级);⑰(前)「交付物必须全量重建·时间戳最新」工程铁律|⑰(前)新增「交付物必须全量重建·时间戳最新」工程铁律(山樾湾 2026-08-24 低级事故根因:报告生成器用事后 append 追加章节→重跑被覆盖→前后口径打架/格式乱/时间戳旧;强制整篇一次性生成 + 实时时间戳 + 交付前回读实测审计,并写入「动态总结机制」章自检清单第 5 条);⑮(前)新增「安居型商品房去化核实标准路径」专章(2026-08-24 山樾湾花园实战:平台"安居房"标签不区分已售/待售→须走住建局配售批次线交叉印证;059批次选房结果 xlsx"已选房源"状态列筛"已选定"=实际签约套数;91套司法查封实为商铺、与安居房本体风险隔离)+ 案例库新增『深圳·山樾湾花园 安居房去化核实』条目;⑯(前)新增「动态总结进 skill」机制章节(用户强制:每次任务产出必须即时沉淀为 skill 资产)。|⑭(前)新增「WAF 挑战下的 token 直连枚举法(轻量兜底·无需 CDP)」专章(2026-08-24 晟悦家园实战:SPA initSession 被 tamperUrl 重定向阻断、但 headless token 直连三个枚举接口成功)+案例库新增『深圳·晟悦家园 WAF 挑战 token 直连枚举』条目+参考案例references/cases/深圳-晟悦家园-WAF挑战token直连枚举.md;⑫(前)新增「复用采集器给新项目须防跨项目数据污染」工程铁律(EXTERNAL_JSON 须按项目覆盖 + 标题/外部对比行改 project-agnostic + 交付前全表扫旧项目关键字);⑬ 正式沉淀第二个案例资产references/cases/深圳皇熙悦府-跨项目污染教训.md(猴子补丁 wrapper 零改动复用 + 跨项目数据污染坑 + 3 条可迁移铁律),案例库章节同步新增该条目。|(2026-08-12 基线)① 新增「按开发商/品牌/合作方检索」五阶段 SOP + 四红线(已确认标准起手式);② 财汇MCP 失效降级到 neodata 等官方工商渠道;③ 新增scripts/by_developer.py脚本工厂(P3+P4 一键);④ 拆分references/(类型库/瑞数专项/待办清单),主文档去重瘦身;⑤ 新增scripts/validate.py质量校验模块并接入工厂;⑥ 工厂增强(深圳注入 PERMITS 修复静默空跑、采集后自动 validate、新增--mode project-summary出品牌项目总表);⑦ 新增references/城市接入checklist.md填表式城市接入模板(六步:入口→反爬→API→字段→脚本→收口),探测 SOP 加索引;⑧ 新增scripts/price_integration.py外部价格整合与货值测算(D/E 类缺价城市闭环,--demo 自测通过);⑨ 修正scripts/by_developer.py广州适配器空跑 bug(--search备案名优先 +--search-dev兜底,新增--search-name),新增references/33城总表v6.md能力矩阵;⑩ 广州鹏瑞壹湾广场实跑闭环(4 项目/1116 套),并修复工厂 AND 组合、采集器空条件硬拼与__main__守卫缺失、price_integration子串匹配与中位数等 4 处隐性 bug(均端到端验证)。完整变更见CHANGELOG.md。|⑪ 2026-08-12 收官复盘:成都案例入 cases、桌面查询实验(城市自由输入+区域联动+点击bug修复+入口脚本)开发后被用户判定实验性搁置、回归 WorkBuddy 运行;提炼 6 条工程铁律(前端必真浏览器验证 / 轻量工具优先零依赖 Web 版 / 联动用自定义 combobox 不用 datalist / 设计从用户场景出发 / 复盘错误诚实更正 / 实验性及时止损),详见references/复盘_2026-08-12_全天迭代与smart铁律.md。
把"搜索预售证 → 拦截 API → 提取 → 标准化 → 去化口径 → 货值测算 → 授信量化 → 可视化交付" 的完整方法封装为可复用工作流。采集是手段,风险/授信研判是目的——本 skill 不止于查备案价,更覆盖去化水分识别、可变现货值测算与结清触发点判断。
曾用名:
real-estate-filing-query(房地产备案信息查询)。2026-09-04 更名为real-estate-risk-analyst, 原因:能力早已覆盖房企分析、去化口径、货值与授信量化,"备案查询"已名不副实。 历史文档/旧对话中出现的旧名均指本 skill。核心方法论跨城市通用;具体 API 端点与字段随平台变化, 需按同法重新探查(参考文档已给出深圳平台的已验证基准)。
定位列表/搜索入口:在平台内找到"项目列表/在售楼盘搜索"页(哈希路由或独立路径),用 page.on("response") 拦截其列表 API。
搜索项目名 → 拿全预售证:列表 API 返回每条的 项目ID(ysProjectId) + 预售证ID(preSellId) + 预售证号。一个项目常有多张预售证、各证 ysProjectId 可能不同,务必拿全,否则丢楼栋。 深圳还支持按开发企业名搜全部项目:列表 API getYsfYsPublicity 是 POST(body 加 organName 字段,如 {"organName":"深润川",...}),页面搜索表单 3 个 el-form-item 顺序为 0=项目名称/1=开发企业/2=宗地地址,用 document.querySelectorAll('.el-form-item')[1] 定位开发企业输入框填词后点「查询」按钮;响应每条含 sypId=ysProjectId、sypeId/id=preSellId、strpreprojectid=证号、project=项目名、name=开发企业。深润川实测:搜"深润川"返回 2 项目 4 证(信城缙悦花园×2 + 鸿威鸿景华庭×2)。
逐证访问详情页:用 详情页URL?项目ID&预售证ID 构造地址。详情页会自动发起两个枚举接口:
getBuildingNameListToPublicity → 楼栋列表(每条 label=楼栋名,key=fybId 楼栋ID 5位,value=buildNo 19位)getBuildingDictToPublicity → 该楼栋的 gnqmcList(单元名列表,如 ["1单元".."5单元"] 或 ["商业","未知"]) 与 chList(楼层),响应 data.buildNo=19位(对应楼栋的 value)
⚠️ 5位/19位关联规则(2026-08-11 深润川实测踩坑):fetch 房源接口的 fybId 必须用 5 位 key;19 位 value 会导致 500「程序异常」。getBuildingDictToPublicity 的 data.buildNo 是 19 位,须匹配 getBuildingNameListToPublicity 的 value 建立 {buildNo: key} 映射,才能把 gnqmcList 关联到正确的 5 位 fybId。单元名用 gnqmcList 原始值(中文数字"一单元"或"商业/未知"都照传),不要兜底成"1单元"(会返回 200 空 data)。
用 page.on("response") 拦截这两个响应来发现全部楼栋与全部单元。逐楼栋、逐单元取数(关键,不可漏):房源接口 getHouseInfoListToPublicity 是 POST,请求体带 fybId(楼栋) + buildingbranch(单元) 过滤,默认只返回当前选中单元(通常是 1单元)。务必对每个 (楼栋, 单元) 组合各发一次请求,否则会大面积漏栋漏单元。遍历方式:
cuyGLa6e= 提取)在 page.evaluate 内 fetch POST 该接口,body={buildingbranch:单元, floor:"", fybId, housenb:"", status:-1, type:"", ysProjectId, preSellId};.el-radio(楼栋名) 触发新的 getBuildingDictToPublicity,再取该栋单元。拦截并提取房源:房源响应按楼层分组 data:[{floor, list:[house,...]}],提取须遍历 data[].list;最后按 (楼栋,单元,楼层,房号) 去重。
标准化字段:映射到 楼栋/楼层/房号/建筑面积/套内/分摊/备案总价/备案单价/状态/合同编号。
写历史快照:把当前聚合(总套数、各状态计数、均价、按 日期/周/月/季 分桶)写入 history/snapshots.json,存聚合不存全量。
生成 Excel:≥6 Sheet(预售许可证清单 / 房源明细 / 统计分析 / 剩余货值测算 / 分析总结 / 异常与告警)。可选增补 Sheet:①「预售信息失真核查」(现楼/商办/抵押查封项目必做,见第10步);②**「外部渠道价格交叉验证」**(当政府平台不公开已备案/已售备案价、为补全数据完整性时必建,见第11步)。晟悦家园已落地 8 Sheet 版(上述 6 + 失真核查可选 + 外部交叉验证)。
剩余货值测算(修正口径):排除已备案(已售/真正卖掉)房源,剩余 = 可售 + 签约中。基准 = 已备案(已售)房源均价,按两级回退:①优先逐套已备案单价均值;②若逐套不公开(深圳0/***、成都***)→用预售证级备案均价(深圳 getProjectDetailInfoToPublicity 的 均价 字段,如翠湖大厦 83019 元/㎡)作基准;③两级都没有才主口径=0 并备注"无备案价格参考",同时补「参考口径」= 可售挂牌价之和 + 签约中按同用途可售均价×面积(标注"非备案成交价、仅供参考")。抵押/查封在售房源单独列示;按全部用途(住宅/公寓/商业/车位等)分列;并输出独立的「合并汇总(全项目)」区块(合计可售面积、合计可售挂牌货值、合计总剩余货值等)作为对外汇报核心指标。
异常与对比:用上一快照做 delta 检测突变(总套数/期房待售/备案均价),区分 异常/提示 两级;首跑无基准不报。
预售信息失真核查(现楼/商办/开发商风险项目必做):见下方「失真核查专章」。触发条件:项目为现楼、或用途以商务公寓/办公/商业为主、或开发商有失信被执行记录、或用户主动提出疑虑。绝不能把"首次登记/初始登记"直接当已售算剩余货值=0;平台不体现项目级查封;须用财汇MCP 查开发商风险 + 查册/法院公告逐套交叉验证,并在产物单列「预售信息失真核查」Sheet(8 Sheet 版)。
外部渠道价格交叉验证(政府不公开备案价时必建):很多平台仅公开"期房待售"备案价,已备案/已售房源备案价不公开(深圳/成都常态)。为补全数据完整性,须用外网(贝壳·链家 / 安居客·房天下 / 乐有家 / 吉屋 等)交叉验证一二手房源价格,在 Excel 单列 「外部渠道价格交叉验证」 Sheet,列示:①补全背景(哪类房源价格缺口、占总量比);②外网采集明细(渠道/类型一手·二手/房源描述/面积/单价/总价/时间/来源URL/备注,一手二手着色区分);③价格口径对比(政府备案均价 vs 外网一手/二手市场均价 + 折让幅度);④交叉验证结论(市场价显著低于备案价时,已备案/已售房源真实价值以市场价代理,参考口径偏保守)。实现方式:外网数据由 Agent 用 WebSearch 获取后落盘为 output/external_prices.json(结构化 records + search_date + tag),脚本 load_external_data() 读取并在 generate_excel 末尾 add_external_sheet() 追加 Sheet(文件缺失则跳过,不影响主流程)。数据来源标注:外网数据一律标注 [外网·WebSearch YYYY-MM-DD](与用户长期数据标注偏好一致);所有外网价为市场挂牌/成交价、非政府备案价,仅作价值量级参考、不构成逐套精确值。
平台多为 Vue SPA + 动态 token,纯 HTTP 直连不可用 → 必须 Playwright 拦截响应。
request/response handler 用 x.url,不是 x(对象不可直接 in 字符串)。
⚠️ 房源接口按「楼栋+单元」范围返回(最易漏的坑):getHouseInfoListToPublicity 是 POST,带 buildingbranch(单元) 过滤,默认仅返回 1单元。绿景白石洲璟庭 1栋有 5 单元共 2746 套,若只取默认 1单元会漏掉 2293 套(占 84%)。必须枚举全部楼栋+全部单元、逐组合取数并去重。
⚠️ 深圳 B1 全量快照(units_summary.dedup.jsonl / 深圳销控总表 / TOP20 分表)系"首屏一次采集",未做单元枚举 → 系统性失真(2026-08-27 修正口径):730 项目中 233 个(31.9%)仅采到 1 个单元,高可疑 45 + 中可疑 28 = 73 个须枚举重采(多证单单元/套数异常小/空采)。⚠️ 旧记"621/730=85.1%"系 scan_shenzhen_distortion.py 解析器错配(把扁平房源列表误判为 0 房源)产生的假象,2026-08-27 已修正解析器。该快照只能当"下界/部分口径",不可作权威全量;引用时须标注"B1 首屏口径·未枚举·可能低估"。重采须走枚举法(collect_shenzhen_enum.py CDP 连本机 9222 真实 Chrome 绕过 WAF,见 developer-group-cross-analysis skill 可复用资源)并在用户本机/住宅 IP 运行(沙箱 WAF 拦不到 token)。
枚举接口可直连,但须带 token(已验证,纠正旧误述):getBuildingNameListToPublicity / getBuildingDictToPublicity / getHouseInfoListToPublicity 三个接口都用 ctx.request.post(f"{BASE}?cuyGLa6e={tk}", ...) 带 SPA 下发的 cuyGLa6e token 直连即可(见 collect_longhan.py 逐栋逐单元枚举法,已抓到珑瀚 366 套全量;旧 SOP 称"必须靠页面自动触发拦截、裸 fetch 直连返回 500"——500 实为裸 fetch 无 token/无会话所致,ctx.request 携带会话+token 则直连成功)。流程:getBuildingNameListToPublicity(拿 5 位 fybId) → getBuildingDictToPublicity(拿 gnqmcList 单元名) → 逐单元 getHouseInfoListToPublicity(body 带 buildingbranch=单元名)。wait_for_response 在用户本机环境可用(fetch_house_data.py 即依赖它跑通),沙箱探测环境偶尔缺失该方法时改用 page.on("response") 监听即可。
价格行为:很多平台只给"期房待售"公开备案价,已备案/已售等不公开 → 缺失价是正常,勿当异常;缺失单价可用 总价/面积 回算。
⚠️ 预售信息失真风险(翠湖大厦教训,2026-08-10;深润川存量项目 2026-08-11 复现):① 深圳「首次登记」= 开发商大确权状态,现楼项目≠已售,切勿计入"已卖掉"并直接算剩余货值=0;② 平台状态不反映项目级/开发商级查封,仅具体房源被司法查封才显示"司法查封"状态——开发商失信被执行时单套状态仍可能全"首次登记/已备案",属信息失真;③ 企业司法/金融风险数据优先用财汇MCP(企业预警通),但其不覆盖不动产/房产抵押,须深圳市不动产登记中心查册或法院公告逐套交叉验证具体房源权利限制;④ 涉及现楼/商办项目时,务必做失真核查并在产物单列「预售信息失真核查」Sheet。深润川案例(存量项目失真核查范式):名下 2 项目 4 证 2126 套全部「首次登记1161/已备案962/区局锁定3」,0 套备案价公开、零期房待售;开发商为深圳中院 1.82 亿元执行标的被执行人+限高(财汇MCP核实),但平台零司法查封标识;外网证实信城缙悦花园 2026-07 仍现房在售(2.0-2.6万/㎡≈备案价 3.97 万的 5-6 折)。剩余货值须双口径:上限口径(全部首次登记=可售存量,主口径按证级备案均价 34.5 亿/参考口径按市场价 25.3 亿)+ 审慎口径(现房在售确认可售的项目才计:信城 22.9 亿/12.4 亿;交付 13 年二手活跃的鸿威视为业主已办证、货值趋近 0)。采集完整性校验技巧:每证房源面积合计应等于预售证详情 presellarea,全对上即证明无漏栋漏单元(深润川 4 证全部精确相等)。
⚠️ 口径写在文档 ≠ 脚本已实现(晟悦家园 2026-08-11 教训):剩余货值「两级回退」必须在代码里真正落地。晟悦家园脚本原先只实现 ①逐套已备案均价 → ③归零,漏掉第②级"预售证级备案均价",导致主口径错误显示为 0(实际应为 5.897 亿元)。深圳落地方法:getProjectDetailInfoToPublicity 响应中 averagePriceTotal=证级备案均价、buildingnb=该证楼栋名,构建 {buildingnb: averagePriceTotal} 映射,逐套匹配 houses[].楼栋 计算主口径(晟悦家园:2栋 25,722.89、晟悦家园1栋 35,999.97 元/㎡)。**每次改口径后必须回读生成的 Excel 校验主口径非零且基准来源标注正确,别只看脚本跑通。**建议在 Sheet 内输出「主口径基准来源/明细」两行,一眼可判用了第几级。
⚠️ 复用采集器给新项目须防跨项目数据污染(皇熙悦府 2026-08-14 教训):fetch_house_data.py 本质是按晟悦家园打磨的通用采集器,经 wrapper 猴子补丁(覆盖 PROJECT_NAME/PERMITS/HISTORY_FILE)即可零改动复用给任意新项目。但有两处会静默泄漏旧项目数据、必须处理:① 外部交叉验证 Sheet 的 EXTERNAL_JSON 固定读 OUTPUT_DIR/external_prices.json(晟悦家园外网价),新项目必须在 wrapper 里 fh.EXTERNAL_JSON = HERE/\"external_prices_<项目>.json\" 指向本项目外网价文件,否则会把旧项目(如坪山≈2.2万/㎡)价格套到新项目(如福田≈11.5万/㎡)上,得出 80% 折让等荒谬结论;② 脚本的 Sheet 标题 A1 与「外部渠道价格交叉验证」对比行/结论曾硬编码"晟悦家园/坪山",必须改为 f\"{PROJECT_NAME} ...\" 并由 permit_details 逐楼栋动态生成对比行(不得写死旧项目证号)。交付前必做:对产出 Excel 全表扫描旧项目关键字(如"晟悦家园/坪山"),0 命中才算干净。
单元枚举核查要留证:即使项目最终是单单元,也应跑一次 getBuildingDictToPublicity 核查并把 gnqmcList 记录在案,避免后续反复怀疑漏抓。晟悦家园已验证:两张证各 1 栋,gnqmcList 分别为 ['未知']、['住宅'],均为单单元,默认请求即全量(616=294+322)。
⚠️ 采集后必做多键去重核查(2026-08-18 淦盈置业·祥云居沉淀):楼栋标签可能重复(同标签分属不同批次/不同楼栋ID,如三座×2、五座×3),脚本内置去重(标签+房号)可能误删或漏删 → 交付前跑多键独立核查:(楼栋ID+房号) / (预售证号+房号) / (预售证号+房号+坐落) 全部 0 重复才算干净。"同房号跨多证号"≠重复(不同楼栋各有同号房,如每栋高层都有 3101),以楼栋ID+房号为准即唯一。另:用途归类先精确匹配再 startswith——"住宅车位".startswith("住宅") 为 True 会把车位误算进住宅(祥云居去化率被污染 74.1%→修正 96.3%)。
⚠️ 状态词表随项目不同,勿硬编码 4 种:深圳实际状态含 期房待售/已签认购书/已签合同/已备案/首次登记/已录入合同/司法查封/安居房/在建抵押/锁定 等。剩余货值里"已卖出/已登记"类须用 {已备案, 已售, 首次登记}(代码常量 SOLD_STATUSES);分析总结须遍历输出全部状态而非只打 4 种,否则会漏算(翠湖大厦 468 套"首次登记"被漏打即教训——它实际是已办证/已转移登记=已卖掉)。单元枚举用 getBuildingDictToPublicity 的 gnqmcList 核对单元数,>1 单元须逐单元全量抓(翠湖 gnqmcList=["未知"]=单单元,528 即全量)。
列表页先于详情页:详情页 API 只返回当前预售证数据,从详情页挖不到其他证/楼栋;但详情页内要主动遍历楼栋/单元。
⚠️ "lite" 不能作为自动化(automation)的 modelId:"lite" 是 Agent 工具的模型变体名,自动化运行时不认,设成 "lite" 会导致定时任务启动失败、完全不执行(实测:8/7 设置后 8/8 全天 + 8/9 上午的任务全部缺席)。自动化 modelId 需用具体模型标识符或 "default";在确认某 modelId 对自动化有效前,勿盲目设置。交互式 Agent 调用仍可用 model: "lite" 变体省钱。
历史快照去重:save_history() 应按"日期+小时"去重(同小时只留最新一条),避免短时多次运行(如手动+自动化撞车)导致快照堆积膨胀。
⚠️ 先找公开入口,再考虑 CAS/SPA:很多城市有两条路径——公开信息页(无需登录/验证码)和查询SPA(需CAS/验证码)。务必优先走公开页。成都的 infoDetail 公开页(blmp.cdzjryb.com/fplc_daas_portal/#/infoDetail?...&type=1&title=预/现售项目)可直接按项目名搜索、返回含「一房一价」「预/现售方案」详情链接的表格,点击「一房一价 详情」即跳转逐套房源页 zw.cdzjryb.com/roompricezjw/index.html?param=<token>,全程无需登录/验证码。只有需要更深层数据(如预售证PDF原文)时才走 CAS SPA。
CAS SPA 驱动(fallback):带 CAS 的 SPA 直接用 page.request.get/post 或 page.evaluate(fetch) 打 CAS 网关接口会超时/Failed to fetch。正确做法:用 Playwright 填充查询表单 + 点提交,让 SPA 自己走内部 axios XHR 完成 CAS 票据流程;再用 page.on("response") 或 page.add_init_script 钩 fetch/XMLHttpRequest 拦截响应。成都 SPA 真接口是 /fplc/Ticket/getDataWithLogin(POST,返回 hex 编码的 PDF),而非直观的 /fplc/zhcx/HouseListQuery(超时不可用)。
验证码先查前端 canvas + Vue $data:很多 SPA 验证码是 <canvas id="s-canvas"> 由 Vue 组件 fillText 前端绘制、值存在 __vue__.$data 里(键名含 code/captcha,值为 3–8 位字母数字),用 el.__vue__.$data[k] 直接读,比"明文验证码接口"更通用——先查 DOM <canvas> 与 Vue $data,再退而求其次找验证码接口。
逐套房源页结构(roompricezjw 模式,成都已验证):跳转到 roompricezjw/index.html?param=<token> 后,页面渲染 <table> 含全部字段(楼栋号/楼层/房号/建筑面积/户型/挂牌清水价/装修价格/用途/销售状态/抵押/查封)。楼栋/单元切换靠 .rp-nav-item[data-val="HNO"](楼栋tab)和 .rp-subnav-item[data-val="UNO"][data-parentval="HNO"](单元tab),.on 类标记当前选中。API:POST /house-one2one/one2one/getHnoAndUnos 返回楼栋/单元列表(明文JSON),POST /house-one2one/one2one/getFloorEstateOfViews 返回逐套数据(加密/Base64编码,但页面JS解密后渲染到table)。直接 scrape 渲染后的 table DOM 比解密API更可靠。关键坑:①点击已激活(.on)的nav会清空表格,须检查 classList.contains('on') 跳过;②subnav选择器须带 [data-parentval="HNO"] 避免跨楼栋误匹配;③每次点击后 wait_for_response("getFloorEstateOfViews") + 1.5s 渲染等待。
预售许可证信息纳入采集:在房源明细Excel中增加「预售许可证清单」Sheet,记录每张证的 证号/项目名/行政区域/项目地址/房屋用途/开发商/预售面积/预售日期/监管银行/监管账号/备注 等字段。这些信息通常在公开列表页(如成都infoDetail)或详情页API中可直接获取。
剩余货值测算(口径详见 SOP 第 8 步):Excel 增「剩余货值测算」Sheet。关键补充(2026-08-10/08-11 实战)——①口径分级:现楼/首次登记场景须输出「上限口径」(全部首次登记=可售存量)与「审慎口径」(现房在售确认可售的项目才计,交付多年的视为业主已办证),见深润川案例(上限 34.49 亿 vs 审慎 22.91 亿,均分主/参考双口径);②基准两级回退在代码里必须真正实现并回读校验(晟悦家园漏实现第②级导致主口径错误为 0,教训);③「合并汇总(全项目)」区块是对外汇报核心,勿省略;④切勿把可售均价直接当主基准——它是替代参考,不是备案成交价。
⚠️ 交付物必须全量重建、时间戳必须最新(山樾湾 2026-08-24 教训·用户强制):任何重新生成 Excel/Word 的脚本,必须"整篇一次性生成",严禁事后用 add_paragraph/append 追加章节再覆盖——否则每次重跑旧版函数体会把追加内容覆盖掉,制造"前后口径打架、格式乱、章节时有时无"的低级事故(本次 Word 就曾出现第四、六章结论冲突)。强制规则:① 报告正文(含全部章节、全部口径修正)必须写进生成函数体内一次性产出,不依赖运行后再补;② 生成时时间戳一律用 datetime.now() 实时刷新,禁止硬编码旧时间或从旧文件残留;③ 重跑即覆盖旧产物,产物文件名带时间戳区分版本,交付时只给最新版;④ 交付前实测审计:用 openpyxl/python-docx 回读生成的文件,确认(a)章节齐全且口径一致无冲突、(b)时间戳为本次、(c)无旧项目关键字残留。这条是"动态总结进 skill 机制"的交付物自检项,违者等同未完成任务。
翠湖大厦(2026-08-10)核心教训:现楼/商办项目的平台预售信息会系统性失真,若不核查会把"仍在开发商名下可售"的房源误判为"已售罄",得出剩余货值=0 的致命错误结论。本专章是 SOP 第 10 步的展开。
fetch_house_data.SOLD_STATUSES、collect_shenzhen_all_units.py、build_shenzhen_units_summary.py 三处已对齐;汇总脚本务必从原始 statuses 重算,勿直接信任 jsonl 的 sold/destock_rate 旧值(旧版曾误含签约管道)。useage 字段已存在于逐套 raw(fetch_house_data 提取的 house 含 "用途"/useage,注意源字段名拼写是 useage)。已落地:build_shenzhen_units_summary.py 从 raw_{safe(项目名)}.json 聚合 useage(去空格归一化,如"单 身 公 寓"→"单身公寓"),生成项目级「物业类型」列(商品住宅/公寓/商办写字楼/产业工业/宿舍配套/酒店/其他)及「可交易套数」「可交易占比%」(可自由交易=商品住宅+公寓+商办写字楼)。空 raw 标"无逐套数据"。每次重跑自动刷新,无需手动。caihui_mcp 查开发商 失信被执行人 / 限高 / 被执行人(执行标的) / 股权出质 / 司法冻结;⚠️ 财汇MCP 不覆盖不动产/房产抵押,仅反映企业级债务信号(股权未冻 ≠ 房产未封)。数据须标注 [MCP·预警通 YYYY-MM-DD]。⚠️ 同 P2 降级规则:若财汇MCP 不可用,按优先级降级——① neodata(WorkBuddy 企业数据连接器,取失信/限高/股权出质/司法冻结等);② 国家企业信用信息公示系统 / 天眼查 / 企查查 等权威工商源;③ WebSearch 定向兜底(须明示「风险核查降级、置信度有限」)。来源标注同步切换为 [neodata] / [工商·公示系统] / [工商·天眼查] 等,并在交付物注明本次实际所用渠道。[外网·WebSearch]。[MCP·预警通];外网 = [外网·WebSearch]。build_sz_refprice.py 的 add_note_row()。以下来自 2026-08 成都青江名邸项目的真实踩坑,优先级高于具体技术细节。
getWebPreSellInfo)只返回项目级汇总时,绝不意味着"平台不公开逐套"。很可能存在另一套独立系统(公开信息公示页)含完整逐套"一房一价"。本案先误判"成都不公开逐套",后因用户截图显示 7 条记录(非已抓的 3 条)才推动重新探查,最终在公开 infoDetail 页找到完整逐套数据 —— 方法没问题,是路径选错了。.rp-nav-item[data-val]) + 单元 tab(.rp-subnav-item[data-val][data-parentval]) + 渲染后 <table> DOM scrape + 每次切换 wait_for_response 的模式,适用于任何"一房一价"式逐套页面;API 响应即使加密,scrape 渲染后的 table 更稳。*** 或留空 —— 属平台规则,非数据损坏、非异常,缺失单价可用 总价/面积 回算。references/类型库.md 二、反爬类型速查 + references/瑞数专项.md——务必实测 WAF meta id 再定性(杭州原误判瑞数实为阿里云 WAF);难度排序:瑞数 > 顶象(headless) > 阿里云 acw_sc__v2。build_house_dashboard.py 一条命令复用(自动探测表头/动态列映射/动态状态配色/兼容两种剩余货值结构)。references/cases/成都青江名邸-教训案例.md——本案贡献三大新教训:① 分母对齐(覆盖率/缺口的分母必须严格匹配"抓取目标范围",错用"项目总建面"当分母会系统性高估缺口,正确用"预售建筑面积"得 69.4%);② 双口径货值(逐套价不公开时,用官方"预/现售方案"modal 的预售均价×预售面积解锁"官方备案货值"口径,与实测逐套货值互证、诚实标注覆盖率);③ 复盘诚实更正(发现分母错立即在文档更正、不掩盖)。该案例是「公开信息页 infoDetail + roompricezjw 逐套 + 预/现售方案 modal」完整组合的首个落地范例,亦印证本清单 #1–#4。今日(成都案例入 skill + 桌面查询实验开发/bug修复/入口/搁置回归)收口复盘,提炼为跨任务强制规则。详细复盘见
references/复盘_2026-08-12_全天迭代与smart铁律.md。
<input list>(datalist)只验了后端 API 正常,交付后用户实测"点击无反应"——根因 datalist 只在打字时弹、点击不展开。凡涉及 UI 交互,交付前必须用 Playwright + 本地 Chromium 真跑点击/输入/联动(gui_desktop/verify_ui.js 即回归脚本),零报错才交付。http.server + webbrowser.open 的本地 Web 版,任何装 Python 的机器都能跑、且可沙箱实跑验证。<input>+<div列表>(focus/click 展开、input 实时筛选、mousedown 回填、blur 延时关)比 datalist 可控;未知项用「手动输入 fallback」兜底,不阻断流程。每个案例是某一城市/项目从「踩坑 → 修复 → 复盘 → 提炼」的完整闭环,沉淀为可迁移方法论。新城市/新项目遇到同类问题优先查本库。
references/cases/成都青江名邸-教训案例.md。fetch_house_data.py 给皇熙悦府时,首次成品 Excel 的「外部渠道价格交叉验证」Sheet 静默继承了晟悦家园(坪山)外网价与硬编码标题/对比行,福田项目算出 80.6% 折让等错误结论。核心教训——① 复用须按项目隔离 EXTERNAL_JSON/HISTORY_FILE/PROJECT_NAME;② 采集器须 project-agnostic(标题/对比行/结论不写死旧项目值);③ 交付前用 openpyxl 全表扫旧项目关键字(命中即回退)。修复后全表扫描旧项目关键字 0 命中、折让修正为 11.5%。完整文档见 references/cases/深圳皇熙悦府-跨项目污染教训.md。#floorsearchkeyword 输入+点 button.btn-search,Enter 不触发)→ --ids 69262 逐栋实采 1,040 套。核心教训——① 多键去重核查(楼栋ID+房号/证号+房号/证号+房号+坐落 全 0 重复;同房号跨证号=不同栋同号房属正常);② 用途归类先精确匹配再 startswith("住宅车位"污染住宅统计);③ 自持转可售判定=最新现售证批次×可售状态(官方无自持专列);④ 官方页面顶部"680/80/600"为全站占位符不可用;⑤ --ids 会覆盖共享 houses.json,专项数据立即备份隔离。完整文档见 ~/.workbuddy/skills/developer-group-cross-analysis/references/淦盈置业案例.md(跨 skill 案例)。initSession→tamperUrl.html 重定向),SPA 不再自发触发业务 API,但 headless 下发的 cuyGLa6e token 对三个枚举接口直连 POST 仍有效。改用「headless 取 token → page.request 直连逐(楼栋,单元)枚举」绕过,无需 CDP 真实浏览器,一次跑通 616 套全量。核心教训——① WAF 只拦 SPA 会话流程、不拦带 token 的直连 API;② 此轻量兜底优先于 CDP;③ 仍须复用 8-Sheet 管道并按项目覆盖配置防污染。完整文档见 references/cases/深圳-晟悦家园-WAF挑战token直连枚举.md。references/cases/深圳-山樾湾花园-安居房去化核实.md。开始
├─ 有公开信息公示页(含"一房一价/详情"链接,无需登录)?
│ └─ 是 → 点「详情」→ roompricezjw 式逐套页 → 遍历楼栋/单元 scrape table ✅
├─ 否,但有查询 SPA(需登录/CAS/验证码)?
│ └─ 是 → 表单驱动 + 拦截响应 → 取项目级/PDF(或 CAS 穿透后逐套)
└─ 都无逐套入口 → 交付项目档案(6 Sheet 中"房源明细"改"项目汇总")
异地多城"一房一价/备案价"逐套采集的实测分类与方法库。城市平台速查表(33 城)见
references/real-estate-guide.md五-B;本节约方法论与"下次怎么继续"。
| 类 | 数量 | 城市 | 说明 |
|---|---|---|---|
| ✅ A | 10 | 深圳/成都/佛山/珠海/南京/重庆/苏州/西安/武汉/郑州 | 纯匿名可自动化,已固化采集器,采样 ≈1.07 万套 |
| 🟡 B | 3 | 无锡 / 杭州 / 广州 | 无锡:方法通,沙箱出口 IP 被拉黑 → 用户本机跑 extract_wuxi.py;杭州(2026-08-11 升级):项目级/证级可采(阿里云 WAF 已绕过),仅逐套一房一价被顶象无感验证拦截 → B+ 类,用户本机住宅 IP 大概率进白名单可拿逐套;广州(2026-08-12 实测修正,原误列 E/瑞数):阳光家缘(zfcj.gz.gov.cn)为 jQuery/Vue 站,反爬实为 nginx Referer 校验+IP信誉(非瑞数,无 hmYiCp5tA9K0),Playwright 同域 fetch 可过;逐套销控表(房号/面积/户型/用途/状态/抵押)可全自动采,但备案价需'广州市房地产行业协会'小程序PDF或依申请公开 → 销控表版 B 类(extract_guangzhou.py 已落地,详见 output_cross/广州/status.txt) |
| 🔧 C | 1 | 宁波 | 采集器就绪,仅差一次性装 Tesseract 跑 OCR(PNG 反爬) |
| 🔶 D | 12 | 合肥/东莞/肇庆/中山/清远/潮州/茂名/惠州/廊坊/天津/贵阳/济南 | 小程序/扫码/注册登录/无制度(济南),不纳入持续 |
| 🚫 E | 7 | 北京/石家庄/常州/保定/江门/上海/南通 | 瑞数反爬、域名劫持、无入口 |
hmYiCp5tA9K0 meta)。裸 curl 易 403;须 Playwright 同域 fetch(带 cookie/Referer,JS 内 o.u/o.p 单参)绕过。zxyslplb.ashx(showNum 参数)——仅返最新 10 条、不接受关键词,用于"最新项目"采样。fdcxmxxlb.ashx(sProjectName / sDeveloper / sPresellNo / page / pageSize,全库 11902 条)——按备案名/开发商/预售证定位"非最新"项目,是唯一能命中老项目/具体楼盘的入口。xmldxx.ashx(sProjectId)→ 逐套 xmxkbxx.ashx(buildingId + 固定过滤参数)。1=可售 · 2=已售(已签合同) · 3=已备案(合同登记备案) · 4=已过户(所有权转移) · 5=不可售/限制销售。授信口径:status∈{2,3,4} 均计"已售/权属已转移";抵押以 pledgeStatus≠0 计(码 1=已抵押/2=已解押/3=已抵押其他)。extract_guangzhou.py 已支持 --search <备案名>(按 fdcxmxxlb 检索,输出 5 Sheet:项目清单/房源明细/统计分析/状态码图例/口径说明)。例:python extract_guangzhou.py --search "壹湾广场" --max-projects 0 --out <xlsx>。fdcxmxxlb 项目字段用 section/projectAddress(旧 zxyslplb 用 sectionName),采集器已做归一。③ 接口对 sProjectName 与 sDeveloper 做 AND 组合:工厂曾把两者同传导致必返 0,已修复为"有备案名只传 --search";④ 采集器 asyncio.run(main()) 现已加 __main__ 守卫,避免被 import 时误跑默认全量抓取。by_developer.py --brand 鹏瑞 --city guangzhou --search-name 壹湾广场 命中 4 项目/1116 套官方逐套;官方备案主体=广州市铮玥投资有限公司(与外网宣称"鹏湾"不符,红线②实证);外网称"批准152套/去化30%" vs 官方全业态 1116 套/已售97%(红线④实证)。www.hfzfzlw.com/spf · 2026-08-31 用户线索打通 · 纯 requests 可采)hfzfzlw.com 根路径 / = 住房租赁交易服务监管平台;/spf 子路径才是「合肥市房产市场信息平台」(商品房)。真实入口从局官网 zfbzfcglj.hefei.gov.cn 首页「重要业务系统」区取到 = https://www.hfzfzlw.com/spf。教训:一个域名下常挂多套业务系统,绝不能只看根路径标题就定性该域名"没有某类数据"——必须先从主管局官网取业务系统入口清单,再逐个子路径探。/spf 系列 纯 requests 可达(200 / 无 WAF / 无瑞数 / 无验证码)。而政府主站 drc.hefei.gov.cn、zfbzfcglj.hefei.gov.cn 对沙箱 IP 全部 HTTP 521(加全套浏览器指纹 Sec-Fetch-*/Accept 仍 521 = IP 信誉封禁,非 UA 问题)。→ 破 521 的通用手法:用 WebFetch 通道读被封站(能通),requests 读业务系统(同域名不同子路径可能不封)。/spf/Permit 入网楼幢(预/现售证号·项目名·楼幢号·销售面积·发放日期·物业类型)//spf/Project 入网项目(公司·项目·区域·地址)//spf/HouseMarket 房源超市(项目·区域·企业·地址·电话)/另有 Bank Scheme Contract Homefund。/spf/Permit 每行证号挂 /spf/details/<加密token>(token 就写在列表 HTML 的 href 里,随取随用,无需破解加密)→ 详情页即官方楼盘表:楼层 × 房号网格(层:7 → 701/702/703/704…)。<td style="…background-color:XXX" onclick="s('房屋ID',1)">701</td> → 取 房屋ID(注意 onclick 在 td 开标签内,正则须匹配 <td[^>]*>.*?</td> 整段再搜,只搜标签内容会漏)。nscaler(id):逐位映射 0→0 1→2 2→5 3→8 4→6 5→1 6→3 7→4 8→9 9→7(定义在 /spf/Content/js/Jquery.Query.js,不在 jquery.min.js 里,别找错文件)。GET /spf/details/getrsa/{nscaler(id)} → {"state":true,"id":"<RSA密文>"} → GET /spf/details/house/{密文} → 逐套 JSON。+ / =)。做 base64url 转换(+→-、/→_、去 =)或 URL-encode 都会返回 {"state":false,"data":{}}。列表页 token 用 base64url 只是展示层风格,API 不吃这套。iPrice(备案单价元/㎡)、lbBuildArea/lbInsideArea/lbJoinArea(建筑/套内/分摊㎡)、lbHouseType(户型,如"三室户")、lbHouseUsefulness(房屋用途)、lbSellFlag(销售状态中文)、sellflag(状态码)、lbLocation(完整坐落,含行政区)、lbStructure、strTitle/lbPartNO(房号)。sellflag ∈ {0,3,11,13} 显示 iPrice(与深圳同口径:可售类才公示价);但 API 对其余状态也返回该字段(可能为空),须用「有价 vs 无价交叉表」实测占比后据实解读。#0001fe可售 / #8a048x已签约 / #fd0002备案 / 已办产权 / 抵押可售 / #ffa500摇号冻结 / 已限制 / #cc660x限制销售 / #33cc99自建房 / 拆迁安置 / 抵押不可售。/spf/Permit 分页函数 listPager($(this), N) 末页 = 1583 页(每页 15 行 ≈ 2.37 万条证/楼幢),数据 T+1 更新(实测 2026-08-31 当日发放记录已在)。drc.hefei.gov.cn/jggl/index.html 与 jggl/jggs/spzzmmbjcx/index.html 均 404 下线(2022-12 即有市民投诉无法访问,现首页便民服务区已无该入口,只剩粮油价格/CPI/民生价格)。output_cross/collect_hefei.py(self-contained,两阶段 + 断点续跑)
--stage permits --max-page 1583 → hefei_permits.jsonl(全量证/楼幢底表,约 25 分钟,每页 15 行,?p=N 分页,默认发证日期倒序,p=1 最新、p=1583 到 2000 年)--stage units --max-buildings 600 --max-units 30000 --workers 14 → hefei_units.jsonl(逐套;默认跳过车位/车库/地下室/储藏/人防类,加 --keep-parking 可保留)--max-units 上限防跑飞。output_cross/build_hefei_master.py → 7 sheet(房源明细/楼幢汇总/项目汇总/按区统计/统计分析/楼幢底表全量/数据说明)。⚠️ 性能铁律(2026-08-31 实测):26k 行主档用 openpyxl 逐格 font/border 样式会触发 SIGTERM 超时(~360µs/格 × 49 万格 > 5min);须改用 xlsxwriter(已装 3.2.9)流式写出(逐格写 format 极快,秒级)。坑:xlsxwriter write(row,col) 为 0 索引,而 for r,row in enumerate(data,start=1) 的 r 是 1 索引 → 合计行加粗须用 ws.write(len(data), c, …) 而非 len(data)-1,否则会覆盖倒数第二个分区行。合肥_一房一价_主档_20260831.xlsx(房源 26,084 / 楼幢 601 / 项目 107,抽样=最新 600 楼幢逐套;楼幢底表全量 23,739)。build_hefei_cases.py 针对 hefei_target_permits.jsonl(筛项目名→全楼幢→逐套)出 合肥实战案例_三盘尽调_20260831.xlsx(逐套+楼幢去化+汇总对比+说明)+ …报告_20260831.docx。三盘真值(全量下钻,非主档抽样):
项目汇总 的套数是最新 600 楼幢抽样的部分值——文渊府被抽中仅 1~2 栋→主档显示 604 套(实为 2195);嘉宸雅园主档 816 套(实为 1943);汀云居 620 套(巧合正好全中)。城市级主档只能看趋势,单盘真值必须点名制全量下钻。POST /api/gyzfw/open-api/certificate/list,body {"businessType":"ysz","current":N,"size":200}。
placeName/keyword/projectName/name/searchValue 均被忽略,仍返全库前 N 条)→ 必须翻页后本地过滤项目名。经验:size=200 时约 12 页可覆盖 2017 年以后全部。POST /api/gyzfw/open-api/certificate/info,body {"acceptanceId":"<列表返回的受理号>","businessType":"ysz"}。
building(楼栋号)、preSellStart/preSellEnd(预售起止)、banks+accounts(监管银行与账号)、sellSummaryList[{useRange,count,area}](分用途批准套数与面积)。certificate/info 可用;certificate/detail、certificate/building/list、certificate/house/list 及 GET 形式全部 HTTP 500。sellSummaryList 是预售批准量(供应),不是成交;外网网签是成交口径,两者不可相减推库存。output_cross/贵阳/):probe_lushan.py(关键词参数探测+全库翻页过滤)、build_lushan.py(拉详情+7 Sheet 建表,含来源着色)。实测:万科麓山 17 本证(2019-07~2024-11)、批准 5628 套 / 581,876.52 ㎡。collect_vanke_all.py(全库翻页+8 盘过滤+info 拉取)、build_vanke_consolidated.py(5 盘整合+4 盘红旗+全览 6 Sheet)。webBuildingInfo / 重庆 GetRoomJson(ASP.NET PageMethod,POST JSON body)。<table>(表头跨行,须定位含"房号+建筑面积"的表头行)/ 苏州发改委公示表(栏目列表 API 枚举 + 文本型 PDF,pdfplumber 直解,扫描版 PDF 宁可跳过不产脏数据)。⚠️ 苏州注意:此类公示往往是历史存量(2019–2022),非实时,交付前必须声明口径。page.on("response") 拦截 + 逐(楼栋,单元) POST。ajaxToGetHouseModel.do(body floorId=&buildingNo=)。完整类型表(16 类 + 瑞数攻坚专项)已迁出至
references/类型库.md与references/瑞数专项.md,主文档仅保留索引,避免重复维护。下表为速查入口:
| 想查 | 去处 |
|---|---|
| 反爬类型全表(瑞数/顶象/阿里云/PNG/小程序/关键词忽略等 16 类) | references/类型库.md 二、反爬类型速查 |
| 瑞数/政窗动态 token 识别与 Playwright 应对(含上海攻坚) | references/瑞数专项.md |
| WAF 终极兜底 · CDP 复用真实浏览器(2026-08-22 深圳验证) | 本文件「CDP 复用真实浏览器」专章 |
| 城市分类 A–E、状态码图例、数据质量校验 | references/类型库.md 一、三、四 |
用户指示:用更强模型逐个攻破 E 类城市,一步步积累经验。上海为首个试点,结论:E 类维持,瑞数在当前 headless 沙箱不可绕过。本文档记录完整方法,供未来(非沙箱/独立IP/真 JS 逆向)再战。
已实测失败的路线(上海,2026-08-11,全部折戟):
--disable-blink-features=AutomationControlled):412→加载瑞数 JS(200)→二次请求 400 空页Stealth.apply_stealth_async)+ enhanced fingerprint(navigator.webdriver→undefined、plugins、chrome.runtime、permissions hook、移动端 UA、headless=False 回退):同样 412→400fetch API(拿到 412 挑战 cookie 后仍 502/400);20+ 常见 API 端点枚举:全 412UA1L1zGonajvO httpOnly + UA1L1zGonajvP)被服务端判定为无效——说明挑战不只校验 cookie 存在,还校验浏览器真实指纹(canvas/WebGL/音频/时序等非标准特征),stealth 补丁深度不够判定瑞数封锁等级的"411 速查":看 412 响应体大小——
$_ts.nsd/$_ts.cd 编码数据 + 混淆 JS),说明 WAF 已对该 IP 升级封锁有用的替代数据源(上海案例,证级兜底):
fgwapp.fgj.sh.gov.cn/hudong/xuke/home/ysxk?pageNo=1&pagesize=20&testpara=0:无瑞数保护,requests 直连可拿全市 11342 条预售许可证(项目名/企业名/地址/证号/发证日期),支持 ?name= 搜索。可做「证级清单」Excel(济南模式),但没有一房一价data.sh.gov.cn 开放数据平台:有「商品房预售许可证信息」数据集(9036 条,无条件开放,CSV/JSON/XLSX),但也在同一瑞数 WAF 下,API 与下载全 412fangqingbao.com(房情宝)聚合 fangdi 公示摘要(证级+备案均价);房天下 m.fang.com/xf/business/houseprice/sh/{project_id}/ 有一房一价页但需登录下次再战的可行路线(未尝试/需环境):
$_ts、document、canvas/WebGL 等)生成有效 cookie——需要 reasoning 级模型 + 大量调试时间,成功率中等,且瑞数版本更新后 cookie 算法会变(维护成本高)攻坚 SOP(再战时按此执行,bounded 尝试后即定性):
🆕 2026-08-22 重大更新:路线 2「非沙箱 headed 浏览器 + 干净 IP」已在深圳通过 CDP 复用真实浏览器 方案验证成功(730 项目 / 49.5 万套 / 0 失败)。今后任何城市 Playwright 直接 launch 被 WAF 拦(瑞数/腾讯云等 JS 挑战),一律先上 CDP 方案,见下节。
🔒 用户强约束 · 数据时间范围(2026-08-24 确立):用户只看近 ~10 年数据(顶多往前 10 年),远久年份的盘基本不关心。触发规则:任何"跑数/采集/分析"任务,若目标涉及取证/建成/上市年份较早(如 ≤2015)或整体数据有明显时间排布,必须先暂停并提示年份分布(如"730 项目里 ≤2009 老盘占 1295 个、2020+ 仅 0 遗漏"),由用户决定跑全量还是只跑近十年,不得闷头全跑。延伸到:① 全量采集前先出"按年份分桶"概览;② 老盘(>10 年)默认提示可跳过;③ 衍生表/报告默认只呈现近十年,老盘单列或省略。
症状:采集进程跑了几十小时、CPU 近乎为零、日志反复刷
[退避] 限流, 静默冷却 3600s, 数据文件 mtime 一动不动 → 不是"在慢慢采",是死循环假活。 东莞实况:进程自 2026-09-01 17:36 空转至 09-03 10:48(40+ 小时), 期间dongguan_permits.jsonl零新增,日志 44 行里 40 行是第 4 阶退避。
根因:退避序列 BACKOFFS=[600,1200,1800,3600,3600] 走到最后一阶后没有退出条件,
backoff_sleep() 永远 sleep 最后一档再重试 → 只要站点不恢复就无限循环。
定性判据(速率型限流 vs IP 级持久封禁):退避期间已做到零请求仍连续多次失败 (如连续 6 次、累计冷却 4 小时无一次成功)→ 就是 IP 级持久封禁,再等也没用, 必须换出口 IP / 隔日再试 / 改人工渠道,绝不能靠加长退避解决。
强制写法:全局 _consec_boff 连续退避计数,成功即复位;达上限写 *_blocked.flag
(记录 blocked_at / reason / resume 页码)后 sys.exit(3),把决策权交回人工:
MAX_CONSEC_BACKOFF = 6 # 连续退避上限(≈4 小时无任何成功请求)
def backoff_sleep():
global _boff, _consec_boff
_consec_boff += 1
if _consec_boff >= MAX_CONSEC_BACKOFF:
# 写 blocked 标记 + sys.exit(3),不再无限占位
...
def ok():
global _boff, _consec_boff
_boff = 0; _consec_boff = 0 # 成功一次即全部复位
巡检习惯:排查"自动化卡住"时,先 ps 看有没有起跑时间异常早的 python 进程,
再对比日志 mtime 与产出文件 mtime —— 两者背离(日志在动、数据不动)= 假活,直接终止。
结论:WAF(瑞数系/腾讯云 JS 挑战)会拦截 Playwright 直接
launch的浏览器——headless/headed/指纹伪装(webdriver 覆盖、stealth 补丁)全被识别,页面停在挑战阶段不发业务请求(特征:请求里只有随机路径混淆 JS + 动态时间戳参数,页面标题/内容为空)。终极兜底通路 = CDP 复用用户手动打开的真实浏览器会话。
🔴 2026-09-03 重要修正(优先级高于上段,先试这个再上 CDP):「唯一通路 = CDP」已被证伪。 深圳实测:裸
chromium.launch(headless=True)拿不到cuyGLa6etoken(脚本只能报错退出, 底数自动化因此静默停更 15 天,表现为"自动化卡住");但仅加一个启动参数--disable-blink-features=AutomationControlled(配--no-sandbox)后 headless 一次即拿到 token, 底数重采 4,417 证 + B1 逐套拦截房源 API 全部成功,全程无需 CDP、无需真实浏览器。 新默认顺序:① 裸 launch 失败 → ② 加--disable-blink-features=AutomationControlled重试(必做,成本近乎为零) → ③ 仍失败才上 CDP。此前把②跳过直接判"必须 CDP",是本次 15 天停更的直接原因。 完整参数(与已验证的collect_shengyue_token.py对齐):python browser = await p.chromium.launch( headless=True, args=["--disable-blink-features=AutomationControlled", "--no-sandbox"]) ctx = await browser.new_context(viewport={"width": 1920, "height": 1080}, user_agent=<桌面 Chrome UA>)⚠️ 排障提醒:token 拿不到时先比对启动参数,不要误判为"引导页项目选错"——本次曾依次怀疑 "底数第一条 / 最新发证 / 在售活跃证"三种选证策略,全部无效,真正变量自始至终是启动参数。
识别特征(触发 CDP 方案):① Playwright 全模式拿不到业务 token;② 页面标题空、body 空;③ 请求列表出现 /<随机串>/<随机串>.js 混淆脚本 + ?xxx=时间戳 动态参数 → 直接上 CDP,不要继续试其他 launch 模式。
三步操作(用户本机):
1_启动浏览器.bat(自动探测 Chrome/Edge,--remote-debugging-port=9222 --user-data-dir=chrome_profile 打开目标页面)。关键检查:页面必须能显示内容(眼睛能看 = WAF 放行真实浏览器)。connect_over_cdp("http://127.0.0.1:9222") → ctx.pages[0] → req = page.request(页面级请求上下文,带会话 Cookie——这是能过的关键)。page.on("request") 抓 cuyGLa6e token 后,主动构造 POST 到 projectPublish 三个枚举接口——getProjectDetailInfoToPublicity(证级均价)→ getBuildingNameListToPublicity(楼栋)→ 逐栋 getBuildingDictToPublicity(单元 gnqmcList)→ 逐单元 getHouseInfoListToPublicity(房源),逐证/逐栋/逐单元枚举。⚠️ 绝不等 SPA 前端自发请求——WAF 升级后 SPA 被重定向到 tamperUrl.html、不再发业务 API,必须脚本主动打后端(与下节「token 直连枚举法」同款内核)。每项目完成即落盘。关键坑(全部实测踩过):
%LOCALAPPDATA%\Google\Chrome\Application\chrome.exe,不在 4 个标准 Program Files 路径——探测必须含 LOCALAPPDATA + 注册表 HKLM:\SOFTWARE\Clients\StartMenuInternet。shutdown //s 被 MSYS 破坏不生效,须 cmd //c "shutdown /s /t 60" 或 PowerShell 调用。shutdown /s /t 兜底。模板脚本(深圳已固化,可改清单复用):1_启动浏览器.bat + cdp_rerun.py(小批量/单项目)+ collect_all_b1.py(全量清单、断点续跑、节流、失败容忍)。落盘格式与普通枚举版一致。
B1 全量快照(
collect_all_b1.py+fetch_house_data.py)只拦首屏一次房源 API、未枚举单元 → 系统性失真(如白石洲仅 453 套/1 单元,漏 2293 套/84%;珑瀚曾误报 3/366)。以下三件套改用 CDP 逐单元枚举全量,可信度=A 权威全量。
脚本清单(工作区根目录,可改清单复用):
gen_recrawl_config.py:从 B1 失真扫描结果生成 recrawl_permits.json(73 项目 / 120 证,含 ysProjectId/preSellId)。collect_shenzhen_enum.py:73 失真项目通用 CDP 枚举重采器(连本机 9222 真实 Chrome)。⚠️ 致命 bug 已修(2026-08-27):原 if not tk: break 遇 WAF 抖动会终止整轮 → 改 continue(单项目失败跳过续跑,不中断其余)。补采用 --only <项目名子串> 逐个跑可绕过。collect_baishizhou_full.py:绿景白石洲璟庭专属全量枚举(2746 套/5 单元)。⚠️ 须 CDP 连 9222:原 launch(headless=True) 必被 WAF 拦(实测 token=None)→ 已改为 connect_over_cdp(CDP_URL)。build_shenzhen_enum_master.py:合并所有 raw_*_full.json → 深圳失真重采主档_YYYYMMDD.xlsx(房源明细 + 项目汇总 + 数据说明),openpyxl 审计。🔑 深圳 CDP 采集三铁律(2026-08-27 实测提炼):
collect_all_b1.py 僵尸进程:其挂起会占满本机 Chrome CDP(9222) 资源,致 connect_over_cdp 超时 180s、新采集全卡。先 tasklist|grep collect_all_b1 → taskkill /PID /F /T 清理再跑。if not tk: break 必须改 continue:WAF 偶发抖动使单项目拿不到 token,break 会让整轮 73 项目只跑部分(昨夜 64/73 退出即此因)。结论:深圳房信平台对 headless 浏览器发起 WAF/反爬挑战时,SPA 的
user/initSession会返回needtoken=true并被重定向到tamperUrl.html,导致 SPA 不再自发触发业务 API(getProjectDetailInfoToPublicity/getHouseInfoListToPublicity等根本不发出)——表现为"首屏未捕获房源 API"、"页面标题/body 空"。但实测证明:WAF 只拦了 SPA 的会话流程,没拦带 token 的直连枚举接口——headless 页面下发的cuyGLa6etoken 对三个枚举接口直连 POST 完全有效。因此可用 「headless 取 token → page.request 直连枚举」 绕过 SPA 会话挑战,无需开真实浏览器、无需 CDP。
触发识别(优先于 CDP 尝试):⚠️ 2026-08-27 更新:深圳房信 WAF 已封死 headless 指纹,launch 连 token 都拿不到,本法已失效——直接走下方 CDP 方案。
page.on("response") 只看到 user/initSession→needtoken=true→tamperUrl.html 重定向,业务 API 从不被触发;cuyGLa6e token(出现在任意 Publicity 请求 URL 的 query 里)→ 先试本法,省去 CDP 开真实浏览器的步骤(用户本机动作)。三步操作(2026-08-24 晟悦家园实跑闭环,一次跑通 616 套全量):
chromium.launch(headless=True, args=["--disable-blink-features=AutomationControlled","--no-sandbox"]),开 page.on("request", h) 拦截任意 cuyGLa6e= URL,正则 cuyGLa6e=([^&]+) 取出 token(SPA 即使被重定向,token 仍在首次请求的 URL 里下发)。page.request 而非 CDP 会话):
POST {BASE}/getBuildingNameListToPublicity?cuyGLa6e={tk}(body ysProjectId=&preSellId=)→ 拿 5 位 key(fybId)POST {BASE}/getBuildingDictToPublicity?cuyGLa6e={tk}(body 含 19 位 buildNo)→ 拿 gnqmcList(单元名)POST {BASE}/getHouseInfoListToPublicity?cuyGLa6e={tk}(body {"buildingbranch":单元名, "fybId":5位, "status":-1, ...})→ 房源BASE=https://fdc.zjj.sz.gov.cn/szfdcscjy/projectPublish;枚举逻辑与 collect_longhan.py 同款(5位/19位关联、单元名原样传)。generate_excel(项目名/预售证/外部价均按项目覆盖,避免跨项目污染),产出与 SOP 完全对齐的 Excel。与 CDP 方案的关系(决策次序):
launch(headless=True) 连 cuyGLa6e token 都拿不到(白石洲实测 token=None,7.9s 退出)。因此 headless 直连法已失效,CDP 复用真实浏览器(上节)成为唯一稳定通路,不再作为"优先轻量"选项。🔑 通用铁律(两种方案共用 · 2026-08-24 提炼):无论 token 来自 headless 页面还是 CDP 真实浏览器会话,拿到 token 后一律主动 POST
projectPublish三个枚举接口做逐(楼栋,单元)枚举,不要依赖 SPA 自发请求。WAF 升级后 SPA 会话流程被卡(initSession→needtoken→tamperUrl.html),但带 token 的直连枚举接口仍放行——这是深圳(及同类 WAF 城市)采集的唯一稳定内核。
可复用脚本:工作区 collect_shengyue_token.py(晟悦家园实跑版,616 套全量抓全、8 Sheet 校验通过)已沉淀此模式;后续新项目只需替换 PERMITS(ysProjectId/preSellId) 与 PROJECT_NAME 即可复用同一套直连枚举逻辑。完整踩坑与代码见 references/cases/深圳-晟悦家园-WAF挑战token直连枚举.md。
核心盲区:政府平台(深圳 fdc.zjj.sz.gov.cn 等)对安居型商品房的房源状态只标 「安居房」 一个聚合标签,不区分"已签约配售"与"待配售"——因此单套去化率平台层面算不出来,也不能默认"已售"或"未售"。普通商品房的 8-Sheet 去化/货值管道若直接套用会失真(把安居房误判已售 + 被商业异常值拉爆均价)。本项目必须切换安居房适配口径 + 走住建局官方配售批次线交叉印证。
⚠️ 触发条件(满足任一即走本路径):
四步核实法(标准路径):
平台采集走安居房适配口径(勿套普通商品房管道):
SOLD_STATUSES(已售类)剥离开,单独成列,不计入审慎去化;askpricetotalB/askpriceeachB 全 null)→ 价格字段不做回算,标注"政府定价不公开·不测算";getProjectDetailInfoToPublicity.averagePriceTotal)平台是公开的(约 4.4 万/㎡量级),与"单套明细价不公开"不矛盾,须在「预售许可证清单」Sheet 如实填证级均价,避免口径矛盾;住建局配售批次线交叉印证(硬证据来源):
住保售〔2026〕0xx号),定位点名本项目的批次;⚠️ 关键铁律(2026-08-24 山樾湾外网复核教训):安居房项目常是跨年度、多批次(甚至月度)连续配售,绝不能只查最近一两个批次就下"去化率"结论。 ① 批次序列必须从项目首开年份拉全,不得从中间年份起算。山樾湾实战:用户凭记忆说"去年就开始卖了",外网复核证实其配售自 2024 年即已开售(四批次)——第一批次 2024-03(房源 2310 套·已定位 post_11217682·逐套校验两房613/三房185=798套·A)、第二批次 2024-05(住保售无文号·310 套·A)、第三批次 2024-06(无文号·95 套·A)、补充批次 2024-09(无文号·25 套·A);2025 下半年至 2026 上半年继续有一连串月度批次(015→027→030→040→054→008→021→031→059→064)。2023 年核查无配售批次证据(安居房 2023-08 闭库、2023-04 停土地出让,检索结果均指向 2024-03 为最早批次)。 ② 跨年度回查、把全年批次序列拉全,再按"已选定/认购中/待配售"做分批次进度表。山樾湾实战:2024 补全后 A 级累计 1910→2340(13 批);2026-08-25 第一批次(post_11217682)补齐后 → 3138 套(14 批),去化率(A级) 64.0%,含 D 级(064 认购中)上限 95.9%。若只查 059/064 两批会严重低估去化。首开年份必须按"项目最早批次年份"而非"用户提到的年份"确认——用户记忆常滞后于实际开售时间。
来源分级标注规范(强制):安居房批次数据可信度差异极大,交付物必须按级着色+标注:
C 级清零实战(2026-08-24 山樾湾):
状态="已选定" 核对数字,不是改标签。自媒体汇总常有:① 把预审/补选混入正式批次;② 跨月合并或拆分;③ 数字四舍五入误差(054 官139 vs 自142、021 官196 vs 自164)。选房结果公示 xlsx 提取实际签约套数(去化硬证据):
状态 列 = "已选定" 的套数 = 本批次实际签约去化(如山樾湾 059 批次:房源池 1654 套 → 已选定 112 套,选定率 6.8%);curl 直链(通告页附件 URL 规律:.../attachment/1/<分段>/<id>/<通告id>.xlsx,文件名在 download= 属性)。gkmlpt 文章页对不存在的 post 也返回 200 + <title>出错了</title>(软404),故不能靠 HTTP 状态码筛真页,必须 grep <title> 是否含项目关键词;post ID 路径段号 = ID 截前 5 位(如 11217682→11217、11298183→11298);真实 post ID 零散非整百,须步长 1 扫描 + 并发(xargs -P 40),按日增量(约 1640/天)估算窗口后收敛。山樾湾第一批次即以此法从 1121xxxx 区间定位到 post_11217682。查封用途隔离判断(授信关键):
useage 字段:山樾湾 91 套司法查封全部为"商铺"(商业配套),0 套住宅/安居房;进度上限与时间边界:
产物要求:
[A类·官方] 区住建局住保售〔2026〕0xx号通告及选房结果公示 xlsx + [A类·官方] 市房地产信息平台房源状态(采集日);可复用脚本:工作区 build_shanyuewan_report.py(安居房适配版 8-Sheet 生成器,含 CDP 补采证级均价 + 安居房口径修正);交叉印证 xlsx 解析逻辑见 output_cross/shenzhen_all_units/shanyuewan_cross/。完整案例见 references/cases/深圳-山樾湾花园-安居房去化核实.md。
🔑 安居房核实铁律(2026-08-24 提炼):① 平台"安居房"标签不可信为去化率,必须走住建局配售批次线闭环;② 实际签约去化 = 选房结果公示「已选房源」文件"已选定"计数(双文件交叉校验);③ 查封须逐套核用途,商铺查封 ≠ 安居房查封;④ 普通商品房 8-Sheet 管道禁止直接套保障房,必须切安居房适配口径。
📋 填表式落地模板:本 SOP 的逐城执行请配套使用
references/城市接入checklist.md(六步填表:基本信息→入口→反爬识别→API探针→字段映射→脚本固化→收口),避免口述走样、漏步。
zwfw.jinan.gov.cn/jpaas-jiq-web-jnywtb/front/info/searchspfys,body holderName/queryType/certificateDate),返回预售证级 JSON(证号/楼栋/日期/地址)——虽无逐套,但可证级全采、按楼栋核对推广信息。下"无制度基础/无数据可采"结论前,务必探政务服务网查询接口。extract_<city>.py + 落 output_cross/<city>_data/houses.json(统一结构:city/source/anonymous/captured_at/house_count/projects[],逐套字段用中文键名)。status.txt(结论+证据+数据量)。把「房源明细 Excel」升级为自包含 HTML 交互看板(Chart.js CDN,可离线打开/演示/发给客户)。 一次开发长期复用:换数据源即重生成。晟悦家园已落地
build_chengyue_dash.py→output/晟悦家园_交互看板_*.html。
⭐ 产出约定(2026-08-11 用户明确):日常单项目检索,产物固定为「Excel + 交互看板」双件套(Excel 作正式存档/授信依据,看板作演示/自助探索),两者都要生成;跨城对比大屏等综合性看板仅少数综合场景才做(如全国覆盖汇报),不要默认给每个项目做大屏。看板已覆盖 Excel 全部 Sheet 内容(含剩余货值/预售证/对比/告警/外部验证/总结),单文件即可独立交付。
产出形态:单文件 HTML,含 6 图表 + KPI 卡片 + 质量校验表 + 梯度分析表 + 可排序分页明细表,楼栋/状态/用途三筛选联动(多项目 Excel 自动加「项目」筛选)。
三大增强层(探数数·data 专家框架):
复用要点(通用版 build_house_dashboard.py):
python build_house_dashboard.py <Excel路径> [项目名] —— 任何项目一条命令出完整看板(晟悦家园/深润川已验证)histogram 类型不存在,须用 barskill/scripts/build_house_dashboard.py用户 2026-08-11 明确:"无逐套备案价"≠"没信息没 Excel"——把政府官网能拿到的尽可能提取(哪怕证级),再辅以外网(贝壳/安居客/房天下等)补房源与价格,合成带来源标注的 Excel。
全国 33 城覆盖能力的综合展示(向领导/客户汇报全国版图时用)。⭐ 用户 2026-08-11 明确:综合大屏属少数场景——日常单项目检索一律走「Excel + 交互看板」双件套,不要默认做大屏。
实现:skill/scripts/build_cross_dashboard.py → output_cross/全国33城房源采集对比大屏.html(18KB 自包含)。
CITIES 数组即更新)模式(济南·观山隐秀已落地,脚本 build_jinan_excel.py,产出 6 Sheet):
[官方·政务服务网 2026-08-11](浅绿底),外网 [外网·WebSearch 2026-08-11](浅黄底);颜色编码一眼区分。output_cross/jinan_data/济南观山隐秀_房源信息整合_20260811.xlsx + build_jinan_excel.py。D/E 类城市官方多只公开证级、逐套/备案价锁登录或无制度,平台不公开价。把"外网补价"程序化为可复用能力,让这类城市也能做去化/折扣率/货值量级分析(济南模式的可复用升级)。
流程:
external_prices.json(结构见 scripts/price_integration.py 文件头:records[{channel,type,desc,area,unit_price,total_price,date,url,note}] + search_date/city/tag)。projects[])。python price_integration.py --prices ext.json --permits permits.json --out out.xlsx → 多 Sheet(官方证级绿底 / 外网补价黄底 / 价格对比与货值 / 数据来源说明),自动按项目名模糊匹配并算折扣率(外网/官方)、货值估算(外网均价×批准面积)。C6EFCE / 外网黄底 FFEB9C,与全 skill 一致。python price_integration.py --demo 内置小样本跑通(无需真实数据验证逻辑)。为什么必须补第四档:既有 A/B/C 三档都把「首次登记(竣工未确权)」计入已处置, 导致表面 100% 去化的项目实际现金回笼极低。偿债来源是销售回款,不是竣工登记—— 单看 A/B/C 判"已清盘"会出授信事故。
四档定义(必须并列,绝不只给一个数字)
| 档 | 公式 | 含义 |
|---|---|---|
| D 现金回笼(新增·最保守) | 已售·网签 / 总套数 | 只看真卖出去多少。结清能力以 D 为主 |
| C 签约口径(最严) | (总−在售−风险−登记−安居)/(总−风险−登记−安居) | 剔除竣工未确权与政策房 |
| A 净口径(授信推荐) | (总−在售−风险)/(总−风险) | 只剔风险 |
| B 毛口径(最宽) | (总−在售)/总 | 含风险计入已处置侧 |
恒有 D ≤ C ≤ A ≤ B;B−A≈风险房源占比,A−D=名义去化水分(越大越危险)。
分母必须单独暴露,否则数值不可跨城比较。
实证(深圳,触目惊心)
| 项目 | A 净口径 | D 实际回笼 | 水分 |
|---|---|---|---|
| 翠湖大厦 | 100.0% | 11.4%(60/528) | 88.6pt(468 套是首次登记) |
| 乾成数创文化园 | 100.0% | 13.8%(202/1466) | 86.2pt |
| 圳发云谷大厦 | 100.0% | 15.0%(21/140) | 85.0pt |
| 云谷里 | 70.7% | 34.4%(278/808) | 36.3pt(另 415/808=51.4% 在建抵押) |
| 深铁熙府 | 100.0% | 0%(2080 套全安居房) | 100pt(不可变现) |
两条铁律(实测踩坑,勿犯)
or 0 参与计算
(万科麓山贵阳仅总套数 3540、or 0 后 D 被算成 0% 并误报"回笼严重不足")。
缺失项目的提示改为「数据缺失·须补充后再评」。可承载授信上限 = 有效可变现货值 × 回款率 90%;判断:实际授信额 ÷ 上限 ≤1 安全、 1~1.5 需追加担保、>1.5 不建议新增投放。(本表不含贷款余额,给的是可套用框架。)
落地脚本:build_credit_quant.py(工作区根),产出 4 Sheet:口径说明 / 项目级 /
六家汇总 / 结清触发点。每次改动后必须 openpyxl 回读实测审计再报完成。
完整 backlog(含已完成项与按价值排序的待办)已迁出至
references/待办清单.md,主文档按需查阅,避免陈旧清单与实战脱节。
references/待办清单.mdmodel: "lite" 变体继续(交互式 Agent 可用 lite 省钱;automation 的 modelId 仍须具体模型或 "default",见上文"lite"警告)。extract_<city>.py,数据统一放 output_cross/<city>_data/,结论放 output_cross/<city>/status.txt。✅ 2026-08-12 用户确认 + 本日补充:本五阶段 SOP + 四道红线作为此类检索的标准执行模式;其中 P2 工商穿透默认走财汇MCP(股权/对外投资)为强制步骤,不得跳过直接按企业名去官方库搜。⚠️ 财汇MCP 有概率失效——若不可用,必须降级到其他官方工商渠道完成穿透(首选 WorkBuddy 的 neodata 连接器,亦可用国家企业信用信息公示系统 / 天眼查 / 企查查 等),最终仍须产出「品牌 ↔ 备案法人映射表」,穿透动作本身不可省。
适用场景:检索锚点是「企业」而非「项目名」——用户给的是品牌方(如万科/鹏瑞)、开发商、合作方/股东,要反查其全部在售/在途房源。这是最易踩坑的一类,核心死局是 「品牌 / 开发商 / 合作方」名字 ≠ 官方备案主体 / 项目名。
sDeveloper)也常漏。query_enterprise_profile 企业档案 / query_enterprise_equity_and_investments 股权 / query_enterprise_business_and_bidding 对外投资)沿股东链找 项目公司 = 备案主体、合营/联营公司、区域平台。产出「品牌 ↔ 备案法人(项目公司) 映射表」。→ 这一步解决「按企业名搜不到」的死局,是整条 SOP 的胜负手。
caihui_mcp 不可用,立即按以下优先级降级,穿透动作一个都不能省:
[MCP·预警通] → 改用 [neodata] / [工商·公示系统] / [工商·天眼查] 等,并在交付物「数据来源说明」注明本次穿透实际所用渠道。certificate/list 全库翻页 + 本地过滤(关键词被忽略,必须兜底翻页);广州=fdcxmxxlb.ashx 的 sProjectName/sDeveloper 检索。产出官方证级(批准套数/面积/楼栋/监管账户),落盘绿底。sellSummaryList 是批准(供应)口径,与外网网签成交口径不可相减推库存;网签均价高于挂牌属结构/计价差异,不可直接读成「涨价」。[官方·筑房网/阳光家缘] / [外网·WebSearch],并声明供应/成交口径不可混用。zxyslplb.ashx 仅返最新 10 条且拒关键词 → 改 fdcxmxxlb.ashx 检索端点实拉 1116 套官方逐套;用官方图例(1可售/2已售/3已备案/4已过户/5不可售)纠正「已售」统计口径。collect_vanke_all.py(全库翻页+过滤+info)、build_vanke_consolidated.py(整合+红旗+全览)、probe_lushan.py / build_lushan.py。scripts/by_developer.py,支持 guiyang(完整内置,无需浏览器)/ guangzhou / shenzhen(薄封装调既有采集器)。P1(外网撒网)/ P2(工商穿透)仍由 AI 执行,其产出(品牌名 + 备案主体名列表)作为工厂输入。用法见文件头注释。
--organ 参数(fetch_house_data.py 不认 → 静默空跑),现改为注入 PERMITS 列表后调 fetch_house_data.main(),需 --sz-script 指向采集器 + --sz-permits 提供 {ysProjectId,preSellId,presell_no} 清单。scripts/validate.py 的 validate_permits 输出重复证号/批准套数缺失等报告(--no-validate 可关)。--mode project-summary --from-json <全量dump> --brand-key 万科 从本地全量证级 dump 生成「品牌在筑官方项目总表」(53 项目汇总 + 全量证级清单),无需联网;scripts/gen_vanke_guiyang_total.bat 为万科一键启动器。references/尽调报告模板.md,任何品牌/城市一键产出可采信底稿。🔗 跨 skill 整合(与集团交叉分析协同):本专项方法论解决的是「采集层」——按开发商/品牌拿去化底数。当用户目标是 「以项目去化佐证开发商集团信用风险 + 配 Word 综合分析报告」 时,须加载
developer-group-cross-analysisskill 走完整整合流程:它在采集层之上,再叠加 财汇MCP·企业预警通(集团工商/司法/评级/债券/担保)与 外网 WebSearch 交叉印证,最终产出 Excel(7Sheet)+Word(8章)+跨城看板 三件套,正面实现「以项目去化佐证集团分析」。两 skill 共用同一底层去化 JSON,避免口径分裂。
用户原话(2026-08-31):「后续的城市若缺失可参考楼盘样本,可以建议我启动实战案例,让我点名跑一个楼盘,不让你盲目抓取。盘点一下,我还没有给过实际楼盘的城市,我来帮你每个城市至少保有一个实战案例。」
城市级底表(全市销控 / 一房一价总表)由 AI 自主跑;但「具体楼盘」必须用户点名。
| 场景 | 允许 | 禁止 |
|---|---|---|
| 跑某城全市底表 / 补样本行 | ✅ 自主 | — |
| 决定「跑哪个盘」 | ❌ 不许 | 禁止 AI 自选楼盘开跑 |
| 提供候选清单请用户点名 | ✅ 必须 | — |
| 用户点名后深挖该盘 | ✅ 执行 | — |
违反后果:楼盘名五花八门(推广名≠备案名,见既有铁律),AI 自选极易跑错主体、抓成安商房/自持/非目标盘,白烧 token 且结论不可采信。
禁止说:「我去跑一下 XX 盘」「建议抓这几个盘」。 必须说:报缺口 + 给 3 个候选 + 请点名。格式:
【XX 城 · 缺实战案例】现状:C 级 24 条外网样本,无真逐套备案价。
建议启动实战案例。请从以下候选中点名 1 个(或你直接给盘名):
候选A · <盘名> | <区> | 外网均价 X 元/㎡ | 推荐理由:<在售/大体量/开发商有授信关联/…>
候选B · <盘名> | <区> | … | 推荐理由:…
候选C · <盘名> | <区> | … | 推荐理由:…
口径提示:该城为 C 级,官方无逐套价 → 本案例只能产出「外网参考价 + 官方销控/证级」,
价格须标 [外网·WebSearch],不可当成官方法定备案价。
候选挑选规则:① 来自该城已有样本表(自采,不新抓);② 尽量跨区、跨价位段;③ 优先在售/近 1–3 年取证(避免清盘老盘,去化失真);④ 避开安商房/自持/保障房;⑤ 注明「推广名 vs 备案名」若已知不同。
output_cross/ 或独立 run_<城>_<盘>/ 目录(参照 run_gz_pengrui/:尽调报告 md + 证级逐套 xlsx + 货值 xlsx + 重跑对比)。已有案例 15 城:深圳(卓越系 7 盘 + 山樾湾花园 + 晟悦家园 + 圳发云谷大厦 + 绿景/金地集团级)、广州(鹏瑞·壹湾广场)、佛山(保利中嘉花园 + 中粮珑湾祥云)、厦门(五缘公馆)、青岛(越秀天悦海湾)、成都(青江名邸)、合肥(文渊府 + 嘉宸雅园 + 汀云居,2026-08-31 点名制三盘·活销控)、廊坊(丁香园 + 狮子城 + 正雅馨苑,2026-08-31 点名制三盘·开盘公示快照型:无实时去化,出价格结构+全盘货值GDV)、南京(上城十号院 + 华曦璟园 + 鱼嘴润府平园,2026-08-31 点名制三盘·活销控·三盘合计在售50.4亿/全盘79.7亿)、武汉(黄金口三村 + 保利城四期 + 公园绿地2026-011,2026-08-31 点名制三盘·⚠️无销控状态仅价格结构+全盘货值)、重庆(力帆红星广场C10组团 + 盛豪·首港城 + 星悦·礼嘉天序,2026-08-31 点名制三盘·⚠️状态复合历史态去化近似)、西安(锦华颂 + 时光云境小区 + 云璞小区,2026-08-31 点名制三盘·⚠️无销控状态仅全盘货值·三盘合计20.8亿)、苏州(浅棠平江 + 海胥澜庭 + 江湾雅园,2026-08-31 点名制三盘·⚠️历史2019-2022·仅姑苏区高端·无销控状态·三盘合计47.2亿)、郑州(保利尚园 + 锦绣田苑 + 经开区瑞祥小区,2026-08-31 点名制三盘·⚠️仅备案单价无面积→货值N/A·状态全已售→去化无效)、北京(望坛新苑 + 御林湾苑 + 天汇银杏苑 + 都阙苑 + 商贸中心,2026-09-01 点名制代表盘·官方逐套可下钻子集·仅期房占全市1.2%·真实去化率+拟售均价)。
待补城市(按「数据可得性 × 业务价值」排优先级,用户点名即跑):
collect_dongguan.py 并确证 A 级(数据链 licenseList→querySalePrice→viewXxgs 全验证、公开无登录墙),其余 3 城参照合肥 /spf 套路建主档即可升 A(详见「跨城排查惊喜清单」章节)extract_wuxi.py)触发:合肥 www.hfzfzlw.com 根路径=租赁平台、误判无房价,实际 /spf 才是商品房平台跑通后,对 11 个 T5(C级) + 2 个放弃城市做「主管局官网→商品房/一房一价业务系统」定向排查。
方法(元级铁律):域名≠单系统,先开主管局官网取「重要业务系统」清单,别被根路径/外网兜底样本误导(合肥即典型)。
结论:
zjj.dg.gov.cn 首页「建设工程信息公示」→商品房预售/现售许可信息→「房价申报」;数据链 licenseList.action(楼栋级13511)→querySalePrice.action→viewXxgs.action 逐套一房一价表,server 直渲公开无登录墙=确证A;但全量爬取触发服务端 IP 级限流,限流冷却后须用温和模式(单线程+请求间隔,禁用12线程并发——高并发会重触发限流、把刚冷却的 IP 再打封)trickle 爬完;定向下钻只钻代表盘楼栋(collect_dongguan_units_targeted.py)几分钟搞定、免全量13511逐套10h再触限流)、惠州(zjj.huizhou.gov.cn「房产信息交易版」/ 综合监管平台 113.96.111.148:9087)、江门(房屋交易和产权管理信息平台 218.14.150.123:8085)。yueanju.zfcxjst.gd.gov.cn 死路)。建主档注意:福州/东莞为政府标准域名、纯网站可达概率高(类比合肥 /spf);惠州/江门为 IP:port 内网式直连,建主档前须先探活确认是否被外网拦截。
交付物:output_cross/跨城排查_惊喜清单_20260831.html(可视化矩阵 + 可抄作业官方入口);覆盖表 城市实战案例覆盖盘点_20260831.xlsx 已同步(4 城保真度→★、长沙→C⚠️、中山/肇庆→放弃(粤安居死路)、修正太原行原名误标)。
盘点表交付物:
output_cross/城市实战案例覆盖盘点_20260831.xlsx(36 城 × 有/缺 × 优先级 × 候选来源 × 口径红线)。每次补案后回写该文件,保持最新。
用户原话:「让你总结就是,写进 skill,以后不要再说了,你要时刻总结进 skill,随时的,动态的!!!记住!!!」
规则(强制):每次任务产出任何可复用的经验、口径、踩坑、方法论、脚本路径、数据结论,必须即时沉淀进本 skill(或跨 skill 的对应资产),不要只在对话里口头总结就让任务结束。具体要求:
references/cases/ 新建案例文件 + 案例库章节加条目 + 顶部变更说明加编号;~/.workbuddy/MEMORY.md(跨项目)与本项目 memory/MEMORY.md。datetime.now()(无旧时间残留);③ 章节口径前后一致无打架;④ 无旧项目关键字残留;⑤ 仅给用户最新版产物路径。任一项不达标 = 任务未完成。Skill 工具重新加载确认无语法/结构错误(如章节断裂、编号重复)。@skill real-estate-risk-analyst 开头显式加载本 skill(曾用名 real-estate-filing-query,已停用);@skill 加载,运行时才会读取最新 skill 文件。@skill real-estate-risk-analyst 开头 + 沿用最新版 + 6 Sheet 对齐校验。references/城市实跑案例库.md:跨城采集城市样本速查(2026-08-18 收官)——每个城市的官方平台入口 + 采集方式 + 已有实跑样本(15城实跑/4城新定性/6城受限),下次接到任一城市任务先查本库直接照跑;配套 Excel output_cross/跨城一房一价_城市实跑案例库_20260818.xlsx。references/real-estate-guide.md:完整技术参考(深圳平台已验证的列表/房源 API、字段映射表、状态取值、价格行为、脚本骨架函数、避坑清单、成都 infoDetail→roompricezjw 逐套采集方法、剩余货值测算、复制粘贴提示词)。PERMITS 列表遍历、compute_snapshot() 聚合快照、find_baseline() 取对比基准、detect_anomalies() 突变检测、add_comparison_sheet() / add_alert_sheet() / add_permit_sheet() / add_value_sheet() 生成各 Sheet。scripts/build_house_dashboard.py:交互看板通用生成器(2026-08-11)——python build_house_dashboard.py <Excel路径> [项目名] 一条命令出完整 HTML 看板(6 图表+KPI+质量校验+梯度回归+6 决策模块+四筛选+排序分页)。自动探测表头/动态列映射/动态状态配色/兼容两种剩余货值结构。晟悦家园/深润川已验证。scripts/build_cross_dashboard.py:跨城对比大屏(2026-08-11,少数综合场景用)——33 城覆盖能力综合展示,改 CITIES 数组即更新。scripts/validate.py:数据质量校验模块(2026-08-12,从看板下沉)——validate_houses(list) / validate_permits(list) 返回机读报告(重复房源、字段空值率、面积异常、单价 z-score、总价单价一致性、证号重复、批准套数/面积缺失)。工厂采集后自动调用。scripts/by_developer.py:按企业/品牌检索脚本工厂(2026-08-12)——把 SOP 的 P3+P4 固化为 CLI:guiyang 完整内置 REST 证级采集、guangzhou/shenzhen 薄封装调既有采集器、--mode project-summary 出品牌项目总表。详见文件头注释。scripts/gen_vanke_guiyang_total.bat:万科在筑 53 项目总表一键启动器(2026-08-12)。scripts/collect_shenzhen_all.py:深圳全市预售证全量采集器(2026-08-19,基本盘检索底数)——getYsfYsPublicity 翻页全量(pageSize=200,无过滤)+ 每页覆盖写断点续跑。实测 4,408 证/2,932 项目 → output_cross/shenzhen_data/shenzhen_presell_all.json。project/name 子串过滤),无需每次全量翻页。已落地:深圳 4,408 证(Playwright 页面内 fetch)、大连 1,623 项目(纯 POST)、青岛 13,695 证(纯 GET JSP)。⚠️ 推广名≠备案名:营销推广名常 0 命中("前海未来城"),检索须用备案名/开发商双线索。build_manifest.py:交付物总览清单生成器(2026-08-26 固化,工作区根目录)——扫描工作区全部交付物(剔除调试 HTML 如 yuehaitang_*/shanghai/*_body/lf_*),按 9 大类(A卓越金地绿景标杆 / B深圳专项 / C大湾区 / D新一线10城 / E跨城总览案例库 / F单项目专项 / G交互看板 / H官方PDF / Z其他)生成带可点击 file:// 超链接 + 说明 + 大小 + 日期的折叠 HTML(output_cross/交付物总览清单_<日期>.html)。新增任一份 Excel 后重跑即自动收录;清单自身已排除。⚠️ 前台 Bash 一旦报序列化故障,改派 Agent 跑此脚本(子 Agent 独立 Bash 通道可用)。*_主档.xlsx(5 Sheet:数据源说明/最新房源明细/逐日去化汇总/状态变更日志[单元级(楼栋,房号)状态diff]/预售许可证清单)+ 1 个固定名 *_去化趋势_最新.html,历史散落快照移入 *_归档_<日期>/(可恢复不删)。已落地项目:晟悦家园(616套/10日/13变更)、山樾湾花园(5003)、珑瀚公馆(366)、卓越缦悦(231)、珺奕府(891)、卓越前海未来城(595)、深润川实业(2126)——output/ 根目录从 ~44 散落快照收敛为 7 主档+7归档夹。merge_any_project_master.py:通用参数化融合器(2026-08-26,工作区根目录)——python merge_any_project_master.py <项目关键词> [展示名],自动归一化文件名(去日期/去「房源数据」「安居房适配」「存量项目」/繁简「公館」→「公馆」)做分组,兼容首行是标题行的文件(深润川),自动探测状态列/备案单价列/单元主键,生成主档+趋势+归档。幂等自愈:既扫 output/ 根目录也扫 *_归档_*/,且只移动仍驻根目录的源文件(归档中已有的跳过),故归档后重跑也能从归档重建主档。merge_all_scatter.py:批量融合运行器(2026-08-26)——一次性对 山樾湾花园/珑瀚公馆/卓越缦悦/珺奕府/卓越前海未来城/深润川实业 调 merge_any_project_master,并把遗留晟悦旧快照并入 晟悦家园_归档_*;新项目只需在 PROJECTS 列表加一行即可。merge_shengyue_master.py:晟悦家园专用融合器(逻辑同通用版,晟悦首创),保留作标杆参考。parse_date 必须只解析文件名(os.path.basename),不能用完整路径——否则会命中归档文件夹名里的日期(如 *_归档_20260826),导致所有快照被判为同一天、snaps[-1] 错取排序最后的残档(珑瀚曾因此主档变成 3 行而非 366 行)。通用版已修正。房产主档维护(防文件膨胀·全项目)(automation-1787726153078,每日 09:30,model=auto,幂等):依次跑 merge_all_scatter.py + merge_shengyue_master.py,覆盖全部 7 项目。去化率口径沿用本 skill 铁律(审慎=已备案/总;宽口径=(总-期房待售)/总,已售=0)。