「你们能不能帮我们盯一下,出事了第一时间知道?」
这是我一个做消费品牌的客户,去年底在电话里问我的第一句话。他们要的不是热搜,是自己品牌名在微博上有没有异常波动。
先说结论:做品牌舆情监测,微博指数本身不够用,得「指数看趋势、关键词看内容」两套一起上。只盯指数你会知道「有事发生了」,但不知道「什么事、严不严重、要不要回应」。
起因:为什么要做这件事
这家客户是做母婴用品的,年营收不算小,但市场部只有两个人。他们之前的做法是靠人工——每天早上有人花二十分钟刷微博搜索,把带品牌名的帖子手动记进 Excel。
这个流程的问题我在第一次复盘时就看到了:人工记录的时候,点赞和收藏经常混在一起记,发布时间也只记个日期,到月底汇总根本没法做趋势对比。
更麻烦的是频率。热搜榜分实时榜、文娱榜、要闻榜,还支持按小时看趋势变化。人是没法按小时刷的。而那波搜索「营业中」的用户,往往就集中在凌晨一两点——等第二天上班再发现,评论区已经吵完了。
过程:具体怎么做的
我们最后定了两条腿走路。
第一条腿:微博指数看趋势
微博指数(data.weibo.com/index)能给出某个词的热度曲线。它的价值不在绝对值,而在形状——平的一条线突然抬头,就是信号。
实操上有个技术细节要提醒:微博指数的接口需要带 token,而这个 token 有效期只有约两小时,还绑定设备指纹。我们第一版脚本每天跑挂三次,就是因为没处理 token 刷新。后来加了两级兜底:先从页面 HTML 里的 window.$CONFIG 初始化数据里正则提取,取不到就退而打 hotword 接口拿 data.token;只有连续 403 三次才触发模拟登录,避免频繁登录把 IP 搞进风控名单。
第二条腿:关键词采集看内容
指数只给数字,不给内容。要看「大家在骂什么」,得采微博正文。
我们试过三条路,最后放弃了两条:
- weibo.com 搜索页(放弃):React 动态渲染,直接抓 HTML 只能拿到空壳;上 Selenium 又重又被限流,滑块验证码的维护成本高到离谱。
- 开放平台官方 API(放弃):合规性最好,但关键词搜索权限个人开发者基本申请不到。
- 移动端 m.weibo.cn 的 container 接口(采用):返回结构化 JSON,每条微博带 id、text、created_at、reposts_count、comments_count、attitudes_count 六个字段,正好覆盖「文本 + 热度」两类需求。
这套分层策略不是拍脑袋来的。我知道的一个更省事的路子是直接用官方 CLI 工具——微博开放平台已经把 60 多个 API 做成了命令行调用,一行 weibo-cli search statuses/limited 就能出 JSON,再管道给模型做摘要。有资质的企业账号建议走这条,比自建稳定。
踩坑:哪里翻车了
三个坑,都是真金白银换来的。
坑一:把拼音当成标准值。微博返回的 province 字段看着是拼音,实际很脏——「内蒙古」可能返回 neimenggu,也可能返回 nmg;「新疆生产建设兵团」返回的是 xj_bingtuan;广西有 gx_gx 这种重复值。我们第一版按字符串直接分组,31 个省份硬是分出了 40 多个桶,图表全是碎条。后来做了三层校验:先 pypinyin 标准化,再过 34 个标准值的白名单,不在白名单的走正则模糊映射(比如 ^xj.* 一律归新疆)。
坑二:把「热度高」等同于「要出事」。这是最贵的一课。客户有一次看到某词的指数暴涨,市场部连夜写了两版声明。结果第二天发现是对方平台搞活动带来的正常流量,白写。后来我们在告警规则里加了一条:指数异常必须同时满足「绝对值超阈值 + 环比涨幅超阈值 + 负面情感占比超阈值」三个条件才推送给市场部,只满足一个的只在后台记一笔,不打扰人。
坑三:数据缺失时默认它是全的。我们在做百度指数批量采集时定过一条规矩——某个周期的数据缺失率超过三成,整段直接标记为不可靠,在大屏上置灰,不许拿去下结论。这个坑在舆情场景更要命:采了一半的数据,你会得到一条「看起来很平」的曲线,然后得出「没事」的结论。真相是接口挂了两小时,中间那波冲高根本没采到。
顺便说个反直觉的观察:深夜 0 点之后微信指数会下降(正常,人都睡了),但我们的站点点击反而上升——因为竞品的投放也停了。可转化率是崩的。所以「热度下降」和「机会窗口」是两件独立的事,别用一条曲线同时判断。
解法:怎么爬出来的
最终的架构很朴素,四层:
- 采集层:按关键词列表定时跑,频率控制在每分钟 30 次以内,单线程加延时。这是底线,不是建议——超了这个量级,风控找你就是时间问题。
- 清洗层:去重(同一微博被多次采到)、地域归一化、时间对齐到小时粒度。
- 分析层:情感倾向分正面/中性/负面,领域分类分社会/文娱/科技等。这层可以接模型,也可以先用关键词词典跑基线——我们是先跑了两周词典,摸清了误判模式才上的模型。
- 告警层:三条件同时满足才推送,推送给具体的人,而不是扔进一个没人看的群。
研发侧的第一步建议永远是同一句话:拿起 Chrome 开发者工具(F12),自己抓包看请求长啥样。文档和实际接口对不上的情况太常见了。
验证:拿什么数据证明有效
我们用了三个可观测指标:
- 发现延迟:从事件在微博发酵到我们收到告警的中位时间。改造前靠人工是 14 小时以上(第二天上班才发现),现在是 40 分钟内。
- 告警准确率:推送的告警里,市场部认为「确实需要关注」的占比。第一版只有约三成(噪音太多),加了三个条件后提到约七成。剩下那三成我们认了——漏报的代价比误报高。
- 人工工时:市场部每天早上那二十分钟的刷榜动作取消了,一个月省下约十小时,全部转到内容侧。
说清边界条件:这套东西对「突然爆发的负面」有效,对「缓慢积累的不满」效果一般——因为指数是平滑的,温水煮青蛙式的情绪变化不会触发阈值。后者得靠定期拉取评论做人工抽读,我们目前是每周一次。
合规提醒
采集公开可见内容时,务必遵守目标平台的用户协议与 robots 约定,控制请求频率,不做登录态绕过,不触碰非公开接口。舆情数据里大量涉及个人信息(用户 ID、评论内容、地域),应按最小必要原则采集和存储,商用前一定做脱敏,数据不要做二次分发。
常见问题
Q1:不做技术,能靠现成工具吗?
能。飞瓜、新榜、极致了数据这类平台都有跨平台的舆情监测模块,也有平台把「采集 → AI 分析 → 导出 Excel」整条流程做成了可视化自动化,不用写代码。代价是月费,以及字段受限于对方给什么。
Q2:微博指数和百度指数的数值能横向比吗?
不能直接比。两家的指数体系算法不同,同一个词在两边可能差一个量级。要比只能比「各自的趋势形状」,不能比绝对值。
Q3:多久采一次够用?
看业务。品牌舆情建议 1 小时一次,做热点内容跟进至少 15 分钟一次。但频率越高,风控和存储成本越大,别无脑拉满。
Q4:情感分析准确率多少算合格?
中文短文本,通用模型在微博上通常也就七到八成——反讽、缩写、网络梗是主要失分点。别追求 95%,把「负面漏报」单独拎出来调优更有价值。
Q5:本地部署还是云服务?
涉及品牌舆情这种敏感数据,我们选了本地跑、只把聚合后的指标同步到云端大屏。如果客户是金融机构、有数据不得离境的硬要求,这一点几乎没得选。

