数据链路分析报告

微博热点爬取 · 全链路覆盖率追踪
2026-03-26

1核心结论

全链路覆盖率
18.1%
↑ 3.1pp vs 0325
爬取 keyword 数
1,772
去重后
完成全链路
321
+52 vs 0325
表1→表2 流失率
81.7%
瓶颈环节
表1 榜单爬虫
1,772 keyword(100%)
▼ 流失 81.7%(1,447 个未调用智谱)
表2 智谱搜索
325(18.3%)
▼ 流失 1.2%(仅 4 个无关联帖子)
表3 关联帖子
321(18.1%)
榜单keyword 数全链路覆盖率最大流失环节vs 0325
热搜榜42157.0%表1→表2(42.0%)↑ 9.5pp
文娱榜32850.6%表1→表2(49.1%)↑ 1.3pp
热搜实时上升热点1,03110.9%表1→表2(89.0%)↑ 1.5pp
文娱实时上升热点5787.8%表1→表2(92.2%)↓ 2.5pp

发现 1:整体覆盖率环比提升——全链路从 15.0% → 18.1%,主要由热搜榜贡献(智谱调用覆盖率从 49.6% 提升到 57.9%)

发现 2:文娱实时上升热点覆盖率下降——从 10.3% 降至 7.8%,keyword 数增加但智谱调用数反而减少(54→45)

发现 3:表2→表3 依然健康——325 个智谱 keyword 中 321 个有关联帖子,覆盖率 98.8%

2数据支撑

2.1 整体数据概况

环节数据量去重 keyword/postvs 0325
表1:榜单爬虫7,302 条1,772 keyword+102 条 / +16 kw
表2:智谱搜索5,018 条849 keyword(含非微博)+4,507 条 / +576 kw
表2∩表1(微博匹配)325 keyword+52 kw
表3:关联帖子51,994 条18,243 post+47,803 条
注:表2 的 849 个 keyword 中仅 325 个能匹配微博榜单,其余 524 个可能来自其他平台触发的智谱调用。

2.2 分榜单流失漏斗

热搜榜 ↑ 9.5pp

表1 爬虫
421 kw (100%)
▼ 流失 177 个 (42.0%)
表2 智谱
244 kw (57.9%)
▼ 流失 4 个 (1.6%)
表3 帖子
240 kw (57.0%)

文娱榜 ↑ 1.3pp

表1 爬虫
328 kw (100%)
▼ 流失 161 个 (49.1%)
表2 智谱
167 kw (50.9%)
▼ 流失 1 个 (0.6%)
表3 帖子
166 kw (50.6%)

热搜实时上升热点 ↑ 1.5pp

表1 爬虫
1,031 kw (100%)
▼ 流失 918 个 (89.0%)
表2 智谱
113 kw (11.0%)
▼ 流失 1 个 (0.9%)
表3 帖子
112 kw (10.9%)

文娱实时上升热点 ↓ 2.5pp

表1 爬虫
578 kw (100%)
▼ 流失 533 个 (92.2%)
表2 智谱
45 kw (7.8%)
▼ 流失 0 个 (0.0%)
表3 帖子
45 kw (7.8%)

2.3 爬虫层(表1)异常检查

异常详情vs 0325 同类问题
热搜榜 02 时 100 条正常应为 50 条,翻倍0325 是 01 时文娱榜翻倍
文娱榜 00 时 100 条正常应为 50 条,翻倍新出现
文娱榜 14 时、16 时各 51 条正常应为 50 条,多 1 条新出现

0325 的 17 时热搜榜 0 条缺失问题在 0326 未复现(17 时正常 50 条),说明当时可能是一次性故障。但 02 时热搜榜和 00 时文娱榜的翻倍问题值得关注,可能是凌晨时段爬虫存在重复触发。

3环比趋势分析(0325 vs 0326)

指标03250326变化
表1 去重 keyword1,7561,772+16 (+0.9%)
表1→表2 覆盖率15.5%18.3%+2.8pp
表2→表3 覆盖率96.3%98.8%+2.5pp
全链路覆盖率15.0%18.1%+3.1pp
热搜榜全链路47.5%57.0%+9.5pp
文娱榜全链路49.3%50.6%+1.3pp
热搜实时上升全链路9.4%10.9%+1.5pp
文娱实时上升全链路10.3%7.8%-2.5pp

解读:

热搜榜覆盖率提升最显著(+9.5pp),智谱调用从 209 个增加到 244 个,可能是调用优先级调整或接口扩容。

文娱实时上升热点是唯一下降的榜单,keyword 数增加了(525→578)但智谱调用反降(54→45),需排查是否有过滤策略变更。

表2→表3 环节持续健康,基本无流失。

4流失根因排查

4.1 定位:是智谱没调用,还是解析丢失?

对 1,447 个阶段1流失的 keyword,逐条回查表2 底层数据:

情况keyword 数占流失总数结论
表2 中完全无记录1,43999.4%智谱压根没调用
表2 有记录但 tag 不是智谱微博搜索80.6%其他爬虫碰巧同名

结论:99.4% 的流失是因为上游没有对这些 keyword 发起智谱调用,不是解析逻辑问题。

4.2 那 8 个「碰巧同名」的 keyword

keyword实际 tag说明
周杰伦新专辑SearchQQCompositeSearchQQ 音乐搜索
太阳之子FalconQQSongSearch 等QQ 歌曲/歌词搜索
第五人格ClairvoyanceXhsSearchAirTask 等小红书 + QQ
樱花开了SearchQQCompositeSearchQQ 音乐搜索
大侦探SearchQQCompositeSearchQQ 音乐搜索
隐身的名字SearchQQCompositeSearchQQ 音乐搜索
伊朗SearchQQCompositeSearchQQ 音乐搜索
洛克王国世界SearchQQCompositeSearchQQ 音乐搜索

4.3 智谱返回质量(已调用的部分)

返回状态记录数keyword 数占比
msg 正常 + result 有值4,987845
99.5%
msg 为 NULL + result 有值2810
1.2%
msg 为 NULL + result 为 NULL33
0.4%

解析侧基本无问题,已调用的 keyword 中 99.5% 正常返回了 AI 摘要。

4.4 智谱调用的 keyword 来源分布

来源keyword 数占比
匹配微博榜单325
38.3%
非微博来源524
61.7%

61.7% 的 keyword 不在微博榜单里——上游调用逻辑不只从微博热搜取 keyword,还会从其他来源触发智谱微博搜索,而这部分调用占了大头。

4.5 根因总结

解析问题
✗ 已排除(99.5% 正常返回)
接口返回异常
✗ 已排除(仅 13 个异常,占 1.5%)
上游调用覆盖不足
✓ 确认根因(99.4% 流失是压根没调用)
调用配额分配
61.7% 配额给了非微博来源

4.6 热搜榜与文娱榜流失特征深挖

对覆盖率最高的两个榜单(热搜榜 57.0%、文娱榜 50.6%),从排名、时段、持续时长三个维度分析流失 keyword 的特征画像。

4.6.1 按最高排名分段

排名分段热搜榜 kw热搜榜命中率文娱榜 kw文娱榜命中率
Top 10103
76.7%
82
90.2%
Top 11-2082
67.1%
71
63.4%
Top 21-3069
71.0%
79
40.5%
Top 31-4086
40.7%
60
13.3%
Top 41+81
32.1%
36
22.2%

文娱榜 Top10 命中率(90.2%)显著高于热搜榜 Top10(76.7%),但排名越低衰减越快——文娱榜 Top31-40 仅 13.3%。两个榜单 Top41+ 均低于 33%,排名尾部覆盖严重不足。

4.6.2 按首次上榜时段

时段热搜榜 kw热搜榜命中率文娱榜 kw文娱榜命中率
凌晨 (00-05)72
86.1%
70
82.9%
上午 (06-11)83
83.1%
56
57.1%
下午 (12-17)140
54.3%
119
42.9%
晚间 (18-23)126
29.4%
83
31.3%

两个榜单均呈现「早高晚低」的时段梯度——凌晨上榜的 keyword 命中率 83-86%,晚间上榜的仅 29-31%。推测智谱调用系统可能采用批次调度,凌晨/上午批次覆盖充分,下午/晚间的新增 keyword 来不及触发调用。

4.6.3 按上榜持续时长(出现小时数)

持续时长热搜榜 kw热搜榜命中率文娱榜 kw文娱榜命中率
仅出现 1 次192
32.3%
83
12.0%
2-3 次116
69.0%
121
35.5%
4-6 次63
84.1%
71
85.9%
7 次+50
98.0%
53
100%

持续时长是最强的区分特征——7次+ 的 keyword 命中率接近 100%(热搜 98.0%、文娱 100.0%),仅出现 1 次的 keyword 命中率断崖式下降。文娱榜对短时热点尤其不友好——仅出现 1 次的命中率仅 12.0%。

4.6.4 流失画像总结

典型流失 keyword 画像

晚间 (18-23) 新上榜
仅出现 1 次(闪现即消失)
排名在 Top 31 以后

典型命中 keyword 画像

凌晨/上午上榜
持续 4 小时以上
排名进入 Top 20

推断:上游调用系统采用批次处理 + 优先级调度机制,短时、晚出现、排名靠后的 keyword 在配额有限时被牺牲。

5建议

1
排查上游调用优先级策略——61.7% 的智谱调用配额给了非微博来源,微博榜单只分到 38.3%。需确认:非微博来源的 524 个 keyword 是什么业务在用?是否可以调整配额比例?
2
实时上升热点几乎未覆盖——覆盖率仅 8-11%,如果业务需要这部分数据,需要在上游调用端增加对实时上升热点的调度。
3
继续监控热搜榜覆盖率回升趋势——0326 的 57% 是否可持续,还是仅一天的波动。
4
凌晨爬虫重复触发需关注——02 时热搜榜和 00 时文娱榜连续两天出现翻倍,建议确认是否有定时任务重叠。
5
SQL2 的 Bug 仍未修复——media_materials IS NOT NULL 过滤导致有效 keyword 丢失,0326 数据同样受影响,建议尽快上线优化版 SQL。

6数据来源

所有数据直接从源表查询,未使用 SQL 产出的 tmp 表。

数据过滤条件
表1 榜单爬虫external_data.dwd_data_hunter_noteblock_hot_search_board_inc_hidt=2026-03-26, platform_type=WEIBO
表2 智谱搜索external_data.ods_crawler_return_topicdt=2026-03-26, tag=ClairvoyanceWeiBoAiKeywordSearchInfo
表3 关联帖子external_data.dwd_data_hunter_wb_post_inc_hidt=2026-03-26

跨表关联:以 keyword 为关联键,表3 使用 FIND_IN_SET 匹配 keyword_set。查询引擎:Impala。

A附录:分析用 SQL

A1. 表1 分榜单数据概况
SELECT
  CASE WHEN chart_name = '微博热搜榜' THEN '热搜榜'
       WHEN chart_name = '微博文娱榜' THEN '文娱榜'
       ELSE chart_name END AS rank_name,
  COUNT(*) as row_cnt,
  COUNT(DISTINCT keywords) as keyword_cnt
FROM external_data.dwd_data_hunter_noteblock_hot_search_board_inc_hi
WHERE dt = '2026-03-26' AND platform_type = 'WEIBO'
GROUP BY 1
ORDER BY 1;
A2. 表2 智谱搜索数据概况
SELECT
  COUNT(*) as row_cnt,
  COUNT(DISTINCT GET_JSON_OBJECT(body, '$.keyword')) as keyword_cnt
FROM external_data.ods_crawler_return_topic
WHERE dt = '2026-03-26'
  AND tag = 'ClairvoyanceWeiBoAiKeywordSearchInfo';
A3. 表1→表2 整体匹配
SELECT
  COUNT(DISTINCT t1.keywords) as t1_total_kw,
  COUNT(DISTINCT t2.keyword) as t1_match_t2
FROM (
  SELECT DISTINCT keywords
  FROM external_data.dwd_data_hunter_noteblock_hot_search_board_inc_hi
  WHERE dt = '2026-03-26' AND platform_type = 'WEIBO'
) t1
LEFT JOIN (
  SELECT DISTINCT GET_JSON_OBJECT(body, '$.keyword') as keyword
  FROM external_data.ods_crawler_return_topic
  WHERE dt = '2026-03-26'
    AND tag = 'ClairvoyanceWeiBoAiKeywordSearchInfo'
) t2 ON t1.keywords = t2.keyword;
A4. 表2→表3 匹配(FIND_IN_SET)
SELECT
  COUNT(*) as t12_kw,
  SUM(CASE WHEN has_post > 0 THEN 1 ELSE 0 END) as t12_match_t3
FROM (
  SELECT t12.keyword, COUNT(DISTINCT t3.post_id) as has_post
  FROM (
    SELECT DISTINCT t2.keyword
    FROM (...) t1
    INNER JOIN (...) t2 ON t1.keywords = t2.keyword
  ) t12
  LEFT JOIN external_data.dwd_data_hunter_wb_post_inc_hi t3
    ON t3.dt = '2026-03-26'
    AND FIND_IN_SET(t12.keyword, t3.keyword_set) > 0
  GROUP BY t12.keyword
) sub;
A5. 流失 keyword 在表2 中是否存在(不限 tag)
SELECT
  CASE WHEN t2.keyword IS NOT NULL THEN '表2有记录'
       ELSE '表2无记录' END as in_t2,
  COUNT(DISTINCT t1.keywords) as kw_cnt
FROM (...) t1
LEFT JOIN (...) t2_match ON t1.keywords = t2_match.keyword
LEFT JOIN (...) t2 ON t1.keywords = t2.keyword
WHERE t2_match.keyword IS NULL
GROUP BY 1;
A6. 智谱返回质量检查
SELECT
  CASE
    WHEN GET_JSON_OBJECT(GET_JSON_OBJECT(body, '$.result'), '$.msg') IS NULL THEN 'msg为NULL'
    WHEN ... = '' THEN 'msg为空串'
    WHEN LENGTH(...) < 10 THEN 'msg极短(<10字)'
    ELSE 'msg正常'
  END as msg_status,
  ...
FROM external_data.ods_crawler_return_topic
WHERE dt = '2026-03-26'
  AND tag = 'ClairvoyanceWeiBoAiKeywordSearchInfo'
GROUP BY 1, 2;
A7. 智谱调用 keyword 来源分布
SELECT
  CASE WHEN t1.keywords IS NOT NULL THEN '匹配微博榜单'
       ELSE '非微博来源' END as source,
  COUNT(DISTINCT t2.keyword) as keyword_cnt
FROM (...) t2
LEFT JOIN (...) t1 ON t2.keyword = t1.keywords
GROUP BY 1;
A8. 表1 分时数据检查
SELECT
  CASE WHEN chart_name = '微博热搜榜' THEN '热搜榜'
       WHEN chart_name = '微博文娱榜' THEN '文娱榜'
       ELSE chart_name END AS rank_name,
  hh,
  COUNT(*) as row_cnt
FROM external_data.dwd_data_hunter_noteblock_hot_search_board_inc_hi
WHERE dt = '2026-03-26' AND platform_type = 'WEIBO'
GROUP BY 1, 2
ORDER BY 1, 2;
A9. keyword 明细打标(表1 基础信息)
SELECT
  keywords as keyword,
  GROUP_CONCAT(DISTINCT ..., '|') as rank_names,
  COUNT(DISTINCT ...) as chart_cnt,
  MIN(CAST(ranking AS INT)) as min_rank,
  MAX(search_nums) as max_hot_value,
  MIN(update_time) as first_time,
  COUNT(*) as record_cnt
FROM external_data.dwd_data_hunter_noteblock_hot_search_board_inc_hi
WHERE dt = '2026-03-26' AND platform_type = 'WEIBO'
GROUP BY keywords;
A10. 热搜榜/文娱榜按排名分段的智谱命中率
SELECT rank_name,
  CASE WHEN min_rank <= 10 THEN 'Top10'
       WHEN min_rank <= 20 THEN 'Top11-20'
       WHEN min_rank <= 30 THEN 'Top21-30'
       WHEN min_rank <= 40 THEN 'Top31-40'
       ELSE 'Top41+' END AS rank_segment,
  COUNT(*) AS total_kw,
  SUM(CASE WHEN t2_hit = 1 THEN 1 ELSE 0 END) AS hit_kw,
  ROUND(...) AS hit_rate
FROM (
  SELECT t1.keywords, ...,
    MIN(CAST(t1.ranking AS INT)) AS min_rank,
    MAX(CASE WHEN t2.keyword IS NOT NULL THEN 1 ELSE 0 END) AS t2_hit
  FROM ... t1 LEFT JOIN ... t2
  WHERE t1.chart_name IN ('微博热搜榜', '微博文娱榜')
  GROUP BY ...
) sub
GROUP BY rank_name, rank_segment
ORDER BY rank_name, MIN(min_rank);
A11. 热搜榜/文娱榜按首次上榜时段的智谱命中率
-- 与 A10 结构类似,将 MIN(ranking) 替换为 MIN(CAST(hh AS INT))
-- 外层 CASE 按时段分组:凌晨(00-05) / 上午(06-11) / 下午(12-17) / 晚间(18-23)
SELECT rank_name, time_segment, total_kw, hit_kw, hit_rate
FROM (...同 A10 模式...)
ORDER BY rank_name, MIN(first_hour);
A12. 热搜榜/文娱榜按上榜持续时长的智谱命中率
-- 与 A10 结构类似,将 MIN(ranking) 替换为 COUNT(DISTINCT hh)
-- 外层 CASE 按持续时长分组:仅1次 / 2-3次 / 4-6次 / 7次+
SELECT rank_name, duration_segment, total_kw, hit_kw, hit_rate
FROM (...同 A10 模式...)
ORDER BY rank_name, MIN(appear_cnt);

完整 SQL 代码见 Markdown 版本报告附录 A1-A12