# 微博热搜多榜爬取与数据整合 — Hunter 调研报告 > 目标 Agent: `weibo-scraper` > 技能领域: 微博热搜多榜爬取与数据整合 > 调研时间: 2026-04-13 > 数据来源: 一手 API 实测 + 第三方聚合接口验证 --- ## 1. 数据源清单 ### 1.1 官方接口(一手数据源) | 榜单 | 接口地址 | 认证要求 | 实测状态 | 备注 | |------|---------|---------|---------|------| | **热搜总榜** | `https://weibo.com/ajax/side/hotSearch` | 无需登录 | ✅ 可用 | 返回 51 条实时热搜 + 1 条置顶话题 | | **文娱榜** | `https://weibo.com/ajax/statuses/entertainment` | 需登录 Cookie | ⚠️ 需登录 | 空 Cookie 返回 `ok: -100` | | **社会榜** | `https://weibo.com/ajax/statuses/society` | 需登录 Cookie | ⚠️ 需登录 | 同上 | | **生活榜** | `https://weibo.com/ajax/statuses/life` | 需登录 Cookie | ⚠️ 需登录 | 同上 | | **体育榜** | `https://weibo.com/ajax/statuses/sport` | 需登录 Cookie | ⚠️ 需登录 | 扩展榜单 | | **科技榜** | `https://weibo.com/ajax/statuses/tech` | 需登录 Cookie | ⚠️ 需登录 | 扩展榜单 | | **要闻榜** | `https://weibo.com/ajax/statuses/news` | 需登录 Cookie | ⚠️ 需登录 | 扩展榜单 | ### 1.2 第三方聚合/中转 API(实测可用) | 服务商 | 接口地址 | 认证 | 实测状态 | 特点 | |--------|---------|------|---------|------| | **60s 读世界** | `https://60s.viki.moe/v2/weibo` | 无需 Key | ✅ 可用 | 返回 `title`/`hot_value`/`link` | | **XXAPI** | `https://v2.xxapi.cn/api/weibohot` | 无需 Key | ✅ 可用 | 返回 `index`/`title`/`hot`/`url` | | **酷酷 API** | `https://api.zxki.cn/api/jhrs?type=weibo` | 无需 Key | ✅ 可用 | 聚合多平台热榜 | | **AA1.cn** | `https://api.aa1.cn/api/weibo-rs` | 无需 Key | ✅ 可用 | 返回排名+热度+双端 URL | | **天聚数行** | `https://apis.tianapi.com/weibohot/index?key={apiKey}` | 需 API Key | 未实测 | 付费/会员制,约 30 分钟更新 | | **觅知 API** | `https://api.98dou.cn/api/hotlist?type=weibo` | 无需 Key | ❌ 403 | 当前被拦截,不稳定 | ### 1.3 旧版网页入口(已受限) | 入口 | URL 示例 | 状态 | 说明 | |------|---------|------|------| | s.weibo.com 前端页 | `https://s.weibo.com/top/summary?cate=realtimehot` | ❌ 302 | 强制跳转 `passport.weibo.com` visitor 验证 | | 新版热榜页 | `https://weibo.com/hot/search` | ❌ 302 | 同样被 visitor 机制拦截 | | m.weibo.cn 移动端 | `https://m.weibo.cn/api/container/...` | ❌ 432/302 | 移动端有独立风控,需特定 Cookie/Token | --- ## 2. 榜单结构分析 ### 2.1 热搜总榜 (`/ajax/side/hotSearch`) **返回结构:** ```json { "ok": 1, "data": { "hotgov": { ... }, "hotgovs": [ ... ], "realtime": [ { ... }, ... ] }, "logs": [], "topLogs": [] } ``` **`realtime` 单条字段说明:** | 字段 | 类型 | 含义 | |------|------|------| | `word` | string | 热搜词条(核心字段) | | `num` | int | 热度数值(如 `1172178`) | | `realpos` | int | 实际排名(1~N) | | `rank` | int | 内部排序偏移(通常为 `realpos - 1`) | | `label_name` | string | 标签:`热`、`新`、`爆`、`沸`、`荐` 或空 | | `flag` | int | 标签类型编码:0=无, 1=新, 2=热 | | `note` | string | 与 `word` 通常一致 | | `word_scheme` | string | 带 `#` 的话题格式,如 `#话题#` | | `topic_flag` | int | 是否话题:1=话题,0=普通词 | | `icon` / `icon_desc` | string | 图标 URL 和描述 | | `icon_desc_color` | string | 图标颜色 HEX | **`hotgov` 置顶字段说明:** - 表示官方置顶内容。字段比 `realtime` 多 `is_gov`、`stime`、`name`、`url` 等。 ### 2.2 其他垂直榜单 (`/ajax/statuses/{category}`) 通过 HEAD 探测确认以下端点均**真实存在**: ``` entertainment → 文娱榜 society → 社会榜 life → 生活榜 sport → 体育榜 tech → 科技榜 news → 要闻榜 ``` **技术限制:** - 空 Cookie 访问返回 `{"ok": -100, "url": "https://weibo.com/login.php?url=..."}` - 需要携带有效的 `SUB`、`XSRF-TOKEN` 等 Cookie - Header 需包含 `Referer: https://weibo.com/` 和 `X-Requested-With: XMLHttpRequest` **推断的返回结构:** - 大概率与 `hotSearch` 类似,或采用 `band_list` / `group` 结构。 - 字段映射可复用 `word` / `num` / `realpos` / `label_name` 等统一 schema。 ### 2.3 URL 结构差异总结 | 层级 | 热搜总榜 | 垂直榜单(文娱/生活/社会等) | |------|---------|---------------------------| | **路径前缀** | `weibo.com/ajax/side/` | `weibo.com/ajax/statuses/` | | **区分方式** | 固定路径 `hotSearch` | 动态路径 `{category}` | | **认证强度** | 低(公开接口) | 高(需登录 Cookie) | | **服务模块** | 侧边栏热词服务 | 信息流/话题带服务 | --- ## 3. 爬取方法论 ### 3.1 零登录方案(快速启动) 对于**热搜总榜**,直接 GET 请求即可: ```python import requests url = "https://weibo.com/ajax/side/hotSearch" headers = { "User-Agent": "Mozilla/5.0 ...", "Accept": "application/json, text/plain, */*", "Referer": "https://weibo.com/", "X-Requested-With": "XMLHttpRequest", } resp = requests.get(url, headers=headers, timeout=10) data = resp.json()["data"]["realtime"] ``` ### 3.2 多榜爬取方案(需登录态) 对于**文娱榜/社会榜/生活榜**,必须维护 Cookie Session: ```python import requests import time session = requests.Session() session.headers.update({ "User-Agent": "...", "Referer": "https://weibo.com/", "X-Requested-With": "XMLHttpRequest", }) session.cookies.set("SUB", "_2Ak...") session.cookies.set("XSRF-TOKEN", "...") boards = ["entertainment", "society", "life", "sport", "tech"] for board in boards: url = f"https://weibo.com/ajax/statuses/{board}" resp = session.get(url, timeout=10) # 解析并存储... time.sleep(2) # 频率控制 ``` ### 3.3 备用/兜底方案(第三方 API) 当官方接口受限时,可调用第三方免费 API 降级: - `60s.viki.moe/v2/weibo` - `v2.xxapi.cn/api/weibohot` - `api.aa1.cn/api/weibo-rs` **优缺点:** - 优点:无需维护 Cookie,适合小型项目。 - 缺点:字段不完整,更新频率依赖第三方。 --- ## 4. 反爬策略 ### 4.1 官方接口风控机制(实测) | 接口 | 风控强度 | 触发条件 | 应对策略 | |------|---------|---------|---------| | `/ajax/side/hotSearch` | 低-中 | 缺少 `User-Agent` 或高频 IP | 补全 Headers,单 IP 间隔 ≥30 秒 | | `/ajax/statuses/*` | 高 | Cookie 失效、Referer 缺失 | 维护 Cookie 池,配合代理轮换 | | `s.weibo.com/*` | 极高 | **全部请求强制 visitor 校验**(实测 302) | 不建议直接爬取 HTML | | `m.weibo.cn/*` | 高 | 缺少 M 端 Cookie/Token(实测 432) | 需模拟移动端登录 | ### 4.2 推荐配置 **Headers 最小可用集:** ```json { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 ...", "Accept": "application/json, text/plain, */*", "Accept-Language": "zh-CN,zh;q=0.9", "Referer": "https://weibo.com/", "X-Requested-With": "XMLHttpRequest", "Connection": "keep-alive" } ``` **频率控制:** - 官方接口:≥30 秒/次,单 IP 日调用量建议 <2000 次。 - 第三方 API:≥2 秒/次。 **Cookie 维护(针对需登录榜单):** 1. 手动导出浏览器 `SUB` 和 `XSRF-TOKEN`。 2. 使用 Playwright/Selenium 定期扫码登录,自动提取新 Cookie。 3. 准备 3-5 个账号轮换。 --- ## 5. 数据清洗规范 ### 5.1 输入源差异映射 | 标准字段 | 官方 `hotSearch` | 60s API | XXAPI | AA1.cn | |---------|-----------------|---------|-------|--------| | `rank` | `realpos` | 索引+1 | `index` | `index` | | `word` | `word` | `title` | `title` | `title` | | `heat` | `num` | `hot_value` | `hot` | `hot` | | `label` | `label_name` | - | - | - | | `url` | `word_scheme` | `link` | `url` | `url` | | `is_topic` | `topic_flag` | 推断 | 推断 | 推断 | ### 5.2 清洗规则 1. **字段标准化** - 所有字段名统一为 `snake_case` - 热度值统一为纯数字(去除 `万`/`万+` 后缀) - 空值用 `''` 或 `0` 填充 2. **Unicode 解码** - API 返回的 JSON 可能含 Unicode 转义,入库前必须解码为 UTF-8 3. **去重规则** - 联合键:`word` + `board_type` + `crawl_time`(按小时截断) 4. **置顶处理** - `hotgov` 标记 `rank=0`,`board_type=hotgov` ### 5.3 输出格式标准 **JSON 单条示例:** ```json { "rank": 1, "word": "员工中了1500万彩票后直接离职", "heat": 1172178, "label": "热", "board_type": "realtimehot", "is_topic": 1, "note": "员工中了1500万彩票后直接离职", "word_scheme": "#员工中了1500万彩票后直接离职#", "source_url": "https://weibo.com/ajax/side/hotSearch", "crawl_time": "2026-04-13T10:32:00Z" } ``` **必填字段:** `rank`, `word`, `heat`, `board_type`, `source_url`, `crawl_time` --- ## 6. 合规要求 1. **遵守 robots.txt** - `weibo.com/robots.txt` 限制了部分路径,公开 API 端点未明确禁止。 2. **频率与负载控制** - 请求间隔 ≥2 秒(建议 ≥30 秒),避免对服务器造成过度负载。 3. **数据溯源** - 每条记录必须保留 `source_url` 和 `crawl_time`。 4. **隐私与版权** - 仅限公开榜单数据,禁止采集用户 UID、手机号、私信等隐私信息。 5. **商业使用建议** - 长期/商业项目建议接入微博开放平台官方 API 或购买正规数据服务。 --- ## 7. 结论与执行建议 - **热搜总榜**有一条稳定、无需登录的公开 JSON 接口 (`/ajax/side/hotSearch`),适合作为种子数据采集的主数据源。 - **文娱/社会/生活等多榜**需要登录态 Cookie(`ajax/statuses/{category}`),建议在 Digester 阶段攻克。 - **第三方聚合 API** 字段精简但可用性高,适合作为降级/对账来源。 - s.weibo.com 和 m.weibo.cn 的公开入口已被 visitor 验证或风控拦截,不建议作为主力爬取入口。 - 建议后续通过 **Cookie 池** 或 **浏览器自动化** 解锁垂直榜单端点,实现真正的多榜整合。 --- *报告由 Hunter Agent 生成 | 验收标准: 数据源 ≥5 个 ✅ | 含字段映射表 ✅ | 含反爬/合规分析 ✅*