B站收藏夹导出实操:用Python调API备份视频列表,告别数据丢失
1. 收藏夹导出的核心思路与方案选型1.1 为什么你需要导出B站收藏夹先说个扎心的现实:B站收藏夹里的内容随时都可能消失。UP主删稿、番剧下架、视频被锁、专栏被清空这些都是常态。我印象最深的一次是某位做影视解说的UP主一夜之间清空了上百个视频不少人的收藏夹直接塌了一半。还有更糟的情况——有些视频还在但被UP主改了标题和分区你回头根本找不到当初收藏它的理由。另一个现实是收藏夹本身也有管理问题。我的收藏夹巅峰时期有2000多个视频想找一条收藏过的教程得翻几十页。为了彻底解决收藏吃灰的问题我养成了一个习惯定期把收藏夹导出成文件归档配合本地笔记软件做二次整理。后来也在B站刷到不少人的求助帖换了手机、清了缓存之后收藏夹一片空白或者账号异常被封收藏全没了。这时候如果有一份导出的备份损失就小得多。所以这篇就把B站收藏夹导出的几个主流方案、完整操作步骤、以及我踩过的坑都整理出来适合收藏夹超过50条、想系统性整理内容、或者担心账号数据丢失的朋友参考。1.2 三种方案选型对比脚本直取、现成工具、第三方服务市面上的B站收藏夹备份方案归纳起来主要有三条路。我按推荐程度和适用人群排个序方案一自用脚本调接口最推荐B站本身有收藏夹相关的API接口。通过模拟网页端收藏夹页面的请求可以把某一收藏夹下的视频列表一条条拉取下来保存成JSON、CSV、Markdown等格式。这种方式灵活度高想导出字段就能导出什么字段而且不依赖第三方服务数据始终掌握在自己手里。缺点是需要有一点Python基础或者至少愿意照着教程复制代码、安装环境。不过好消息是B站的接口结构并不复杂你在网页上能看到的收藏内容基本都能在接口返回值里找到。方案二浏览器插件 / 开源工具省事有一些现成的开源工具比如“B站收藏夹导出器”之类的浏览器脚本、油猴插件、或者带界面的桌面小工具。它们通常已经把接口封装好了你登录B站之后点两下就能导出。这类工具适合完全不想碰代码的朋友。缺点是有的工具年久失修接口改动之后就没法用了部分第三方工具要你提供Cookie有账号安全隐患还有一些工具会在导出的文件里加自己站点的推广信息属于半公益性质看个人接受度。方案三通过B站开放平台 / 第三方数据服务不推荐B站开放平台对个人开发者门槛不低需要创建应用、申请权限而且收藏夹接口并不是随便就能拿到的开放能力。市面上也有一些第三方数据服务宣称可以帮你备份B站数据但说实话把Cookie或者账号信息交给它们风险大于收益我基本不碰。我的建议很简单想长期用、稳定用就选方案一。一次性想导出个小备份选方案二也行。方案三我直接劝退安全性没法保证。2. 理解B站收藏夹的数据结构和接口原理2.1 搞清楚数据是怎么存的收藏夹、视频、失效内容动手写脚本之前先花两分钟理解B站的收藏夹体系后面会省很多折腾的时间。每个B站账号可以创建多个收藏夹也支持“默认收藏夹”。每个收藏夹有一个唯一的ID叫media_id。当前登录用户还可以通过另一个fid来标识收藏夹归属但你作为个人导出自己的收藏只要拿到media_id就够了。收藏夹下挂的是一堆视频资源每个视频有它的bvid或aid、标题、UP主信息、封面图、收藏时间等字段。在实际导出过程中你会遇到一个关键情况失效视频。B站收藏夹里如果一个视频被UP主删除、被平台下架、或者因为其他原因无法访问接口返回的数据里会带有state字段来标识。有的接口返回数据会帮你过滤掉这些失效视频有的不会需要你自己处理。从我的实测来看如果你用网页端收藏夹页面的那个接口失效视频也会返回但相关信息是残缺的比如title字段为空、uri字段缺失。做归档的时候建议把这些失效视频单独标记不要让它和正常视频混在一起。否则后期整理会非常难受。还有一个容易被忽略的点收藏夹分“公开”和“私密”两种。公共收藏夹在其他人访问时可以通过不带Cookie的请求拿到内容但你自己的私有收藏夹必须带登录态Cookie才能访问。所以想导出全部收藏包括私密收藏夹就一定得处理Cookie登录态这一步绕不开。2.2 关键接口解析从网页端逆向出来的请求链路B站网页版收藏夹页面有两个核心接口我实测用的是下面这两个第一个是“获取收藏夹视频列表”的接口https://api.bilibili.com/x/v3/fav/resource/list。请求方式是GET关键参数有media_id收藏夹ID必填。pn页码从1开始。ps每页数量。我实测发现这个接口的ps最大可以拉到20再大会返回错误。所以2000个视频的收藏夹大约要翻100页。platform建议填web默认网页端行为。order排序方式mtime是按收藏时间排序view是按播放量排序默认即可。请求头里最核心的是cookie。你登录B站网页端之后浏览器里的Cookie就带着你的登录凭证。只有拿到Cookie接口才能识别你的身份返回你私有收藏夹的数据。同时建议带上user-agent和referer稍微降低被风控的概率。第二个是“获取当前账号所有收藏夹信息”的接口。如果你想批量导出所有收藏夹的数据可以先用https://api.bilibili.com/x/v3/fav/folder/created/list-all获取你创建的所有收藏夹ID列表然后再逐一对每个media_id调用第一个接口拉取数据。这个接口需要的参数更简单主要是up_mid也就是你自己的用户ID。Cookies同样必带。为了避免给B站服务器增加不必要的压力导出时我习惯在两个请求之间加0.3~0.5秒的延时。收藏夹很多、视频很多的时候慢慢跑就好没必要开高并发——真被封了IP反而得不偿失。2.3 为什么我不建议直接爬网页解析成本高、易失效可能有人会问直接用爬虫解析网页HTML不行吗把收藏夹页面的源码下载下来然后正则提取里面的视频标题和链接听起来更直接我在早期确实尝试过这条路但很快就放弃了。原因有三个第一B站前端是典型的SPA单页应用收藏夹内容是通过JavaScript异步加载的直接抓取HTML只能拿到一个空壳框架视频列表压根不在里面。第二就算你用无头浏览器比如Selenium模拟网页操作每次加载一页收藏夹都要渲染大量图片、样式、脚本速度极慢。接口请求是毫秒级浏览器模拟是秒级差距很大。第三网页前端代码会频繁改版今天能用的Selector明天可能就失效了。而API接口相对稳定因为B站自己的客户端、网页端都重度依赖这些接口它们不能随便改。所以从长期维护的角度写接口脚本远比写网页爬虫稳妥。总结一句话能用接口解决的就不要折腾网页爬虫。3. 导出前的准备工作和参数获取3.1 获取Cookie登录态三种方法按需选择Cookie是调用B站收藏夹接口的核心凭证绕不开。我分享三种获取Cookie的方法按操作难度排序方法一浏览器开发者工具最直观打开Chrome或Edge浏览器访问https://www.bilibili.com并登录你的账号。按F12打开开发者工具切到Network标签页。刷新一下页面在请求列表里随便点开一个请求比如x开头的接口请求。在右侧面板里找到Request Headers找到cookie字段复制它的完整值。这个Cookie是一串比较长的文本类似于SESSDATAxxxx; bili_jctxxxx; buvid3xxxx; ...几个字段之间用分号隔开。直接整段复制即可。方法二浏览器控制台提取更方便同样先登录B站然后在开发者工具的Console标签页里输入document.cookie回车浏览器会把当前域名的Cookie直接打印出来。这样做比方法一手动翻请求头要快一点。但注意document.cookie拿到的Cookie字段可能不完整——有些带HttpOnly属性的Cookie在JS里是看不到的比如SESSDATA恰恰是关键字段。所以这个方法有风险我建议优先用方法一。方法三使用Cookie导出插件浏览器商店里有不少Cookie导出插件一键导出当前网站的所有Cookie。这种方案对于不熟悉开发者工具的朋友最友好。但同样要注意插件会读取你在所有网站上的Cookie安全风险较高。建议使用开源、评价好的插件用完尽快卸载。Cookie安全提醒重要Cookie相当于你账号的临时钥匙尤其是SESSDATA这个字段拿到它的人可以在一定时间内直接操作你的账号。千万不要把Cookie完整片段发到网上不要发给陌生人不要贴到公开的GitHub仓库里。我见过不少因为泄露Cookie导致账号被恶意操作、甚至被封的案例这一点再怎么小心都不为过。3.2 获取收藏夹IDmedia_id和用户IDmid有了Cookie之后还需要找到你要导出的收藏夹ID。最直接的方法打开B站进入你的收藏夹页面。此时浏览器地址栏的URL会是这样https://space.bilibili.com/你的UID/favlist?fid收藏夹ID或者你在网页端“我的收藏”页面点击一个收藏夹之后地址栏里会有一个fid或者media_id的参数。这个数字就是收藏夹ID。如果地址栏里没有显式的参数可以按F12打开开发者工具在Network里筛选fav关键词然后点一下你的收藏夹。请求的Query String参数里会带media_id记下来即可。用户IDmid也简单进入你自己的B站个人空间主页地址栏URL里那串数字就是你的mid。比如space.bilibili.com/12345671234567就是mid。这个信息备用后续脚本里会用到。3.3 准备运行环境Python和依赖库我推荐用Python 3来跑导出脚本。原因很简单语法简单、第三方库丰富、社区案例多遇到问题容易搜到解答。下载Python时认准官网python.org别从乱七八糟的镜像站下载。安装时务必勾选Add Python to PATH不然命令行里敲python会提示找不到命令。装完之后在终端Windows下是CMD或PowerShellmacOS/Linux下是Terminal里执行python --version能正确打印出版本号就说明环境没问题。接下来安装需要用到的第三方库。导出脚本主要依赖两个库requests用来发HTTP请求调B站API。pandas可选如果想把结果导出成Excel或者更方便地处理表格数据装一个会方便很多。在终端执行pip install requests pandas如果你是在国内网络环境下用pip安装速度很慢可以临时指定清华镜像源pip install requests pandas -i https://pypi.tuna.tsinghua.edu.cn/simple等待安装完成即可。4. 完整实操三步导出收藏夹数据4.1 第一步拉取所有收藏夹列表可选但推荐如果你想一次性导出全部收藏夹先跑一个小脚本拿到所有收藏夹的基础信息和ID列表。在项目目录下新建一个文件get_folders.py内容如下import requests import json # 填入你的cookie COOKIE 这里粘贴你的完整cookie # 填入你的用户mid MID 这里粘贴你的数字UID HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, Referer: https://www.bilibili.com/, Cookie: COOKIE } def get_all_folders(): url https://api.bilibili.com/x/v3/fav/folder/created/list-all params { up_mid: MID, } resp requests.get(url, paramsparams, headersHEADERS, timeout10) data resp.json() if data[code] ! 0: print(请求失败, data[message]) return [] folders data[data][list] result [] for f in folders: result.append({ id: f[id], title: f[title], media_count: f[media_count], privacy: 公开 if f[attr] 0 else 私密 }) return result if __name__ __main__: folders get_all_folders() print(json.dumps(folders, ensure_asciiFalse, indent2))运行方式python get_folders.py返回结果中会列出每个收藏夹的id、名称、视频数量和可见性。拿到后把你要导出的收藏夹id记下来。如果你只想导出一个收藏夹这步获得的id就是下一步要用的media_id。需要注意这里的接口只返回“你创建的”收藏夹不会返回你收藏过的别人创建的收藏夹。不过一般人的收藏都会塞进自己创建的收藏夹里这个差异影响不大。4.2 第二步拉取收藏夹内全部视频列表并保存为CSV拿到收藏夹ID之后就可以写核心导出脚本了。新建文件export_fav.pyimport requests import csv import time import json COOKIE 这里粘贴你的完整cookie MEDIA_ID 这里粘贴你的收藏夹id HEADERS { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36, Referer: fhttps://www.bilibili.com/medialist/detail/ml{MEDIA_ID}, Cookie: COOKIE } def fetch_page(pn, ps20): url https://api.bilibili.com/x/v3/fav/resource/list params { media_id: MEDIA_ID, pn: pn, ps: ps, order: mtime, platform: web } resp requests.get(url, paramsparams, headersHEADERS, timeout10) data resp.json() if data[code] ! 0: raise RuntimeError(fAPI返回异常{data[message]}) return data[data] def main(): page 1 all_items [] while True: print(f正在抓取第 {page} 页...) result fetch_page(page) medias result.get(medias, []) if not medias: break for m in medias: item { 标题: m.get(title, ), BV号: m.get(bvid, ), UP主: m.get(upper, {}).get(name, ) if m.get(upper) else , UP主UID: m.get(upper, {}).get(mid, ) if m.get(upper) else , 收藏时间: time.strftime(%Y-%m-%d %H:%M:%S, time.localtime(m.get(fav_time, 0))), 视频链接: fhttps://www.bilibili.com/video/{m.get(bvid, )}, 简介: m.get(intro, ), 状态: 正常 if m.get(state, 0) 0 else 失效 } all_items.append(item) # 判断是否还有下一页 if result.get(has_more) and page result.get(count, 0) // 20 1: page 1 time.sleep(0.5) # 礼貌性延时 else: break print(f共获取 {len(all_items)} 条数据) # 保存为CSV csv_filename fbilibili_fav_{MEDIA_ID}.csv with open(csv_filename, w, newline, encodingutf-8-sig) as f: writer csv.DictWriter(f, fieldnames[标题, BV号, UP主, UP主UID, 收藏时间, 视频链接, 简介, 状态]) writer.writeheader() writer.writerows(all_items) # 同时保存一份JSON方便后续做数据二次处理 json_filename fbilibili_fav_{MEDIA_ID}.json with open(json_filename, w, encodingutf-8) as f: json.dump(all_items, f, ensure_asciiFalse, indent2) print(f已保存 {csv_filename} 和 {json_filename}) if __name__ __main__: main()运行python export_fav.py脚本跑完之后你会得到两个文件。CSV文件直接用Excel或WPS打开就是一张清晰的表格每一行对应一条收藏记录包含标题、BV号、UP主、收藏时间等信息。JSON文件适合程序员做后续的数据处理比如做分类、统计、去重或者写进自己的笔记系统。有个细节要提醒CSV文件我用的是utf-8-sig编码。如果你用普通utf-8编码Excel打开中文会乱码。加了-sig也就是带BOMExcel就能正确识别。这个坑我第一版脚本就踩过写完当时没注意回头打开全是乱码整个人都不好了。4.3 第三步数据二次处理——去重、分类、失效标记导出数据只是第一步真正提升效率的是导出之后的整理。这里分享几个我常用的数据清洗思路去重如果收藏夹里有很多重复收藏可以用CSV文件的“删除重复项”功能按BV号去重。B站的BV号是每个视频的唯一身份标识用它去重最可靠不要按标题去重——同一个视频可能在不同时期被UP主改过标题按标题去重会误杀。分类在我的工作流里我会在CSV里加一列“分类”然后根据自己的需求把视频打上标签。比如技术教程类、纪录片类、鬼畜娱乐类、灵感素材类等等。这个活儿没有脚本能全自动完成但可以半自动先把所有标题拉出来过一遍按关键词归类再用Excel的筛选功能批量打标签。1000条数据大概半小时能整理完比在网页上一个一个找快得多。失效标记导出的数据里已经帮你标记了状态字段。看到“失效”的数据建议直接建一个“失效备份.txt”或者单独的工作表记下来记录标题和BV号。因为这些内容你在B站上已经打不开了但BV号是唯一的将来如果有机会在别的平台找到转载还能靠BV号关联回去。关联笔记工具整理完的CSV可以导入Notion、Obsidian、语雀或者任何你在用的笔记工具。我个人现在的流程是每季度导出一次收藏夹整理完导入Notion数据库在数据库里按分类和收藏时间筛选慢慢把真正值得看的内容消化掉。收藏夹从此不再是吃灰仓而是变成了一个内容处理管线。5. 常见问题与排查技巧实录5.1 接口返回-101 / 请求失败Cookie失效或权限不足-101是B站接口常见的错误码通常表示“未登录”或“登录状态无效”。排查路径很清晰先去B站网页端确认你的登录状态是否正常。Cookie是有有效期的我实测SESSDATA的有效期大概在30天到180天之间过期了就重新登录一次。检查Cookie是否粘贴完整。尤其是SESSDATA、bili_jct、buvid3这几个关键字一个都不能少拼接的时候不要把换行符或者空格带进去。确认你的Cookie是从www.bilibili.com这个域名下获取的而不是从m.bilibili.com或者api.bilibili.com下获取的否则可能缺失关键字段。实在搞不定的有一个终极大法换无痕窗口重新登录B站再重新抓一次Cookie。无痕窗口能保证没有旧Cookie干扰抓到的一定是新鲜完整的。5.2 只能抓到前几页数据分页参数没有循环好如果你发现脚本只输出了第一页或者前几页数据就停了大概率是分页逻辑出了问题。最保险的做法是先检查返回的JSON里has_more字段的值以及count字段代表的总数据量。我自己的写法里是这样处理的has_more为true就继续下一页同时用count // 20 1算出总页数双保险避免漏掉最后一页。有些情况下即使没有has_more字段也可以通过判断medias列表是否为空来终止循环。还有一个小坑如果你中途把ps改了比如从20改成50页数计算也要同步改否则要么循环提前结束要么多跑几页空请求。我自己就吃过这个亏改了ps忘了改页数判断结果数据漏了三分之一。5.3 导出的标题是乱码编码问题全套排查看这里乱码分为两种情况第一种是终端里打印的中文乱码但保存进文件是正常的。这种情况一般是Windows终端默认编码不是UTF-8不影响最终文件不用管它。第二种是CSV文件用Excel打开乱码。解决方案是保存CSV时用utf-8-sig编码而不是utf-8。我前面的脚本里已经处理好了如果你自己改过代码注意保持一致。第三种是CSV正常但用Notion或Obsidian导入时乱码。这种通常是导入工具默认按GBK解码你在导入时手动选择UTF-8编码即可。5.4 请求频繁被风控降速、加延时、避免并发B站对API请求有频率限制。如果你发现跑了一会儿之后接口开始返回-412请求被拦截之类的错误码说明你的请求频率太高了触发了风控。解决办法把每个请求间隔从0.5秒调到1~2秒取消并发。如果你是拿自己的账号导自己的数据正常速度跑完全不会触发风控。真正会触发风控的是那种不加延时一口气刷几百页的“暴力请求”那显然不符合正常用户行为。万一真的被临时限制了不要继续尝试请求。等个10~30分钟让风控策略自动解除再继续。千万别反复换IP死磕账号安全比导出数据重要得多。6. 进阶玩法全量导出后还能做什么6.1 用Markdown生成网页书签页CSV适合存档和表格操作但如果你想弄一个漂亮、方便点击的书签导航页我建议把收藏夹数据转换成Markdown格式。格式大概是# 我的B站收藏夹备份 ## 技术教程 - [【Python入门】从零开始学爬虫](https://www.bilibili.com/video/BV1xxxx) - [Docker 入门实战教程](https://www.bilibili.com/video/BV1yyyy) ## 纪录片 - [地球脉动 第一集](https://www.bilibili.com/video/BV1zzzz)这种Markdown文件可以直接发布到支持Markdown的笔记平台、GitHub仓库或者转成HTML做成本地书签页。浏览器打开之后点击链接直接跳转B站对应视频体验比在收藏夹里翻页舒服多了。写一个简单的Python函数就能批量生成Markdown。把CSV读进来按分类字段分组然后拼接字符串输出到.md文件。这个过程也很快这里不展开了。6.2 定时备份每周自动导出收藏夹如果你收藏频率高希望收藏夹始终有一份新鲜备份可以把脚本放进定时任务里。Windows下用“任务计划程序”macOS/Linux下用cron。Windows的配置要点在“任务计划程序”里新建任务触发器选“每周”操作选“启动程序”程序填python.exe的完整路径参数填你的脚本完整路径起始于填脚本所在目录。确保电脑在计划时间点是开机状态否则会错过执行。macOS和Linux用cron的话先执行crontab -e然后加一行0 3 * * 1 cd /path/to/your/script /usr/bin/python3 export_fav.py这行代表每周一凌晨3点执行一次导出脚本。注意cron的环境变量和登录终端不一样最好使用Python的绝对路径避免找不到命令。6.3 批量下载视频到本地谨慎使用如果你想把收藏的视频本身也下载下来B站收藏夹可以和yt-dlp配合使用。方法很简单先通过脚本把收藏夹里所有视频的BV号导出来然后调用yt-dlp批量下载。但这个操作有几个前提要说清楚第一下载视频仅限个人学习和备份用途不能二次传播第二B站对视频下载有防盗链和频率限制批量下载要控制并发建议加--limit-rate限制下载速度第三很多UP主不希望自己的视频被下载尊重创作者意愿也很重要。我个人的习惯是视频本身不追求全部下载只下载那些真正怕丢失的珍贵内容比如绝版课程、个人生活记录、已经停更UP主的作品。其他的记录下来链接就够了。7. 写在最后的一点经验从最早手动复制粘贴收藏夹链接到现在定期自动导出、分类、归档这一套流程帮我解决了很多实际问题。收藏夹管理其实和整理实体书架是一个道理——不是把书买回来放着就完事了而是要让它真正成为你可以随时调取的资源。如果你只记住三个关键点那我要强调的依次是Cookie安全第一不要随便把登录凭证交给第三方接口请求尽量温和不要暴力刷新导出之后要及时整理归档否则导出的文件过几个月自己就看不懂了。我的第一份导出的CSV文件因为没有加分类和备注现在打开基本想不起来当时收藏这些视频是为了什么。这个方案本身并不复杂你也完全可以按照自己的需求进一步扩展比如加上视频封面图下载、加上弹幕和评论导出、或者把收藏夹内容同步到自己的个人网站。只要掌握了接口调用的思路这些扩展点都非常好实现。希望这篇记录能帮你的B站收藏夹从此不再“吃灰”。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →