# 采集说明（deyi_wuhan_zhuangxiu 数据集）

> 本说明描述数据集 `G:\one\reflesh\` 的采集范围、方法、字段字典、匿名化规则、复现步骤与已知限制。
> 上次更新时间：2026-09-18（小红书补采 v6 + 四次解析 + v6 剔除记录）

## 一、交付物清单

| 文件 | 内容 |
|---|---|
| `deyi_wuhan_zhuangxiu_samples_raw.csv` | 152 帖原始样本（标题/摘要/正文长度，匿名化） |
| `deyi_wuhan_zhuangxiu_samples_standard.csv` | 152 帖结构化字段（面积/区域/方式/价格标记） |
| `deyi_wuhan_zhuangxiu_price_items.csv` | 13 条已核验价格条目（11 帖） |
| `武汉装修行情采集报告_2025-2026.md` | 行情结论、缺失率、定性避坑、样本偏差与采数建议 |
| `武汉101平旧房装修_本地样本与精细预算_2026.md`、`...xlsx` | 上一会话交付的 101㎡ 专项预算（另案，非本数据集） |
| `wuhan_zhuangxiu_xhs.csv`（镜像 `deyi_wuhan_zhuangxiu_xhs.csv`） | 小红书 93 篇（首轮 40 + v4 补采 32 中的 29 + v5 补采 24 中的 15 + v6 补采 10 中的 9；另有 12 篇捕获异常 + v6 无正文捕获 1 篇剔除） |
| `wuhan_zhuangxiu_xhs_items.csv` | 小红书/公开源分项金额（259 行 / 48 来源；2026-09-16 并入 v5 批 14 来源 87 行，2026-09-18 并入 v6 批 7 来源 63 行） |
| `research_raw/xhs_parse_v3_summary.json` | 三批合并后的字段覆盖率/批次/年份分布 |
| `research_raw/xhs_capture_failures.json` | 12 篇捕获异常剔除清单（含理由、原始 URL） |
| `武汉装修细节补充_避坑与省钱_2026.md` | 对着 101㎡ 旧房的避坑与省钱 |
| `research_raw/xhs_notes_v4.jsonl` | v4 补采原始页（32 篇） |
| `research_raw/xhs_notes_v5.jsonl` | v5 补采原始页（24 篇） |
| `research_raw/xhs_notes_clean.jsonl` | 四批合并清洗结果（93 篇：正文/评论/金额/面积/性质） |
| `research_raw/xhs_item_prices.jsonl` | 机器抽取的分项金额（61 条） |
| `research_raw/xhs_comments.jsonl` | 评论抽出（68 篇有评论，其中 64 篇评论 ≥40 字） |
| `research_raw/public_supplements/` | 土巴兔/搜狐/网易等公开页 |

## 二、采集范围与时间

- **平台**：得意生活（www.deyi.com），板块：装修讨论（f42）、建材/家电市场（fid78）、设计/软装市场（fid936）。
- **样本窗口**：发帖日期 2025-01-09 ~ 2026-06-06（限定 2025-01-01 ~ 2026-08-11）。
- **样本量**：n=152（2025 年 139、2026 年 13），tid 无重复。
- **剔除记录**（不在 152 帖内）：
  - `thread-4461171`：提示信息页（无效页），无正文。
  - `thread-20000238`（2024-10-18）、`thread-19959909`（2024-04-12，迪生装饰促销帖）：发帖时间早于 2025-01-01，不在时间窗内。其中 19959909 含促销信息（1688 元抽奖/5000 元抵用券/1.5 折秒杀 18800 元礼包），因日期越界未纳入条目表，仅供定性参考。
  - `thread-20034137`：经核实为二手房挂牌页（光谷智慧城，已售），非装修帖，已剔除。

## 三、字段字典

### samples_raw.csv（8 列）
| 列 | 说明 |
|---|---|
| tid | 帖子 ID（数字字符串） |
| url | 帖子地址，格式 `https://www.deyi.com/thread-<tid>-1-1.html` |
| post_date | 发帖日期（YYYY-MM-DD） |
| crawl_date | 采集日期（2026-08-11） |
| source_board | 板块：装修讨论 / 建材/家电市场 / 设计/软装市场 |
| title | 帖子标题（匿名化） |
| summary | 主贴正文摘要（匿名化，正文>942 字时截断？——不截断，为全部主贴文本） |
| body_chars | 主贴正文字符数 |

### samples_standard.csv（16 列）
| 列 | 说明 |
|---|---|
| tid,url,post_date,crawl_date,source_board,title | 同 raw |
| area_m2 | 面积（㎡），仅 5 帖披露 |
| layout | 户型（本批 0 帖披露） |
| district | 区域（22 帖披露，如武昌/洪山/青山…） |
| deco_mode | 装修方式：翻新/局部改造/全屋定制/自装（30 帖） |
| deco_style | 装修风格（本批 0 帖披露） |
| price_type | 价格口径：合同/报价、推断、讨论/行情、广告/促销（仅价格帖） |
| total_yuan | 装修总价（元）：仅 20036577 = 63000（推断，去年 80㎡ 案例） |
| per_m2_yuan | 每平单价（元/㎡）：仅 20036577 = 700（合同/报价，出租房自住标准） |
| has_price_item | 是否含价格条目（0/1），11 帖为 1 |
| note | 备注（本批均为空） |

### price_items.csv（9 列）
| 列 | 说明 |
|---|---|
| tid,url,post_date | 同前 |
| item_kind | 条目类型：每平单价 / 面积+总价 / 总价 / 设计费/㎡ / 量房/上门费 / 量房促销 / 促销折扣 / 促销满减 / 促销满赠 / 单次服务价 |
| amount_yuan | 金额（元）；无精确数值的条目留空（如"设计费动辄几千一平"） |
| unit | 单位：元 / 元/㎡ / 元/次 / 元(满2000减200) 等 |
| item_name | 条目名称（含含/不含说明） |
| quote_type | 口径：**合同/报价**（商家对业主实际报价）、**推断**（案例推算）、**讨论/行情**（用户观察价，非成交）、**广告/促销**（商家促销，非成交） |
| context | 原文上下文（匿名化），保留原帖关键语句 |

## 四、口径与统计原则

1. **价格条目与装修总价严格分开**：`price_items.csv` 记录所有已核验条目；仅 `quote_type ∈ {合同/报价, 推断}` 且 `item_kind ∈ {面积+总价, 总价}` 的条目可进入"装修总价"统计。当前满足该条件仅 1 帖（20036577，63000 元），**因此不推算全市均价**。
2. **"500 到 2000 一个平方"已识别**：tid 20014353（2025-01-09）正文"从 500 一个平方到 2000 一个平方不等"已提取为 2 条每平单价（500/2000 元/㎡，讨论/行情口径），不属于成交价。
3. **缺失率口径**：缺失率 = 1 − 非空数/152，四舍五入保留 1 位小数；报告已标注 n。
4. **广告重复帖去重但不删**：全友年中大促 2025-05-30 与 2025-07-09 为重复发帖，两条均保留并互相标注；自流平/货架类同文案广告帖（15+/20+ 条）计入样本总数但无价格条目。

## 五、匿名化规则（生成时自动执行 + 交付前残留扫描）

- 手机号 `1[3-9]\d{9}`、座机 `0\d{2,3}-?\d{7,8}` → `[电话已隐去]`
- 邮箱 → `[邮箱已隐去]`；QQ/V 号 `(qq|Q|v|V)[:：]?\d{5,12}` → `[联系方式已隐去]`
- 微信号 `(微信|wx|WeChat|WX)[号]?[:：]?\w{4,19}` → `[微信已隐去]`
- 引用楼"XXX 发表于 YYYY-MM-DD"、"回复 XXX 的帖子" → `[引用]`（去除昵称）
- 门牌号 `\d{7,8}(?=栋|幢|号|室|单元)` → `[门牌已隐去]`
- 交付前用 `validate_deliverables.py` 第 7 节扫描残留（手机/微信/QQ/邮箱 4 类），当前全部通过。
- CSV 输出为 **UTF-8 无 BOM**，验证脚本拒绝带 BOM 文件。

## 六、复现步骤

前置：`research_raw/` 中保存了抓取页 HTML 与解析中间件（见下）。完整链路：

```
1. fetch_threads.ps1 / fetch_pages.py   → 抓取列表页与帖子页 (research_raw/*.html)
2. extract_text.py                      → HTML → 纯文本 (research_raw/*.txt)
3. parse_threads.ps1                    → 文本 → threads_parsed.jsonl (155 行, 含 3 条剔除)
4. (人工) extracted.json 构建           → 152 帖结构化 + 字段提取
5. extract_prices.py                    → 全正文金额/促销/量房线索扫描 → price_candidates.json
6. (人工) 逐条核验候选                  → 13 条确认为价格条目
7. patch_items.py                       → 已核验条目写入 extracted.json[].items
8. make_csv.ps1                         → 生成 3 个 CSV（匿名化、UTF-8 无 BOM）
9. validate_deliverables.py             → 独立验证（结构/日期/URL/口径/报告数字/匿名化）
```

关键脚本位于 `G:\one\reflesh\research_raw\`：`make_csv.ps1`、`extract_prices.py`、`patch_items.py`、`validate_deliverables.py`。

## 七、验证结果（2026-08-11 复跑）

```
验证项: 32 通过 / 0 失败
[OK] raw: 152 行 × 8 列，列数一致
[OK] std: 152 行 × 16 列，列数一致
[OK] itm: 13 行 × 9 列，列数一致
[OK] raw/std: tid 无重复且与 extracted.json 全量一致 (n=152)
[OK] price_items: 13 条条目，tid 均在样本内
[OK] raw/std: 日期全部在 2025-01-01 ~ 2026-08-11
[OK] 年度分布: 2025=139, 2026=13 (合计 152)
[OK] raw/std: URL 格式/一致性通过
[OK] price_items: quote_type 枚举合法(4类)、金额数值域通过
[OK] standard.has_price_item 与 price_items 完全对齐 (11 帖有价格条目)
[OK] 装修总价口径条目: 1 条 (tid=20036577) — 不足 n≥30，不得推算全市均价
[OK] 20036577 两条口径不同，'报价 700元/㎡' 与 '去年案例 63000元' 不混算
[OK] 报告包含 n=152 / 139 / 13 / 13条 / 11帖 / 缺失率 / 500 / 700 / 63,000 / 80 等关键数字
[OK] raw/std/itm: 匿名化残留扫描通过(手机/微信/QQ/邮箱)
```

## 八-附-1、小红书补采 v4（2026-08-14）

- 脚本：`research_raw/xhs_collect_v4.py`（登录 profile、跳过已采 id、标题打分优先清单/决算/水电/拆除、验证码即停、上限 32 篇）
- 二次解析：`research_raw/xhs_parse_v2.py`（找回被 `#` 截断的正文、抽出评论、标注业主/广告/工长）
- 公开页：`research_raw/fetch_public_prices.py` → `research_raw/public_supplements/`（9/9 成功）
- 限制同前：不绕过访问控制；Cookie 仅本机 profile；交付物已脱敏。

## 八-附-2、小红书补采 v5 与三次解析（2026-09-15/16）

- 脚本：`research_raw/xhs_collect_v5.py`（关键词补齐小户型/大户型/分区/主材分项/2025 时点共 23 组，上限 24 篇，节奏同 v4；新增捕获校验，见下）
- 采集窗口：2026-09-15 23:43 ~ 2026-09-16 00:39，实际新增 24 篇（`xhs_notes_v5.jsonl`）
- 三次解析：`research_raw/xhs_parse_v3.py`（合并 v3 40 + v4 32 + v5 24，note_id 去重；复用 v2 的正文/评论/金额口径）
  - 修复 1：卡片文本按「倒数第二段」取日期与点赞，兼容「标题自带竖线」（4 段变 5 段）与「缺作者」（3 段）的卡片
  - 修复 2：`N天前 / 昨天 / 前天` 等相对日期按各笔记自己的采集日折算为绝对日期（v5 批 32 条）
- 捕获异常剔除（`research_raw/xhs_capture_failures.json`，共 11 篇 + 误采 1 篇）：
  1. 误采推荐词块 1 篇：`6a2fadf6000000001702a9ef`（页面混入多个作者内容，无法归属）
  2. 详情页未打开、正文实为搜索结果/推荐流列表 9 篇：判据为标题之后连续出现 ≥3 组「日期行 + 点赞行」的卡片签名（v5 7 篇 + v4 2 篇）
  3. 点错卡片、正文属另一篇笔记 2 篇：`🔥110㎡挑战硬装10W…` 抓到「原木奶油风130平硬装11.6万」，`武汉128平半包7w…` 抓到「武汉124平半包5.8w」；判据为记录标题未出现在捕获页（无法归属）
- 结果：清洗后 **n=84**（v3 40 + v4 29 + v5 15，即三批原始 95 篇剔除 11 篇捕获异常）；有正文 71、有评论 64、有金额 53、有面积 57、有区域 20、有方式 52
- 分项并入：`research_raw/append_v5_items.py`（幂等）把 v5 批 14 个来源 / 87 行并入 `wuhan_zhuangxiu_xhs_items.csv`（109 → 196 行），帖内分项之和与帖称总额不一致者两行都保留并在备注注明差额
- 复现顺序：`xhs_collect_v5.py` → `xhs_parse_v3.py` → `append_v5_items.py`；采集脚本已内置同样的捕获校验（列表页 / 标题未出现即跳过），避免 v6 复发
- 独立验证：`research_raw/validate_xhs_deliverables.py`（35 项断言全过）——文件齐全、note_id 唯一、批次分布 40/29/15、CSV 表头/行数/镜像字节一致/UTF-8 带 BOM/LF 换行、12 篇剔除记录不在交付内、日期窗口、分项表 196 行 41 来源与金额口径（成交=单一数值，行情/广告=允许「A-B」区间）、匿名化残留按内容字段扫描并含覆盖度自检、报告/说明口径一致性
- 格式约定：小红书链 CSV = UTF-8 带 BOM + LF（`xhs_parse_v3.py` / `append_v5_items.py` 写）；得意链 CSV = UTF-8 无 BOM + CRLF（`make_csv.ps1` 写）；差异已在验证脚本中断言

## 八-附-3、小红书补采 v6 与四次解析（2026-09-18）

- 脚本：`research_raw/xhs_collect_v6.py`（Linux 版；22 组关键词，上限 24 篇）
  - 三项修复：① 搜索页会间歇性挂死 >90 秒，跳转改 `wait_until="commit"` + 重试
    （原版等 `domcontentloaded`，且登录自检无重试，整脚本会崩在第一句）；
    ② XHS 改版后详情页正文已无「发布于 / N 点赞」，日期与点赞只在列表卡片里
    （`标题 | 作者 | 08-21 | 22`），改为从卡片取并兼容相对时间（`4天前`/`昨天`），
    **日期窗口过滤才真正生效**；③ 点开前先用标题比对历史基线预跳过，省掉重复开页
    （实测一个关键词省 10 张卡、约 7 分钟），另加每关键词 8 次尝试上限
- 采集窗口：2026-09-18 09:02 ~ 09:56。**中途触发详情页滑块验证**（笔记 URL 302 到
  `/404?source=/404/sec_...`，页面提示「当前笔记暂时无法浏览」+「安全验证：拖动箭头完成拼图」），
  脚本检测到后立即整批停止（退出码 3）；当时搜索页仍正常，属详情级软限流。
  **不尝试解验证码**，与「不绕过访问控制」原则一致
- 结果：原始 10 篇 → 有效 **n=9**（另 2 篇剔除：`6612630e` 日期越界 2024-04-07、
  `6a8852fa` 无正文捕获），依据见 `research_raw/xhs_v6_exclusions.json`
- 分项并入：`research_raw/append_v6_items.py`（幂等）把 v6 批 7 个来源 / 63 行并入
  `wuhan_zhuangxiu_xhs_items.csv`（196 → 259 行）
- 四次解析：`research_raw/xhs_parse_v6.py`（合并 v3 40 + v4 29 + v5 15 + v6 9 = 93 篇；
  汇总 `research_raw/xhs_parse_v6_summary.json`）
  - 新增日期窗口守卫：`post_date < 2025-01-01` 的记录不入库并记入 v6 剔除清单
  - 未新增通用「切不出正文即异常」规则的原因：v3/v4 批次有 13 篇同样切不出正文，
    已被历史交付与验证脚本计入（批次分布 40/29/15 有断言），通用规则会静默改变历史口径；
    v6 的无正文捕获改由 `EXCLUDE_IDS` 定点剔除
- 复现顺序：`xhs_collect_v6.py` → `xhs_parse_v6.py` → `append_v6_items.py`
- 独立验证：`research_raw/validate_xhs_deliverables.py`（断言已同步至 v6 口径：
  批次分布 40/29/15/9、分项表 259 行 48 来源、v6 批 7 来源、剔除集合 13 篇）

## 八、已知限制

1. 帖子正文可能含图片表格中的价格（未 OCR，如 20036577 附件图），本数据集仅覆盖文字披露。
2. `summary` 为主贴全文；部分帖子有"回复可见"内容（如隐藏清单），未抓取到。
3. 得意生活部分板块需登录（得意家 app 已停运，20021980），2026 年样本偏少。
4. 价格条目上下文来自主贴与回帖文字，成交价未经合同/发票核验。
5. 缺失率高的字段（面积/户型/风格）依赖发帖人主动披露，无法补全。
6. 小红书批次新增：详情页捕获存在两类失败（列表页未打开详情、点错卡片导致正文属另一篇），已按判据剔除 11 篇并记录在 `xhs_capture_failures.json`；被剔除的篇目若需使用，须重新采集。
7. 小红书清单类笔记常把明细放在图片里（如 62 平半包 3 万、132 平自装），未 OCR，故金额字段只覆盖文字披露。
