给 AI

问答

怎么把微博搜索结果导出成 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 的三个坑

  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,设好密钥,然后:

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,见不登录怎么按关键词搜微博。只返回公开微博。

资料来源

  1. Microsoft 支持:在 Excel 中保留前导零和大数字support.microsoft.com · 读取于
  2. openpyxl 文档openpyxl.readthedocs.io · 读取于
  3. dataabc/weibo-search issue 208:Excel 里的微博 id 显示成 4.75E+15github.com · 读取于
  4. dataabc/weiboSpider issue 565:写入 CSV 时出现乱码github.com · 读取于

这个问题出现过的地方(读取于 2026-11-12)

更新于

接上一次,以后直接问 AI。

新 key 自带 $0.10 试用额度。贴一句话,就能接进你的智能体。

免费开始
一句话接进你的 AI

把这句话发给你的智能体

读一下 https://okdata.online/zh/agents.md,帮我把 okdata 配好;我的 key 在环境变量 OKDATA_API_KEY 里。

Claude Code、Cursor、Codex 等能打开网址的智能体,读完会自己配好。

MCP 地址https://api.okdata.online/mcp