# Xiaohongshu Crawler

> 小红书作品爬取工具。根据关键词爬取小红书热门作品数据，支持按日期范围、排序方式筛选，结果以结构化表格展示。当用户需要爬取小红书作品、查询小红书热门内容、搜索小红书爆款笔记时使用。触发词：小红书爬取、小红书作品、小红书爆款、小红书搜索、小红书热门、小红书笔记查询。

- Skill: `redfox-data/xiaohongshu-crawler` (Agent Skill, multi-file: 6 files)
- Install (CLI): `npx skillmds add redfox-data/xiaohongshu-crawler`
- Raw SKILL.md: https://api.skillmd.com/api/skills/redfox-data/xiaohongshu-crawler/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: redfox-data (https://skillmd.com/u/redfox-data)
- Updated: 2026-09-09
- Page: https://skillmd.com/skills/redfox-data/xiaohongshu-crawler

---


# 小红书作品爬取

## 📝 简介

根据关键词爬取小红书热门作品，支持按日期范围筛选和多种排序方式（相关性、最新、最热），返回笔记标题、作者、互动数据等，结果以结构化表格展示。

## ✨ 功能特性

| 功能模块 | 能力描述 | 核心价值 |
|---------|---------|---------|
| 作品爬取 | 关键词搜索小红书作品 | 精准发现高热度内容 |
| 日期筛选 | 支持按日期范围筛选 | 定位特定时间段的热门内容 |
| 多种排序 | 相关性/最新/最热三种排序 | 灵活满足不同筛选需求 |
| 互动数据 | 返回收藏、分享、评论、点赞等 | 全面评估作品热度 |
| 报告导出 | CSV（Excel兼容）+ HTML可视化报告 | 本地离线查看与分享 |

## 🔑 鉴权

- 获取 API Key：前往 [红狐hub](https://redfox.hk/settings/api-keys?source=github)
- 配置方式1：写入 `~/.openclaw/openclaw.json` → `{ "env": { "REDFOX_API_KEY": "ak_xxxx..." } }`
- 配置方式2：终端执行 `export REDFOX_API_KEY="ak_xxxx..."`

## ⚙️ 工作流程

### Step 1: 🔍 用户意图理解

从用户输入中提取以下参数：

| 参数 | 提取规则 | 默认值 |
|------|---------|--------|
| keyword | 用户提到的搜索关键词 | 空字符串 `""` |
| startDate | 起始日期，解析为 `YYYY-MM-DD` | 30天前（脚本自动计算） |
| endDate | 结束日期，解析为 `YYYY-MM-DD` | 今天（脚本自动计算） |
| sortType | 排序方式，见下表 | `"_0"` |

**sortType 枚举：**

| 值 | 含义 | 触发词 |
|----|------|--------|
| `_0` | 相关性排序（默认） | 默认排序、综合排序、相关 |
| `_2` | 最新（按发布时间排序） | 最新、 newest、按时间 |
| `_4` | 最热（按互动数排序） | 最热、最火、hottest、按热度 |

**时间解析规则：**

| 用户输入 | 解析方式 | 示例 |
|---------|---------|------|
| 绝对日期 | 解析为 `YYYY-MM-DD` | `6月1号` → `2026-06-01` |
| 相对日期 | 基于当前日期计算 | `最近7天` → start=7天前, end=今天 |
| 日期范围 | 分别解析为 startDate/endDate | `5月30日到6月2日` |
| 未提供时间 | **不传** `--start-date`/`--end-date`，脚本默认查最近30天 | 不传参数 |

### Step 1.5: 🧠 关键词类型判断（⚠️ 调用脚本前必须执行）

**核心规则：泛化词必须先询问再查询，具体词直接查询。**

**关键词分类：**

| 类型 | 特征 | 处理方式 |
|------|------|----------|
| 空关键词 | 用户未提供关键词（如「最近热门笔记」） | 直接查询全站热门，keyword 传 `""` |
| 细分词 | 含具体场景/属性/人群修饰（如「减脂餐」「小个子穿搭」「生酮饮食」） | 直接调用脚本 |
| 泛化词 | 纯大类词，无修饰成分（如「美食」「穿搭」「美妆」） | **必须先推荐细分词，等待用户回复后再查询** |

**泛化词处理流程（⚠️ 禁止直接调用脚本！）：**

**第一步：生成 10 个细分词推荐**

生成原则：
- 词的大小适中，避免过细（查不到数据）或过泛
- 必须覆盖不同场景：趋势词、人群词、场景词、意图词各 2-3 个

输出示例：

> 我识别到「美食」是较大的分类，推荐以下细分方向：
> 家常菜、烘焙甜点、减脂餐、早餐、宵夜、地方菜系、懒人食谱、宝宝辅食、火锅、咖啡饮品
> 回复「拓展」将同时搜索这 10 个词，回复「不拓展」将继续搜索「美食」

**第二步：等待用户回复（禁止在同一次对话中继续执行脚本）**

- 用户回复「拓展」 → 调用脚本搜索 10 个细分词（逗号分隔）
- 用户回复「不拓展」 → 调用脚本搜索原关键词

### Step 2: 📡 调用脚本

```bash
# 基础调用（仅关键词，日期默认最近30天，排序默认相关性）
python3 ~/.qoderwork/skills/xiaohongshu-crawler/scripts/crawl_xhs.py "<关键词>"

# 完整参数（仅传入非空的时间/排序参数）
python3 ~/.qoderwork/skills/xiaohongshu-crawler/scripts/crawl_xhs.py "<关键词>" --start-date <startDate> --end-date <endDate> --sort-type <_0|_2|_4>
```

脚本返回 JSON，包含 `articles` 数组、`total` 总数，以及以下辅助字段：

| 字段 | 类型 | 说明 |
|------|------|------|
| `articles` | 数组 | 作品数据（主要展示内容） |
| `relatedSearches` | 数组 | 相关搜索词推荐 |
| `latestHotArticles` | 数组 | 近期热门笔记推荐（辅助内容，默认展示 10 条） |
| `hotTopics` | 数组 | 热门话题标签（仅供参考，不在对话中展示） |

每条作品字段（脚本内部字段 ↔ 接口原始字段）：

| 脚本字段 | 接口原始字段 | 说明 |
|-------------|---------------|------|
| `title` | `title` | 笔记标题 |
| `author` | `authorNickname` | 作者昵称 |
| `collect_count` | `collectedCount` | 收藏数 |
| `share_count` | `sharedCount` | 分享数 |
| `comment_count` | `commentsCount` | 评论数 |
| `like_count` | `likedCount` | 点赞数 |
| `publish_time` | `createTime` | 发布时间 |
| `work_url` | `shareInfoLink` | 作品链接 |
| `cover` | `cover` | 封面图 URL |
| `desc` | `desc` | 笔记描述/话题标签 |
| `author_fans` | `authorFans` | 作者粉丝数 |
| `interactive_count` | `interactiveCount` | 互动总数 |
| `work_id` | `id` | 作品 ID |

### Step 3: 📊 结果展示

**⚠️ 总数校验**：展示的 N 必须取自 `articles` 数组长度，禁止人工计数。
**⚠️ 强制输出规则**：直接读取脚本返回的 JSON 数据，按对应策略输出，禁止添加额外分析或建议。

#### 情况 A：articles ≥ 20

**A1.** 输出查询范围：

> 📊 关键词「**XXX**」共爬取到 **N 条**小红书作品，以下是详细数据：

**A2.** 输出风控提示（紧跟 A1 之后、表格之前）：

> ！！！受小红书风控规则限制，部分作品链接可能无法正常跳转，您可复制对应作品标题前往小红书搜索查看，感谢理解🙇‍♀️🙇‍♀️

**A3.** 展示前 20 条表格：

```markdown
| # | 笔记标题 | 作者 | 收藏 | 分享 | 评论 | 点赞 | 发布时间 |
|---|---------|------|------|------|------|------|----------|
| 1 | [标题](work_url) | 作者名 | 1.2w | 3.5w | 8000 | 5.6w | 06-02 19:55 |
```

**A4.** 提示剩余数据：

> 以上展示了前 20 条数据，还剩 **M 条**未展示。回复「查看全部」展开剩余数据。

**A5.** 推荐细分赛道（基于当前关键词生成 10 个相关细分方向词）：

> 如需深入探索某个细分方向，可以从以下关键词中选择：
> {细分词1}、{细分词2}、...、{细分词10}
> 回复具体关键词，我将为您查询。

#### 情况 B：0 < articles < 20

**B1.** 输出查询范围 + 数据较少提示：

> 📊 关键词「**XXX**」共爬取到 **N 条**小红书作品。
> 💡 当前关键词在该时间段结果较少，您可以尝试更换更短的关键词或扩大时间范围。

**B2.** 输出风控提示：

> ！！！受小红书风控规则限制，部分作品链接可能无法正常跳转，您可复制对应作品标题前往小红书搜索查看，感谢理解🙇‍♀️🙇‍♀️

**B3.** 展示全部表格（同 A3 格式）。

**B4.** 推荐细分赛道（同 A5）。

#### 情况 C：articles = 0

> 😔 抱歉，未找到与「**XXX**」相关的小红书作品，请尝试更换关键词或调整时间范围。

**C1.** 推荐搜索词（从 `relatedSearches` 字段提取，以加粗形式展示）：

> **🔍 推荐搜索词**：词1、词2、词3...

> ⚠️ 若 `relatedSearches` 为空则不展示此条。

**C2.** 推荐热门笔记（从 `latestHotArticles` 字段取前 10 条，表格不含评分字段）：

> 💡 我们为您推荐了近期的热门笔记供参考：

```markdown
| # | 笔记标题 | 作者 | 收藏 | 分享 | 评论 | 点赞 | 发布时间 |
|---|---------|------|------|------|------|------|----------|
| 1 | [标题](work_url) | 作者名 | 1.2w | 3.5w | 8000 | 5.6w | 06-02 19:55 |
```

> ⚠️ 若 `latestHotArticles` 为空则不展示此块。

**C3.** 推荐热门赛道（从 `hotTopics` 字段提取；若为空则使用以下默认列表）：

> 📈 您还可以尝试搜索以下热门赛道：
> 穿搭、美食、彩妆、影视、职场、萌宠、家居、旅行、运动、科技、互联网、医疗保健、教育、亲子育儿、生活

**格式化规则（适用于所有情况）：**
- 数字 < 10000 直接展示；≥ 10000 用 `x.xw` 格式
- `publish_time` 转为 `MM-DD HH:MM`；无论是否指定时间范围均展示
- 标题超 30 字截断加 `...`，使用 `[标题](work_url)` 链接格式
- 标题为空时显示“-”

### Step 4: 📦 更多操作

**展示完结果后，末尾追加以下内容：**

```text
⚡ 更多操作
• 是否需要下载 Excel 文件或 HTML 可视化报告？便于您在浏览器中打开查看
• 本次共 N 条作品，是否需要查看剩余 M 条？
```

> ⚠️ 第二条仅在 articles > 20 时展示，N 为总数，M = N - 20。

#### 4.1 下载报告

将爬取结果 JSON 写入临时文件，再调用报告生成脚本：

```bash
echo '<JSON数据>' > /tmp/xhs_crawl_data.json
python3 ~/.qoderwork/skills/xiaohongshu-crawler/scripts/generate_report.py "<关键词>" \
  --input /tmp/xhs_crawl_data.json --format <csv|html|both>
```

| `--format` | 生成文件 | 告知用户示例 |
|------------|---------|-------------|
| `csv` | CSV（Excel 兼容） | `✅ Excel（CSV）文件已生成：~/Downloads/XhsCrawl/小红书作品_关键词_时间戳.csv` |
| `html` | HTML 可视化报告 | `✅ HTML 可视化报告已生成：~/Downloads/XhsCrawl/小红书作品_关键词_时间戳.html` |
| `both` | CSV + HTML | 同时告知两个文件路径 |

#### 4.2 用户回复「查看全部」

直接展示剩余数据（从第 21 条开始），使用与 A3 相同的表格格式，不再追加「更多操作」提示。

