问答
怎么把微博搜索结果导出成 Excel?
简短回答
用微博搜索按关键词逐页翻,用 openpyxl 把每条微博写成一行,微博 ID 和用户 ID 按文本存,时间换成北京时间。每页约 10 条,收费 $0.002,翻 30 页(约 300 条)是 $0.06;再用微博账号信息接口补上 120 个作者的资料,合计 $0.30。
需求总是这一句:“把微博上大家怎么聊露营装备的,导一份 Excel 给我。”搜索本身不难,难在表格:微博 ID 末位被改成 0,中文变成乱码,时间全都差 8 小时。这里用一个接口完成搜索,再写出一份打开就能用的 .xlsx。
能导出哪些列
微博搜索加上 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 拿去调微博账号信息。
Excel 的三个坑
- **长 ID。**微博 ID 是 16 位,Excel 只保留 15 位有效数字,
5249013377610245会变成5249013377610240,显示成5.24901E+15。用开源微博爬虫的人经常遇到这个问题。ID 要按文本写入,用 openpyxl 时传字符串就行。 - **编码。**CSV 双击用 Excel 打开,中文可能是乱码,这也是爬虫项目 issue 区里的老问题。直接写 .xlsx,就不存在这个问题。
- 时区。
published_at是 UTC。写入之前换成北京时间(UTC+8),并在表头注明。
费用
| 导出规模 | 调用次数 | 费用 |
|---|---|---|
| 一页,约 10 条 | 1 | $0.002 |
| 30 页,约 300 条 | 30 | $0.06 |
| 再加 120 个作者资料 | 150 | $0.30 |
示例
装好 requests 和 openpyxl,设好密钥,然后:
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合并,做法见怎么采集某个话题的微博做舆情分析。 - 标了
ext.is_long_text的微博,拿到的是搜索结果里显示的截断正文。接口目录里没有微博详情接口,取不到全文。 - 全程不需要微博账号或 cookie,见不登录怎么按关键词搜微博。只返回公开微博。
资料来源
- Microsoft 支持:在 Excel 中保留前导零和大数字
- openpyxl 文档
- dataabc/weibo-search issue 208:Excel 里的微博 id 显示成 4.75E+15
- dataabc/weiboSpider issue 565:写入 CSV 时出现乱码
这个问题出现过的地方(读取于 2026-11-12)
更新于