# 怎么把微博搜索结果导出成 Excel？

> 把一次微博关键词搜索变成 .xlsx 文件：逐页翻、16 位微博 ID 按文本保存、时间换成北京时间、再补上作者资料。费用、代码和几个坑。

网页版：https://okdata.online/zh/answers/weibo-search-export-excel/

**简短回答：**用微博搜索按关键词逐页翻，用 openpyxl 把每条微博写成一行，微博 ID 和用户 ID 按文本存，时间换成北京时间。每页约 10 条，收费 $0.002，翻 30 页（约 300 条）是 $0.06；再用微博账号信息接口补上 120 个作者的资料，合计 $0.30。

需求总是这一句：“把微博上大家怎么聊露营装备的，导一份 Excel 给我。”搜索本身不难，难在表格：微博 ID 末位被改成 0，中文变成乱码，时间全都差 8 小时。这里用一个接口完成搜索，再写出一份打开就能用的 .xlsx。

## 能导出哪些列

[微博搜索](/zh/apis/weibo/posts/search/)加上 `view=full` 后：

| 列 | 字段 |
|---|---|
| 微博 ID（mid） | `id` |
| 链接 | `url`，格式是 weibo.com/uid/bid |
| 作者 UID、昵称、粉丝数 | `author.id`、`author.name`、`author.followers` |
| 发布时间 | `published_at`（UTC，要换成北京时间） |
| 正文 | `text` |
| 转发、评论、点赞 | `metrics.reposts`、`metrics.comments`、`metrics.likes` |
| 视频播放量 | `metrics.views`，只有视频微博才有 |
| 微博显示的 IP 属地 | `ext.region` |
| 正文在搜索结果里被截断 | `ext.is_long_text` |

分享数和收藏数微博不公开，返回 null，`meta.unavailable` 里标的是 `platform`。想要作者的认证说明、微博总数这些，就把去重后的 `author.id` 拿去调[微博账号信息](/zh/apis/weibo/users/get/)。

## Excel 的三个坑

1. **长 ID。**微博 ID 是 16 位，Excel 只保留 15 位有效数字，`5249013377610245` 会变成 `5249013377610240`，显示成 `5.24901E+15`。用开源微博爬虫的人经常遇到这个问题。ID 要按文本写入，用 openpyxl 时传字符串就行。
2. **编码。**CSV 双击用 Excel 打开，中文可能是乱码，这也是爬虫项目 issue 区里的老问题。直接写 .xlsx，就不存在这个问题。
3. **时区。**`published_at` 是 UTC。写入之前换成北京时间（UTC+8），并在表头注明。

## 费用

| 导出规模 | 调用次数 | 费用 |
|---|---|---|
| 一页，约 10 条 | 1 | $0.002 |
| 30 页，约 300 条 | 30 | $0.06 |
| 再加 120 个作者资料 | 150 | $0.30 |

## 示例

装好 `requests` 和 `openpyxl`，设好密钥，然后：

```python
import os, requests
from datetime import datetime, timezone, timedelta
from openpyxl import Workbook

API = "https://api.okdata.online"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}
BJ = timezone(timedelta(hours=8))
QUERY, MAX_PAGES = "露营 装备", 30

def call(path, **params):
    body = requests.get(API + path, headers=H, params=params, timeout=60).json()
    if body["code"] != "ok":
        raise RuntimeError(f'{body["code"]}: {body["message"]}')
    return body

wb = Workbook()
ws = wb.active
ws.title = "微博"
ws.append(["mid", "链接", "uid", "作者", "粉丝数", "发布时间（北京）", "正文",
           "转发", "评论", "点赞", "播放", "IP 属地", "正文被截断"])
seen, cursor = set(), None
for _ in range(MAX_PAGES):
    params = {"query": QUERY, "sort": "latest", "view": "full"}
    if cursor:
        params["cursor"] = cursor
    body = call("/v1/weibo/posts/search", **params)
    for p in body["data"]["items"]:
        if p["id"] in seen:
            continue
        seen.add(p["id"])
        when = datetime.fromisoformat(p["published_at"].replace("Z", "+00:00")).astimezone(BJ)
        m, a = p["metrics"], p["author"]
        ws.append([p["id"], p["url"], a["id"], a["name"], a["followers"], when.replace(tzinfo=None),
                   p["text"], m["reposts"], m["comments"], m["likes"], m["views"],
                   p["ext"].get("region"), p["ext"].get("is_long_text")])
    if not body["page"]["has_more"]:
        break
    cursor = body["page"]["next_cursor"]

wb.save("微博-露营装备.xlsx")  # ID 是按字符串写入的，16 位一位不少
```

要加一张“作者”表，就对每个去重后的 `author.id` 调一次 `/v1/weibo/users/get`，传 `id=<uid>` 和 `view=full`，写入 `name`、`followers`、`posts`、`verified`、`ext.verified_reason` 和 `ext.ip_location`。

## 限制

- 微博搜索返回的是微博对这个关键词排出来的结果，不是历史上所有微博。想覆盖得更全，就 `sort=hot` 和 `sort=latest` 各跑一遍，按 `id` 合并，做法见[怎么采集某个话题的微博做舆情分析](/zh/answers/weibo-public-opinion-dataset/)。
- 标了 `ext.is_long_text` 的微博，拿到的是搜索结果里显示的截断正文。接口目录里没有微博详情接口，取不到全文。
- 全程不需要微博账号或 cookie，见[不登录怎么按关键词搜微博](/zh/answers/weibo-search-without-cookie/)。只返回公开微博。

## 用到的接口

- [微博搜索](https://okdata.online/zh/apis/weibo/posts/search/) `weibo.posts.search`：$0.002/次 · 每页约 10 条帖子
- [微博账号信息](https://okdata.online/zh/apis/weibo/users/get/) `weibo.users.get`：$0.002/次

## 更多微博内容

- [微博 API](https://okdata.online/zh/apis/weibo/)
- [微博 API Python 教程：关键词搜索、用户资料和热搜（2026）](https://okdata.online/zh/guides/weibo-api-python/)
- [微博和 B 站评论的 IP 属地，能通过接口拿到吗？](https://okdata.online/zh/answers/weibo-bilibili-ip-location-data/)
- [怎么找某个领域的微博博主（KOL）？](https://okdata.online/zh/answers/weibo-find-kols-in-niche/)
- [2026 年微博还有能读微博内容的开放 API 吗？](https://okdata.online/zh/answers/weibo-official-api-2026/)
- [做舆情分析，怎么批量采集某个话题的微博？](https://okdata.online/zh/answers/weibo-public-opinion-dataset/)
- [微博的 uid、mid 和 bid 分别是什么？](https://okdata.online/zh/answers/weibo-uid-mid-bid/)
- [账号信息接口](https://okdata.online/zh/roles/accounts-get/)
- [内容搜索接口](https://okdata.online/zh/roles/posts-search/)
- [微博热搜：今日榜单](https://okdata.online/zh/tools/hot-search/weibo/)

## 资料来源

- [Microsoft 支持：在 Excel 中保留前导零和大数字](https://support.microsoft.com/en-us/excel/keeping-leading-zeros-and-large-numbers) (读取于 2026-11-12)
- [openpyxl 文档](https://openpyxl.readthedocs.io/en/stable/) (读取于 2026-11-12)
- [dataabc/weibo-search issue 208：Excel 里的微博 id 显示成 4.75E+15](https://github.com/dataabc/weibo-search/issues/208) (读取于 2026-11-12)
- [dataabc/weiboSpider issue 565：写入 CSV 时出现乱码](https://github.com/dataabc/weiboSpider/issues/565) (读取于 2026-11-12)

这个问题出现过的地方（读取于 2026-11-12）：

- https://github.com/dataabc/weibo-search/issues/208
- https://github.com/dataabc/weiboSpider/issues/565
- https://www.v2ex.com/t/389043

更新于 2026-11-12
