用 Agent 自动筛小红书 KOL
教程:搭一个 10 分钟筛完 200 个小红书博主的 Agent,含互动评分、内容匹配、粉丝质量分析,总费用不到 $6。
先说结论 — 一个 Python agent,10 分钟内筛完 200 个小红书 KOL 候选人:按互动质量、内容匹配度和增长曲线打分,输出排名 CSV。数据费用 $4-$6。用蒲公英达人数据 + 笔记互动抽样 + Claude 评分。
品牌选小红书 KOL 做投放,传统做法:打开 200 个主页、刷帖子、肉眼估互动、跨候选人比较、最后凭感觉排名。市场团队搞 2-3 天。
Agent 搞 10 分钟,花 $6。
Agent 输出什么
每个候选 KOL 的评估结果:
| 输出 | 数据来源 | 单价 |
|---|---|---|
| 蒲公英互动评分 | xiaohongshu/pgy/blogger-detail | $0.02 |
| 30 天粉丝增长曲线 | xiaohongshu/pgy/blogger-fans-history | $0.02 |
| 内容分类分布 | xiaohongshu/app-v2/user-faved-notes(抽 10 条) | $0.001 |
| 平均互动率 | 从笔记样本计算 | — |
| LLM 匹配度评分(1-10) | Claude Sonnet 4 | ~$0.005/批 |
最终产出:按总分排名的 CSV,含评分理由和红旗标记。
评分模型
四个维度:
总分 = 0.3 × 互动质量
+ 0.25 × 内容匹配
+ 0.25 × 增长趋势
+ 0.2 × 粉丝质量信号
互动质量(从笔记抽样):
- 互动率 = (点赞 + 评论 + 收藏) / 预估曝光
- 评论/点赞比(高比例 = 真实讨论,不是纯刷赞)
- 收藏率(小红书上高收藏 = 实用内容 = 强购买意向信号)
内容匹配(LLM 评估):
- 博主近期内容和品牌品类是否对齐
- 视觉风格一致性
- 调性匹配(教程 vs 娱乐 vs 生活方式)
增长趋势(从蒲公英粉丝历史):
- 30 天粉丝增长率
- 增长稳定性(稳步涨 vs 暴涨后跌)
- 红旗:一周涨 50%+ 但没有爆款内容(可能刷粉)
粉丝质量信号(推断):
- 粉丝数 vs 互动率的关系(高粉低互动 = 可疑)
- 蒲公英平台评分(小红书自己的内部排名)
核心代码(简化版)
import json, os, csv, time
from openai import OpenAI
client = OpenAI(base_url="https://api.sandbase.ai/v1", api_key=os.environ["SANDBASE_API_KEY"])
def fetch_blogger(blogger_id):
r = client.chat.completions.create(model="xiaohongshu/pgy/blogger-detail", messages=[], extra_body={"blogger_id": blogger_id})
return json.loads(r.choices[0].message.content)
def fetch_fans_history(blogger_id):
r = client.chat.completions.create(model="xiaohongshu/pgy/blogger-fans-history", messages=[], extra_body={"blogger_id": blogger_id})
return json.loads(r.choices[0].message.content)
def fetch_notes(user_id, count=10):
r = client.chat.completions.create(model="xiaohongshu/app-v2/user-faved-notes", messages=[], extra_body={"user_id": user_id, "count": count})
return json.loads(r.choices[0].message.content)
def score_content_fit(notes, brand_category):
titles = [n.get("desc", n.get("title", ""))[:80] for n in notes[:10]]
r = client.chat.completions.create(
model="anthropic/claude-sonnet-4",
messages=[{"role": "user", "content": f'给这个博主的内容和"{brand_category}"品类的匹配度打分 1-10。\n\n近 10 条笔记:\n{json.dumps(titles, ensure_ascii=False)}\n\n回复 JSON:{{"score": N, "reasoning": "一句话理由"}}'}],
max_tokens=150,
)
try:
return json.loads(r.choices[0].message.content)
except:
return {"score": 5, "reasoning": "无法解析"}
def screen_one(blogger_id, brand_category):
detail = fetch_blogger(blogger_id)
fans = fetch_fans_history(blogger_id)
notes = fetch_notes(blogger_id)
# 互动计算
interactions = sum(n.get("likes", 0) + n.get("comments", 0) + n.get("collects", 0) for n in notes)
avg_per_note = interactions / max(len(notes), 1)
save_rate = sum(n.get("collects", 0) for n in notes) / max(interactions, 1)
# 增长计算
history = fans.get("history", [])
growth = (history[-1].get("count", 0) - history[0].get("count", 0)) / max(history[0].get("count", 1), 1) if len(history) >= 2 else 0
# LLM 打分
content = score_content_fit(notes, brand_category)
# 红旗
flags = []
followers = detail.get("follower_count", 0)
if followers > 100000 and avg_per_note < 100:
flags.append("粉丝多互动少")
if save_rate < 0.05:
flags.append("收藏率过低")
# 总分
eng_score = min(avg_per_note / 500, 10)
growth_score = min(growth * 100, 10)
total = 0.3 * eng_score + 0.25 * content["score"] + 0.25 * growth_score + 0.2 * detail.get("pgy_score", 5)
return {
"nickname": detail.get("nickname", "?"),
"followers": followers,
"avg_interactions": int(avg_per_note),
"save_rate": f"{save_rate:.1%}",
"growth_30d": f"{growth:.1%}",
"content_fit": content["score"],
"total": round(total, 2),
"reasoning": content["reasoning"],
"red_flags": "; ".join(flags) or "无",
}
# 跑 200 个候选人
results = []
for i, bid in enumerate(BLOGGER_IDS):
print(f"[{i+1}/200] {bid}")
results.append(screen_one(bid, "美妆护肤"))
time.sleep(0.5)
results.sort(key=lambda x: x["total"], reverse=True)
with open("kol_ranking.csv", "w", newline="", encoding="utf-8-sig") as f:
w = csv.DictWriter(f, fieldnames=results[0].keys())
w.writeheader()
w.writerows(results)
200 人费用
| 操作 | 每人 | × 200 | 单价 | 总计 |
|---|---|---|---|---|
| 蒲公英详情 | 1 次 | 200 | $0.02 | $4.00 |
| 粉丝历史 | 1 次 | 200 | $0.02 | $4.00 |
| 笔记抽样 | 1 次 | 200 | $0.001 | $0.20 |
| LLM 评分 | 1 次 | 200 | ~$0.005 | $1.00 |
| 总计 | $9.20 |
优化方式:
- 第一轮只查互动+内容,跳过粉丝历史 → $5.20/200 人
- 前 50 名才查粉丝历史 → 再加 $1.00
- LLM 批量评分(10 人一批) → 省到 $0.40
优化后总费用:$5.60 筛完 200 人。
局限
- 蒲公英覆盖:不是所有博主都在蒲公英上。1 万粉以下的小博主可能没有 PGY 资料,只能用笔记数据
- 互动估算:没有曝光数据,用互动/粉丝数做近似。对大号不利(老粉不活跃)
- LLM 主观性:评分带主观色彩。建议先用 10 个已知好 + 10 个已知差的 KOL 校准 prompt
- 不能检测刷量:粉丝暴涨检测只是启发式,不是定论。高投入活动建议结合第三方审计
FAQ
怎么拿 200 个候选 ID?
用 xiaohongshu/pgy/blogger-list 按品类和粉丝区间筛选。一次调用返回分页列表。例:{"category": "beauty", "follower_min": 10000, "follower_max": 500000}。
美妆以外的品类能用吗?
能。把 brand_category 改成任何品类:健身、美食、数码、母婴、时尚。LLM 评分会自动适配。
200 人跑多久?
加 0.5s 间隔约 8-12 分钟。瓶颈在 LLM 评分,不在数据拉取。
总分多少算好?
实践中:>7.0 强匹配、5.0-7.0 值得考虑、<5.0 大概不合适。但要根据你的品牌校准——先跑 10 个已知好的 KOL 看他们得多少分。


