ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

微博备份完整指南:官方导出、第三方工具与自写脚本实战

微博备份完整指南:官方导出、第三方工具与自写脚本实战 你有没有想过自己发过的每一条微博、每一张照片、每一段深夜小作文加起来就是一部个人编年史。我研究微博备份这件事是被一次账号异常彻底刺激的朋友因为异地登录被冻结申诉回来后发现部分原创微博的配图已经变成破损链接原图只能去浏览器缓存里碰运气。从那天起我开始认真系统地把微博备份当成一个正经项目来做也把踩过的坑都记了下来。这篇内容适合所有想把自己的微博数据真正装回自己硬盘的人——不管你是完全零基础还是有一定动手能力都能找到一条能落地的路径。需要先说清楚微博从来没有给普通用户提供一个一键全量备份的按钮所以这个话题注定要围绕官方导出、第三方工具、自写脚本三种方式展开。三者没有绝对优劣只有匹配度问题。下面我会把每条路的完整流程、意外情况和我的实测体验一次性讲透。1. 微博备份到底是在备份什么很多人以为备份就是把微博正文复制到备忘录里这个理解太窄了。一个微博账号里值得保存的数据类型比你想的多得多每一类的备份难度也不一样先分清楚才能制定正确的备份策略。第一类是自己原创的内容发的微博正文、头条文章、配图、视频、地理位置、可见范围。这是大多数人能想到的部分也是备份的绝对核心。第二类是互动痕迹转发记录、点赞过的内容、自己发过的评论、别人在评论区的回复。这类数据代表的是你当时的关注偏好和审美属于上下文信息。只备份正文不看评论等于看一部电影时只看字幕失去了真实的现场感。第三类是关系网络关注列表、粉丝列表、分组设置。这类型的备份难度最高因为官方接口对关系数据的限制最严格而且触发风控的概率也最大。第四类是私信、草稿箱和个人设置私信属于强隐私数据要走官方导出草稿箱是最容易被遗忘的部分我见过不少人的草稿箱里躺着没发出去的小作文等想起来备份时早就被系统清空了。我整理了一个表标注了每类数据的保存位置、备份难度和易忽略程度这是我备份时反复对照的清单数据类型主要保存位置备份难度是否容易忽略原创微博文字时间线接口低否配图原图图片CDN中否视频文件视频CDN高是转发记录转发接口中是评论与回复评论接口中是点赞记录点赞接口中是粉丝/关注列表关系接口高是私信官方数据导出低是草稿箱客户端本地高是这里我想多说一句备份的意义不是备份文字是备份当时的你。微博和私人日记最大的区别在于它是半公开的包含了你和朋友之间的互动闭环、被转发时的传播路径。这些上下文的完整度直接决定了你几年后回看时的体验。只导出正文的备份等于把一部电影缩减成一句剧情简介——能用但非常可惜。2. 三条备份路线的真实对比我见过太多人一上来就问哪个工具最好其实正确思路是先问我适合哪条路线。目前可落地的方式有三条官方导出、第三方工具、自写脚本先把它们放在同一起跑线上比一比。官方导出是微博设置里自带的功能登录后在设置—隐私—个人信息管理附近能找到导出个人信息/下载个人数据之类的入口提交申请后平台会把数据打包发送到你的注册邮箱。优点是完全合规、零代码、没有封号风险缺点是格式不统一、图片原图经常缺失、等待周期长不适合高频使用适合做年度兜底。第三方工具是GitHub上的开源项目或浏览器脚本常见做法是基于网页端接口做增量抓取、自动下载图片视频、生成本地HTML索引。适合不想写代码但动手能力尚可的中间用户。缺点也很明显工具质量良莠不齐年久失修的非常多而且有些工具会把你的登录Cookie写入第三方服务器安全风险需要你自己判断和承担。自写脚本是用Python调用网页端接口按自己的需求把微博数据抓下来。看起来门槛最高但它是唯一能完全控制备份什么、存成什么格式、多久备份一次的路线。我在第五节会详细展开给有一定基础的读者一条可以复现的路径并重点讲那些文档里不会写的坑。三条路不是互斥关系。实践下来最稳的组合其实是官方导出做年度合规兜底 自写脚本做高频增量 本地硬盘与网盘双副本存储。这样既有合规通道的稳定性又有脚本方案的灵活性单一环节出问题不至于全盘皆输。看这张对比表会更直观对比维度官方导出第三方工具自写脚本学习成本最低中等较高是否合规是灰区灰区图片原图完整度经常缺失取决于工具可控可定制程度低低最高Cookie安全官方有泄露风险在自己手里适合频率年度季度周级3. 官方导出的申请全记录与体验3.1 申请入口与验证方式官方导出入口在不同时期的位置不太一样网页端通常在设置—隐私—个人信息管理附近移动端一般藏在我的—设置—账号与安全—个人信息与隐私里。找的时候盯住导出下载个人数据个人信息副本这几个关键词就行。提交申请时一般需要过一次短信验证码部分账号可能还会要求人脸验证。这里有一个容易被卡住的点如果你平时只用小号而这个小号没有绑定手机申请会直接失败。所以第一步先确认账号已经绑定了手机号并且能正常接收验证码。我还遇到过一次特殊情况申请页面提示该功能仅部分用户开放。这说明账号的当前安全等级不够。解决办法不是反复刷新而是先补全安全认证信息比如电子邮箱、实名信息等过一两天再回来尝试。频繁刷申请反而可能触发短时风控拖慢开通速度。3.2 从提交申请到拿到压缩包提交申请之后页面一般会提示将于数个工作日内完成结果发送至注册邮箱。实际等待时间取决于数据量我帮朋友备份一个用了八年、有六千多条微博的账号等了四天半才收到邮件。中途没有任何进度查询入口属于纯等待阶段。邮件里会附带加密压缩包的下载链接解压密码一般会单独发一封短信或邮件告知。这里要特别提醒不要把解压密码和压缩包放在同一个网盘否则加密就失去了意义。我见过有人把导出文件和密码一起打包传到同一个云盘分享链接还转发给朋友帮忙保管这等于数据直接裸奔。解压出来之后的典型结构大致是不同时期的导出包结构会变以实际为准account_info.json账号基本信息weibos/原创微博的文本记录通常是JSON或CSVfollows/关注关系的快照photos/这个目录经常不存在恰恰说明原图缺失问题3.3 官方方案的边界在哪里官方导出的优点是合规、省心、不会封号但这个方案我用了两次之后基本把它定位成兜底而非核心原因有三个。第一图片原图经常缺席。实测导出包里只有微博正文对应的文字记录相当一部分配图需要你回到原帖手工一张张保存。几千条微博根本不可能手动完成所以导出包里图片文件的完整度必须提前做好心理预期别以为拿到了官方包就等于拿到了相册。第二导出结果是数据结构而不是阅读体验。JSON和CSV适合拿去分析或者二次加工但没法像朋友圈相册一样按时间翻看。要让它真正可读你还得额外做一份HTML索引工作量并不小。第三导出周期太长无法高频使用。官方导出不是为每周备份设计的短期内反复申请大概率会被系统拒绝。所以官方方案的合理用法是每年或每两年做一次全量归档日常增量交给脚本两边各司其职。4. 第三方工具实测从选型到翻车4.1 我是怎么筛工具的不想写代码的话选第三方工具时我有一套筛选标准按顺序全部满足才用必须开源能看得到源代码至少能确认它不会把你的Cookie上传到陌生服务器最近一年内有正常更新哪怕只是适配微博页面改版支持增量备份和断点续传否则几万条微博一断就前功尽弃明确说明数据保存在本地不是存在它自己的服务器上。按这个标准筛完其实市面上剩下的没几个。很多看起来炫酷的付费备份工具本质上就是包了一层外皮的浏览器自动点击器微博页面一改版就彻底报废钱花得不值。4.2 一个典型的第三方备份流程以某个GitHub上常见的网页端微博备份工具为例流程大体是五步下载工具并解压、运行本地服务、用手机客户端扫码登录拿到Cookie、工具读取UID和Cookie开始按页抓取、抓取完成后生成一个包含时间线、图片、视频链接的本地文件夹并自动生成HTML总览页。看起来简单但实际跑起来有三个高频翻车点我一个个地点出来你遇到时能少走弯路。4.3 三次翻车现场第一次登录态过期。网页端Cookie有时效限制尤其是网络环境频繁变化的情况下很容易失效。工具抓了一半突然报400错误而且很多工具不支持先校验再抓取导致失败一堆之后你才发现白跑了。所以选工具一定要挑带登录态检测的抓取前先校验Cookie别等失败成片了才回头处理。第二次验证码拦截。连续抓取几百页之后接口会开始不定时返回验证码页面。正确的应对思路不是等它过去而是主动做频率控制。实测下来每抓一页间隔3到5秒连续抓200页就暂停十分钟基本能绕开大部分拦截。如果你只追求快把间隔压到1秒以内反而更容易被判定成自动化操作本来几分钟能跑完的活被拉长到几小时。第三次图片防盗链。很多备份工具下载图片时会批量出现403或404。原因很直接微博CDN要求图片请求必须带上本站的Referer少了这个请求头就会被直接拒绝。好用的工具会自动补Referer有的不会结果就是你正文备份得很完整图片丢了一大半。如果你想手动处理思路就是让下载请求伪装成从 weibo.com 页面里发出的请求设置headers{Referer: https://weibo.com/}就能解决大部分问题。用第三方工具一定要记住一个原则先确认数据落到本地硬盘再谈整理。不管界面做得多好看只要它没有把原始文件写到你的电脑上就不能算完成备份。很多工具界面显示备份完成实际只保存了图片链接的引用而不是图片文件本体这类坑我在后面恢复演练里还会再讲。5. 自己写脚本把微博装进自己的硬盘如果你有一点Python基础又对全量、可控、可复现有执念我强烈建议走这条路。不用被写爬虫吓住核心代码并不复杂。下面这个方案只用到了requests库唯一的门槛是理解微博移动端接口是怎么返回数据的。5.1 准备工作Cookie 和接口探针先用浏览器登录微博网页版打开开发者工具F12在网络面板里随便点开一条微博请求复制请求头里的Cookie。下面代码里的COOKIE就填这个值。Cookie属于敏感信息绝不能提交到公共代码仓库这点务必注意。然后验证接口是不是通的。微博移动端有一个非常经典的JSON接口https://m.weibo.cn/api/container/getIndex常用参数大致是typeuidvalue你的UIDcontainerid107603你的UIDpage页码我的习惯是先把一个带参数的完整请求粘贴到浏览器地址栏里打开如果能看到一串结构化的JSON内容说明Cookie有效、接口可用。看不懂JSON也没关系先把它当成一份有结构的文本下一步直接跑代码。5.2 核心抓取逻辑下面是一段最小可跑的示例作用是抓取指定页码的微博列表并保存为JSONimport requests import json import time UID 你的UID COOKIE 粘贴浏览器里的Cookie session requests.Session() session.headers.update({ User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0 Safari/537.36, Cookie: COOKIE, Referer: https://m.weibo.cn/ }) containerid 107603 UID all_posts [] for page in range(1, 51): url https://m.weibo.cn/api/container/getIndex params { type: uid, value: UID, containerid: containerid, page: page, } resp session.get(url, paramsparams, timeout10) if resp.status_code ! 200: print(fpage {page} 请求失败: {resp.status_code}) break data resp.json() cards data.get(data, {}).get(cards, []) if not cards: # 没有更多卡片了结束翻页 break for card in cards: if card.get(card_type) 9: mblog card[mblog] record { id: mblog.get(idstr), created_at: mblog.get(created_at), text: mblog.get(text), pics: mblog.get(pics), retweeted: bool(mblog.get(retweeted_status)), } all_posts.append(record) print(f已抓取第 {page} 页累计 {len(all_posts)} 条) time.sleep(3) with open(weibo_backup.json, w, encodingutf-8) as f: json.dump(all_posts, f, ensure_asciiFalse, indent2)解释几个关键点。card_type 9表示这张卡片是一条正常微博其他的卡片是广告或者推荐位必须过滤掉。mblog里存的是微博正文、发布时间、图片列表这些核心字段。每抓一页强制停3秒这是我从失败里总结出来的频率底线。另外要提醒你这个接口大概只能翻到最近几千条更早的微博需要用带since_id的游标方式继续翻这超出了这篇文章的范围但上面的代码已经能覆盖绝大多数账号的近期内容了。想全量备份的话可以先用这段代码把近期内容跑通再逐步加游标逻辑。5.3 图片视频的完整落地抓完JSON只完成了三分之一图片和视频才是体积大头。微博正文里的图片默认是缩略图URL里通常带orj360、thumb150这样的字样替换成mw2000或large就能拿到高清原图。当然有些老微博的CDN路径不支持这个替换规则那就在原尺寸里挑最大的那张下载。下载图片时记得带上和抓取时一样的Cookie和Referer否则很容易遇到403。下面是一个最小示例逻辑很简单但能解决我遇到过的大部分图片丢失问题import os def download_image(session, pic_url, save_path): high_quality_url pic_url.replace(orj360, mw2000).replace(thumb150, mw2000) resp session.get(high_quality_url, headers{Referer: https://weibo.com/}, timeout15) if resp.status_code 200: os.makedirs(os.path.dirname(save_path), exist_okTrue) with open(save_path, wb) as f: f.write(resp.content) return True return False视频这块会更麻烦一点正常情况下地址带有时效签名直接请求很容易过期。我的建议是别花时间折腾实时解析老老实实把视频页的永久链接存下来同时保存微博正文里的video_url字段。如果特别想要本地文件再去找支持视频下载的方案但对部分老视频已失效要提前有心理准备。5.4 反爬、频率与数据校验的实战经验这块是血泪教训的重灾区。最早我用脚本抓自己的微博全程不设任何间隔一口气请求了两百页结果IP被限制了好几个小时连正常刷网页都受影响。由此我总结了几条硬规则单次并发固定为1。不要用concurrent.futures去并发请求微博的接口对并发特别敏感每页间隔不低于3秒。看似慢实际最快因为被限制之后的无效请求才是最浪费时间的每50页做一次Cookie有效性探测。如果返回{ok: 0}之类的错误码立刻停下重新扫码登录再继续而不是傻乎乎地跑完全程保存临时进度。每抓一页就往本地.jsonl文件追加一行中断后从断点继续不用从头再来。数据校验同样不能省略。跑完脚本后我习惯做三件事统计JSON条数和网页端显示的微博总数是否在同一量级抽样打开20条微博对比正文文本是否一致检查图片文件夹里的文件数量和JSON里记录的图片数量是否匹配。三项都通过我才会认为这次备份真正完成了。6. 备份验收、本地整理与长期节奏6.1 把备份从半成品变成资料库不管用哪条路线脚本跑出来的JSON和一堆图片严格来说还只是半成品要让它以后真的能翻着看得做一次本地整理。主流做法是生成离线HTML索引把每条微博的时间、正文、图片、转发和评论渲染成一个网页用浏览器随时打开浏览。不会写前端也没关系很多第三方工具自带HTML导出自己抓的JSON也可以用几行脚本遍历生成静态页面或者用pandas转成Excel表格。我自己习惯用三级目录组织这样原始数据、过程数据、可读数据互相隔离weibo_backup/ ├── 00_archive/ # 官方导出的原始压缩包和解压结果 ├── 01_daily/ # 脚本每次增量抓取的结果 └── 02_reading/ # 整理后的按年/月浏览的HTML或Markdown好处很明显想回看时直接进02_reading想二次处理时用01_daily想追溯完整性时去00_archive三层不会互相污染。6.2 恢复演练备份能不能用测一次才知道备份了三年却从未恢复过的人很多我只说一句没做过恢复演练的备份都是心理安慰。恢复演练很简单找个干净的新环境把备份文件夹复制过去尝试打开HTML索引、解压官方压缩包、运行一次图片完整性脚本。哪一步打不开就说明备份流程的哪一环有问题趁早修正。我的一位朋友就是这样踩坑的他的第三方工具一直显示备份成功结果三年后下载下来的HTML索引里图片全是外链外链早已失效所有图片都无法显示。问题不在备份工具而在于工具保存的是图片链接的引用而不是图片文件本体。所以验收时一定要亲眼确认图片文件夹里的文件数和JSON里记录的图片数量是一致的文件确实存在而不是只有链接。6.3 长期备份的节奏建议最后说下节奏。微博数据是持续产生的一次性备份解决不了往后所有时间的问题真正有效的是轻量、高频的增量方案。我目前的节奏是每周脚本增量抓取本周新增微博和图片追加到.jsonl耗时十分钟左右每季度做一次完整跑包合并所有历史与增量重新生成HTML资料库每年走一次官方导出作为合规兜底压缩包加密后存到另一个独立的存储介质。存储介质上我坚持本地硬盘 网盘各一份的双副本策略两个副本之间不要互相知道备份密码。很多人习惯只存云盘我不推荐——云盘账号本身也可能出问题单一副本带来的风险远比想象中高。最后再分享一个容易被忽略的真实经验备份之前先检查自己的微博账号状态再决定备份策略。账号正常时优先自写脚本 季度全量账号一旦出现异常比如频繁要求验证、部分内容被隐藏别犹豫立刻用官方导出申请一次全量兜底。因为这个时候脚本路线可能已经没有完整权限了官方通道反而是最稳定的出口。数据是真金白银别等到内容消失了才想起来备份这回事。
返回列表