返回 Skill 列表
extension
分类: 数据与分析无需 API Key

小红书账号拆解分析

小红书账号深度拆解技能。通过 Python 三级通道(免登录 HTTP → Playwright 持久化登录态 → 接管本机 Chrome/CDP)爬取小红书账号主页链接、短链、24 位用户 ID 或昵称,突破网页版访问受限,采集笔记、详情、评论与封面/视频素材,随后产出商业定位诊断、内容结构拆解、算法逻辑推演、竞品对标、爆款视频结构拆解与可落地运营 SOP。当用户提到"拆解/分析某个小红书账号""为什么这个账号能火""怎么复制这个账号""小红书竞品对标""小红书账号定位诊断",或给出小红书主页链接、xhslink 短链、小红书号并要求做深度分析时使用本技能。

person作者: user_f991d2c0hubcommunity

小红书账号深度拆解

给一个账号(链接 / 短链 / 24 位 ID / 昵称),返回数据 + 判断 + 可复制动作三层结果。

不是"内容不错建议持续输出"这种空话——每个结论都必须挂在具体数值上, 每条动作都要有频次和验收指标。

1. 何时使用

使用

  • 用户给出小红书主页链接、笔记链接、xhslink 短链、24 位用户 ID 或账号昵称,要求分析、拆解、对标
  • 用户问"这个账号为什么能火""怎么复制""值不值得投""变现模式健康吗"
  • 用户要做账号定位诊断、选题库搭建、脚本结构拆解、爆款分镜还原、运营 SOP 输出
  • 用户要求监控竞品账号、横向对比同赛道账号

不使用

  • 只写文案、起标题、改脚本,不需要真实数据 → 用 xiaohongshu-account-positioning
  • 只需关键词搜笔记、批量拿互动数据(不做深度拆解) → 用 xiaohongshu-search-tool-v4
  • 平台是抖音 / B 站 / 视频号 → 用 cn-social-media-search
  • 要求获取创作者后台、商业化后台、私信、粉丝名单等非公开数据 → 明确拒绝 (本技能的登录只用于读取公开笔记,不碰后台数据)

信息不足时的追问模板

需要确认三件事: 1)目标是具体账号(给我主页链接,最好带 xsec_token),还是某个赛道关键词? 2)重点看什么——商业价值 / 内容结构 / 爆款拆解 / 竞品对标? 3)交付物要 Markdown、HTML 报告、PDF、Word 还是 PPT?

不要自行编造链接、ID 或数据。 拿不到就走 §4 的降级流程或如实告知。

2. 环境准备(装完技能即自动就绪,通常无需手动干预)

cd <skill_dir>/scripts
python setup.py                    # 一键就绪:venv → pip 依赖 → Chromium → ffmpeg(尽力而为)
python setup.py --check            # 只自检,输出 JSON,不做任何安装
python setup.py --no-browser       # 跳过 Chromium(只要分析/渲染能力时)
python bootstrap.py                # 精简版自检,同样会打印【该用的 python 路径】

自动引导(关键设计):五个主脚本(xhs_crawl.py / xhs_login.py / xhs_analyze.py / xhs_report.py / xhs_pdf.py)在开工前都会先做环境自检 (xhs_env.ensure_ready()):

  • 环境齐全 → 立即返回,零开销;
  • 缺依赖 / 缺 Chromium → 自动调用 setup.py 补齐,然后继续原本的任务;
  • 依赖装在托管 venv、但当前用的是别的解释器 → 自动切换过去重跑, 避免"明明装了却 import 不到"。

所以用户不需要手工敲任何安装命令。纯分析/渲染脚本用 need_browser=False, 不会为了跑 xhs_analyze.py 去下载 430MB 的 Chromium。

依赖只装进 WorkBuddy 托管虚拟环境,不污染用户全局 Python: ~/.workbuddy/binaries/python/envs/default

装三样:playwright(浏览器通道)、curl_cffi(TLS 指纹)、pillow(关键帧拼版)。 Chromium 内核约 430MB,首次下载几分钟;慢网超时会提示"可能仍在下载", 重跑 python setup.py 断点续传即可(幂等,不会重复下载)。

ffmpeg 用于视频抽帧与关键帧拼版。缺失时封面与视频照常下载, 但无关键帧拼版,爆款分镜拆解会降级为「仅封面 + 文本」分析。 按以下顺序自动查找,命中任一即可:

  1. 系统 PATH 上的 ffmpeg(Windows winget install Gyan.FFmpeg / macOS brew install ffmpeg
  2. npm 包 ffmpeg-static 的二进制 —— python setup.py --with-ffmpeg 可自动装到托管 workspace(~/.workbuddy/binaries/node/workspace),不需要改系统 PATH
  3. 技能自带 .runtime/bin/ffmpeg

下载源(国内必看):Chromium 默认走 npmmirror 镜像 —— 官方 CDN 实测只有约 1MB/分钟(114MB 要下两个多小时),镜像实测 40 秒完成。需要换回官方源时:

# Windows
set PLAYWRIGHT_DOWNLOAD_HOST=https://playwright.azureedge.net
python setup.py
# macOS / Linux
PLAYWRIGHT_DOWNLOAD_HOST=https://playwright.azureedge.net python setup.py

ffmpeg-static 同理:官方 npm 源超时后会自动回退到 npmmirror,无需手工干预。

⚠️ playwright 随 chromium 下载的 ffmpeg 是只有编码器的裁剪版(无解码器、无 select/tile/fps 滤镜),读不了 mp4,脚本已显式排除,不会误判为可用。

3. 标准工作流

⓪ 扫码登录(门禁)→ ① 环境自检 → ② 解析目标 → ③ 全量爬取 → ④ 素材处理
                  → ⑤ 指标计算(含图文/视频占比)→ ⑥ 深度分析(六维)→ ⑦ 渲染交付

步骤 ⓪ — 登录门禁(每次强制全新登录,无免登录通道

规则只有两条,都是硬约束:

  1. 每次运行都先清空,再重新登录 —— 不留任何历史登录记录;
  2. 不存在免登录路径 —— 列表页 user_posted 接口的 noteId 只有登录态才下发, 免登录 SSR 里的 noteId 恒为空串,既抓不到全量也补不了详情。

每次运行的实际行为:

  1. 清空 .runtime/ 下的全部登录痕迹(reset_runtime()): storage_state.jsoncookies.jsoncache/browser_profile/
  2. 弹出有头浏览器窗口,等用户用小红书 App 扫码(--login qr,默认) 或手机号+短信验证码(--login web);
  3. 登录成功后复用同一个会话继续抓取,不会二次开窗;
  4. 本次任务结束后登录态不再保留 —— 下次运行会再清一遍、再要求扫码。

单独登录 / 清理的命令:

python xhs_login.py                 # 默认 App 扫码(同样会先清空旧登录态)
python xhs_login.py --mode web      # 手机号 + 短信验证码
python xhs_login.py --reset         # 只清空登录态与缓存,不登录
python xhs_login.py --check         # 只检查当前是否存在登录态文件

⚠️ 不要用任何方式绕过门禁:没有 --no-login,也不要试图复用上次的 storage_state.json —— 代码层面每次都会先删掉它们。 扫码等待默认 10 分钟(--login-timeout),超时会中止并给出处置建议。 用户在窗口里完成扫码的过程不需要 Agent 干预,等着即可。

⚠️ Windows 上若之前的浏览器窗口没关干净,browser_profile/ 会被占用而删不掉; 脚本会打印警告并继续(登录凭证 storage_state / cookies.json 已删除, 仍然必须重新登录)。遇到这种情况,关掉残留的 Chromium 窗口即可。

步骤 ①②③④ — 一步完成(默认全量)

cd <skill_dir>/scripts
python xhs_crawl.py --target "<链接|短链|24位ID|昵称>" \
    --out "E:/xhs_case/<账号名>" --media

默认全量抓取--limit 0(滚动到主页底部取全部笔记)、 --detail-top 0(全部笔记都抓详情+评论)。首次运行会先弹浏览器扫码。

常用参数:

| 参数 | 默认 | 说明 | |---|---|---| | --target | 必填 | 主页链接 / 短链 / 24 位 ID / 昵称 | | --out | ./xhs_out | 输出目录 | | --limit | 0 | 抓取笔记条数;0 = 全量(滚到底),填 N 则取前 N 条 | | --detail-top | 0 | 抓「详情+评论」的笔记数(按点赞排序);0 = 全部 | | --comments | 100 | 每篇评论上限 | | --media | 关 | 下载封面 + 视频 + 抽帧 | | --media-top | 8 | 下载素材的笔记数 | | --login | qr | 登录方式:qr=App 扫码 / web=手机号+验证码(每次都会重新登录) | | --login-timeout | 600 | 等待扫码/验证码完成的秒数 | | --max-scroll-rounds | 400 | 全量滚动轮次上限,防异常页面无限滚动 | | --tier | auto | auto|persistent|cdp|http(三个通道都要求已登录) | | --headless | 关 | 无效:需要登录时会自动强制改为有头(要扫码) |

时间预期:全量详情按每篇 6-10 秒估算,100 篇约 13-17 分钟;脚本会持续打印进度, 中途 Ctrl+C 中断已抓部分仍然有效。笔记数 > 150 的大号,可先用 --detail-top 50 跑一版,确认方向后再补全量。

限流保护:粉丝量大的账号把 --detail-top 压到 30-50,降低风控概率; 全量滚动本身已按 1.5-3.5 秒限速,不会高频请求。

素材下载仍限量--media 默认只下载点赞最高的 8 条(--media-top)—— 视频+抽帧体积大,全量下载既慢又没必要。这是有意设计,不是漏抓; 爆款拆解只需覆盖头部笔记。

步骤 ⑤ — 指标计算

python xhs_analyze.py --dataset "<out>/dataset.json"

产出 analysis.json(全部结论的数据源)+ notes_metrics.csv(Excel 可直接打开)。

其中的 formats 段是图片/视频占比的唯一口径,直接引用,不要自己重算:

| 字段 | 含义 | |---|---| | total_notes | 参与统计的笔记总条数(全量抓取时即账号全部笔记) | | video_count / image_count | 视频笔记条数 / 图文笔记条数 | | video_rate / image_rate | 视频占比 / 图文占比(两者相加 = 100%) | | mix_label | 现成结论句,例:视频 48 条(40%) · 图文 72 条(60%) | | format_mix[] | 每种形式的 条数/占比/中位赞/中位收藏/中位评论/代表笔记 | | images_per_note | 图文笔记的篇均图片数 | | duration_sec | 视频时长中位/均值/区间 | | winner_format | 按中位赞判定的占优形式(video / image) |

步骤 ⑥ — 深度分析(本技能的核心价值,必须由 Agent 完成)

先读素材,再写结论。 按顺序:

  1. Read <out>/analysis.json — 拿到全部量化事实
  2. 先看 meta.full_crawl / meta.detail_all — 确认本次是全量还是抽样, 决定占比结论能不能说"该账号全部笔记"
  3. Read <out>/media/media_index.json — 看有哪些素材就绪
  4. 逐张 Read media/<id>/sheet.jpg(关键帧拼版)与 cover.jpg — 爆款拆解的唯一可信依据
  5. raw/notes/<id>.json 取 TOP 笔记完整正文,做正文骨架标注
  6. 按需读参考文档:

| 文档 | 何时读 | |---|---| | references/analysis-framework.md | 做商业定位、内容结构、算法推演、竞品对标前必读 | | references/viral-blueprint.md | 做爆款视频 / 图文结构拆解前必读 | | references/sop-templates.md | 输出 SOP 与执行排期前读 | | references/crawl-playbook.md | 抓取失败、受限、要扩展字段时读 |

按六维输出,写进 <out>/narrative.md

先复制骨架cp <skill_dir>/assets/narrative_template.md <out>/narrative.md (模板已内置占比必填块、证据引用位、分镜表格与交付前自检清单, 照着填不会漏项——不要从空白文件开始写。)

  1. 商业定位诊断 — 变现模式、健康度、天花板(结合 monetization.*
  2. 内容结构拆解 — 选题库结构、标题公式、正文骨架、视觉模板(结合 content.*并必须写明图片/视频占比(见下方硬要求)
  3. 算法逻辑推演 — 流量层级跃迁、标签精准度、赛道拥挤度(结合 tier.* / engagement.*
  4. 竞品对标分析 — 至少抓 2-3 个同赛道账号横向对比,给出差异化突围路径
  5. 爆款结构拆解 — 逐镜还原前 3 秒钩子、分镜表、运镜剪辑节奏、封面规律
  6. SOP 化输出 — 选题库 / 生产流程 / 复盘表 / 30 天排期,每条带频次与验收指标

narrative.md 用二级标题分区;标题里含「爆款 / 分镜」「SOP」「排期」关键字的段落 会被 xhs_report.py 自动归位到 HTML 对应章节。

图片 / 视频占比(硬性必报)

narrative.md 与交付报告里必须出现形式占比,三件事缺一不可:

  1. 绝对数与百分比视频 48 条(40%) · 图文 72 条(60%) —— 直接引用 analysis.json → formats.mix_label,不要自己按抽样重算;
  2. 口径说明:标明"基于本次抓取的全部 N 条笔记"(formats.total_notes)。 若因限流/中断只抓到部分,必须写"样本 N 条(非全量)",不允许把抽样说成全量;
  3. 占比背后的判断:哪种形式的中位赞更高(winner_format + 两种形式的中位赞)、 账号是在往视频迁移还是坚守图文(结合 cadence 的发布时间看趋势)、 这个比例对该赛道是否健康。

报告渲染器已自动在「形式与节奏」章节输出占比卡片、占比条与明细表, 并在结论速览里加了一行 —— Agent 要做的只是在叙事里引用并解读这组数字。 若抓取被中断导致数据不全,在报告开头显著位置注明样本条数与口径。

步骤 ⑦ — 渲染交付

python xhs_report.py --analysis "<out>/analysis.json" --dataset "<out>/dataset.json" \
    --narrative "<out>/narrative.md" --format both

产出 report.md(数据完整 + 叙事)与 report.html(自包含单页,内联 SVG 图表,无外网依赖)。

其他交付格式(按用户在步骤 0 指定的需求):

| 需求 | 做法 | |---|---| | PDF / 打印归档 | python xhs_pdf.py --dir <out>report.pdf(A4 竖版、页眉页脚页码) | | Word / .docx | 拿 report.md 调用 tencent-docx 技能转换 | | PPT / .pptx | 拿 report.md 调用 tencent-pptx 技能生成汇报稿 | | 纯表格 | 直接交付 notes_metrics.csv | | 在线分享 | 交付 report.html,或用「发布为应用」技能部署 |

xhs_pdf.py 要点(已内置,不用再处理):

  • 强制浅色配色变量(emulate_media(color_scheme=light)),夜间系统主题也不会印出黑底;
  • 本地图片自动转 file:// URL、关懒加载、压到 440px(Chromium 嵌图是「解码→Flate 原始位图」而非 JPEG 直通,体积只由像素尺寸决定);
  • .panel 不设 break-inside:avoid(长面板整体推页会留大片空白),只保护 card/figure/表格行;
  • Markdown 输入(--md)会自动套用报告模板样式表。

最后用 present_files 打开产物,优先展示 report.html;用户要 PDF 时把 report.pdf 一并列入。

4. 访问受限与三级降级

--tier auto 默认顺序 persistent → cdp → http,失败自动切下一个。 http 排在最后:它只能拿 SSR 首页那几十条且没有 noteId,不足以满足全量抓取。

| 通道 | 原理 | 适用 | 失败原因 | |---|---|---|---| | persistent | Playwright 持久化 profile,每次运行前清空后重新扫码 | 主力通道,全量抓取唯一可靠来源 | 未登录 / 撞登录墙 | | cdp | 接管用户手动启动的 Chrome 调试端口,用真实登录态 | persistent 被风控时 | 用户未开调试端口 | | http | curl_cffi 真实 TLS 指纹 + 解析 SSR __INITIAL_STATE__带本次登录的 Cookie | 兜底补详情页(视频流地址/收藏评论数最全) | 缺 xsec_token、登录墙;未登录直接跳过 |

人工过验证流程(滑块 / 短信验证必须由用户完成,脚本不破解验证码):

python xhs_browser.py open 9222            # 启动带调试端口的浏览器
#   在弹出的窗口里登录小红书,手动过一次验证
python xhs_crawl.py --target "<链接>" --tier cdp --cdp-port 9222 --out ./out

xsec_token 失效(表现为主页列表为空 / 跳回发现页):token 是一次性短时效凭证, 让用户现复制现用,或改用 --target "昵称" 走搜索页重新获取。

数据边界速查(实测,2026-09)

| 数据 | 带登录 Cookie 的 SSR | 登录态浏览器 | 说明 | |---|---|---|---| | 主页列表(标题/点赞/封面) | ⚠️ 仅首页几十条 | ✅ 全量 | SSR 是 camelCase,接口是 snake_case | | 列表里的 noteId | ❌ 恒为空串 | ✅ 接口拦截 | 卡片是水合后客户端渲染,SSR HTML 全文搜不到 24 位 ID;noteId 只能来自登录态的 user_posted 接口响应(存在 raw/api/)——这正是免登录抓不到全量的根因 | | 详情页(desc/标签/收藏/评论/分享) | ✅ 最全 | ⚠️ SSR 被移除,只能 DOM | 方向相反:详情页 SSR 反而完整,所以补详情优先走 SSR | | 视频流地址 | ✅ 详情 SSR note.video.media.stream.h264[0] | ⚠️ 懒加载,DOM 常拿不到 | 优先 backupUrls(无签名长期有效),masterUrl 带 sign/t 会过期;mediaV2JSON 字符串需二次解析;capa.duration 单位是 | | 评论原文 | ❌ | ✅ 滚动触发接口 | SSR 不下发评论 | | 置顶笔记的详情 | ⚠️ 可能被登录墙拦截(noteDetailMap 为空) | ✅ | 10 万赞置顶实测拿不到 SSR 详情,属平台策略 |

表格里的「SSR」指携带本次登录 Cookie 的请求,不是免登录匿名访问。 免登录匿名 SSR 只能拿到首页几十条且无 noteId,本技能不使用该路径。

数据损坏恢复路径dataset.json 被覆盖/损坏时,raw/api/user_posted_*.json 里存有 带 note_id 的完整接口原始响应,用 xhs_crawl.normalize_note() 逐条重建即可;详情用 HttpChannel.fetch_note_detail()(带本次登录 Cookie)补齐。 注意:登录态每次运行都会清空,跨次恢复只能复用 raw/ 里的原始数据,不能复用登录凭证。

更多风控信号与处置见 references/crawl-playbook.md §4。

5. 分析质量要求(硬性)

  • 每条结论必须能追溯到 analysis.json 的具体字段,禁止凭印象下判断
  • 至少引用 3 条具体笔记(标题 + 数据)作为证据
  • 必须写明图片/视频占比:引用 formats.mix_label,标注基于 formats.total_notes 条; 只抓到部分时写"样本 N 条(非全量)"
  • 爆款拆解必须基于 sheet.jpg 逐镜分析,不允许只看标题就编"钩子很强"
  • 禁止输出"持续优化""提升内容质量""加强互动"这类无信息量的表述
  • 差距清单按「影响面 × 实施难度」排序,第一周就能落地的动作排最前
  • 交付前跑 references/analysis-framework.md §7 的自检清单

6. 反模式

| 错误做法 | 后果 | 正确做法 | |---|---|---| | 不读 sheet.jpg 就写分镜拆解 | 编造内容 | 先 Read 素材再写 | | 把 /explore/ 笔记链接当主页传给 --target | 解析失败 | 用 /user/profile/ 主页链接 | | --limit 拉到 200、--detail-top 拉到 50 | 触发限流 | 分别控制在 50 / 12 以内 | | 用 requests 直连 edith API 想省事 | 缺 x-s 签名必失败 | 走浏览器通道监听响应 | | 把 "1.2万" 当数字参与计算 | 指标全错 | 一律过 human_num() | | 分析结论不引用数值 | 不可信 | 每个判断挂证据 | | 用本技能分析抖音 / B 站链接 | 无结果 | 换 cn-social-media-search | | 想跳过扫码、复用上次登录态 | 门禁会先清空 .runtime/,复用必然失败 | 每次重新扫码;想彻底清一遍用 xhs_login.py --reset | | 用户还没扫就判定"登录超时",提前放弃 | 白跑一趟 | 等满 --login-timeout(默认 600 秒)| | 用 --limit 30 抓 30 条就说"该账号共 30 条笔记" | 结论失真 | 默认全量;只抓到部分必须注明"样本 N 条" | | 报告里不写图片 / 视频占比 | 交付不完整,用户还要回头问 | 引用 formats.mix_label 并给出解读 | | 全量详情跑到一半 Ctrl+C,却按全量口径写结论 | 占比与中位数的分母错了 | 看 meta.full_crawl / meta.detail_all,按实际样本写 |

7. 合规边界

  • 只采集公开可见内容。登录仅为获取公开笔记的完整数据 (列表 noteId、详情、评论),不碰:创作者后台 / 商业化后台 / 蒲公英数据 / 私信 / 粉丝名单 / 手机号 / 真实身份
  • 登录态不长期保存:每次运行前清空,任务结束即失效,不跨任务复用、不随技能分发
  • 不采集手机号 / 微信 / 真实身份;评论只保留昵称与内容
  • 不做任何写操作(点赞 / 评论 / 关注 / 私信 / 发布)
  • 不破解、不绕过验证码;需要人工验证时交由用户完成
  • 控制访问频率,避免对平台造成压力
  • 产出物限内部分析使用,不得批量分发原始数据或用于违法用途

8. 文件说明

scripts/
  setup.py         一键环境准备(venv → pip → Chromium → ffmpeg),幂等
  xhs_env.py       运行前自检 + 自动引导:缺环境就自动跑 setup.py 再继续
  bootstrap.py     精简版环境自检与依赖安装
  xhs_common.py    路径 / 日志 / 限速 / 数字解析
  xhs_browser.py   浏览器会话、反自动化指纹、CDP 接管
  xhs_login.py     扫码 / 验证码登录(默认 App 扫码);`--reset` 只清理不登录
  xhs_resolve.py   链接 / 短链 / ID / 昵称 → uid + xsec_token
  xhs_crawl.py     爬取主程序(三级通道 + 响应拦截,默认全量)
  xhs_media.py     封面 / 视频下载 + 场景抽帧 + 关键帧拼版
  xhs_analyze.py   指标计算与六维评分(含图文/视频占比)
  xhs_report.py    Markdown / HTML 报告渲染
  xhs_pdf.py       PDF 导出(A4 分页控制、页眉页脚、图片压缩)
references/        分析框架、爆款拆解手册、SOP 模板、抓取对抗手册
assets/
  report_template.html   HTML 报告模板
  narrative_template.md  叙事稿骨架(六维 + 占比必填块 + 自检清单)

9. 登录与清理

抓取时会自动弹窗,直接扫码即可(也可点窗口里的「手机号登录」改用短信验证码)。 需要手动操作时:

python xhs_login.py                 # App 扫码(会先清空旧登录态)
python xhs_login.py --mode web      # 手机号 + 短信验证码(不用掏手机)
python xhs_login.py --reset         # 只清空登录态与缓存,不登录
python xhs_login.py --check         # 只检查当前是否存在登录态文件
python xhs_browser.py check         # 同上,另一套入口

登录过程中产生的临时文件都在技能目录 .runtime/storage_state.jsoncookies.jsoncache/browser_profile/),仅本机使用:

  • 每次运行前会被自动清空xhs_common.reset_runtime()),不跨任务保留;
  • 打包分发时已排除该目录,不会随技能包带走。