别再对着‘已失效视频’发呆了!5分钟写个Python脚本,自动备份你的B站收藏夹信息到本地TXT

张开发
2026/5/24 22:29:54 15 分钟阅读
别再对着‘已失效视频’发呆了!5分钟写个Python脚本,自动备份你的B站收藏夹信息到本地TXT
用Python打造B站收藏夹自动化备份系统告别失效视频的遗憾每次打开B站收藏夹看到那些变成灰色的已失效视频是不是总有种说不出的失落感那些曾经让你笑过、感动过、学习过的内容就这样无声无息地消失了。与其事后懊恼不如现在就动手用Python构建一个自动化备份系统将你收藏的每一份数字记忆都安全保存下来。1. 为什么需要B站收藏夹备份系统数字内容的脆弱性远超我们的想象。根据一项非正式统计B站用户收藏的视频中平均有5-15%会在一年内因各种原因失效。这些原因可能包括版权问题搬运内容被下架UP主自主删除创作者可能因为各种原因移除内容平台政策调整内容审核标准的变化技术原因视频编码问题导致无法播放传统的收藏功能就像把鸡蛋放在一个篮子里而我们的备份系统则是为这些数字记忆上了保险。通过定期自动备份你可以保留以下关键信息视频标题 UP主信息 视频简介 收藏日期 封面图片URL如果可用提示即使视频失效这些元数据也能帮助你回忆内容甚至可能通过简介中的线索重新找到原始资源。2. 系统设计与技术选型2.1 整体架构设计我们的备份系统将采用模块化设计便于维护和扩展数据采集模块负责从B站API获取收藏夹数据数据处理模块解析和清洗原始数据存储模块将结构化数据保存到本地调度模块实现定期自动备份# 系统架构伪代码示例 class BiliBackupSystem: def __init__(self): self.api_client BiliAPIClient() self.data_processor DataProcessor() self.storage LocalStorage() self.scheduler Scheduler() def run(self): raw_data self.api_client.fetch_favorites() clean_data self.data_processor.process(raw_data) self.storage.save(clean_data)2.2 技术栈选择技术组件选择方案优势HTTP客户端requests库简单易用社区支持好数据处理内置json模块无需额外依赖调度系统schedule库轻量级定时任务本地存储JSON文件纯文本人类可读易于处理为什么不使用数据库对于个人收藏夹备份场景文件存储有显著优势零配置开箱即用便于迁移和分享可以直接用文本工具查看3. 实现核心备份功能3.1 获取B站收藏夹数据B站提供了相对友好的API接口我们可以通过分析网络请求找到收藏夹数据的真实地址。关键步骤如下登录B站网页版打开收藏夹页面使用浏览器开发者工具(F12)监控网络请求查找包含收藏数据的XHR请求典型API端点格式https://api.bilibili.com/x/v3/fav/resource/list?media_id{你的收藏夹ID}pn{页码}ps203.2 Python实现代码下面是完整的备份脚本实现import requests import json from pathlib import Path import time class BiliBackup: def __init__(self, media_id, cookie): self.media_id media_id self.headers { User-Agent: Mozilla/5.0, Cookie: cookie } self.base_url https://api.bilibili.com/x/v3/fav/resource/list def fetch_page(self, page_num): params { media_id: self.media_id, pn: page_num, ps: 20, # 每页数量 order: mtime } try: response requests.get( self.base_url, paramsparams, headersself.headers ) response.raise_for_status() return response.json() except requests.exceptions.RequestException as e: print(f请求失败: {e}) return None def backup_all(self, output_dirbackups): Path(output_dir).mkdir(exist_okTrue) timestamp int(time.time()) output_file Path(output_dir) / fbili_fav_{timestamp}.json all_items [] page_num 1 while True: print(f正在获取第 {page_num} 页...) data self.fetch_page(page_num) if not data or data.get(code) ! 0: break items data[data][medias] if not items: break all_items.extend(items) page_num 1 time.sleep(1) # 礼貌性延迟避免请求过频 with open(output_file, w, encodingutf-8) as f: json.dump(all_items, f, ensure_asciiFalse, indent2) print(f备份完成共保存 {len(all_items)} 个视频信息到 {output_file}) return output_file3.3 关键参数说明media_id你的收藏夹ID可以从API URL中获取cookie你的B站登录cookie用于认证output_dir备份文件保存目录注意请妥善保管你的cookie信息不要分享或上传到公开平台。4. 进阶功能与优化4.1 自动化定期备份使用schedule库可以轻松实现定时任务import schedule import time def job(): print(开始执行定时备份...) backup BiliBackup(media_id你的收藏夹ID, cookie你的cookie) backup.backup_all() # 每天凌晨3点执行备份 schedule.every().day.at(03:00).do(job) while True: schedule.run_pending() time.sleep(60)4.2 增量备份策略为避免重复备份相同内容我们可以实现简单的增量逻辑def get_existing_ids(backup_dir): 获取已备份视频的ID集合 ids set() for file in Path(backup_dir).glob(*.json): with open(file, r, encodingutf-8) as f: data json.load(f) ids.update({item[id] for item in data}) return ids def incremental_backup(backup): existing_ids get_existing_ids(backups) new_items [] page_num 1 while True: data backup.fetch_page(page_num) if not data: break items data[data][medias] if not items: break # 只保留新视频 new_items.extend( item for item in items if item[id] not in existing_ids ) page_num 1 if new_items: timestamp int(time.time()) output_file Path(backups) / fbili_incremental_{timestamp}.json with open(output_file, w, encodingutf-8) as f: json.dump(new_items, f, ensure_asciiFalse, indent2) print(f增量备份完成新增 {len(new_items)} 个视频)4.3 数据可视化与搜索备份的数据可以进一步加工比如生成统计报表import pandas as pd from datetime import datetime def generate_report(backup_dir): all_items [] for file in Path(backup_dir).glob(*.json): with open(file, r, encodingutf-8) as f: all_items.extend(json.load(f)) df pd.DataFrame(all_items) df[收藏时间] pd.to_datetime(df[fav_time], units) # UP主视频数量统计 up_stats df[upper].apply(lambda x: x[name]).value_counts().head(10) # 按月统计收藏量 monthly df.set_index(收藏时间).resample(M).size() print(\n收藏统计报告:) print(f总视频数: {len(df)}) print(\n最常收藏的UP主TOP10:) print(up_stats) print(\n按月收藏趋势:) print(monthly)5. 部署与使用指南5.1 获取必要参数获取收藏夹media_id打开B站网页版进入你的收藏夹在URL中找到sid或media_id后面的数字获取登录cookie登录B站后按F12打开开发者工具进入Network(网络)标签页刷新页面找到任意XHR请求在Headers中找到Cookie字段5.2 首次运行配置将以下代码保存为config.ini[bilibili] media_id 你的收藏夹ID cookie 你的cookie字符串 [backup] output_dir ./backups interval_days 15.3 完整使用流程安装依赖pip install requests schedule pandas创建并配置config.ini运行主脚本import configparser from datetime import datetime config configparser.ConfigParser() config.read(config.ini) backup BiliBackup( media_idconfig[bilibili][media_id], cookieconfig[bilibili][cookie] ) # 执行完整备份 backup.backup_all(output_dirconfig[backup][output_dir]) # 或者设置定时任务 if config.getboolean(backup, scheduled, fallbackFalse): schedule.every( int(config[backup][interval_days]) ).days.do(backup.backup_all) while True: schedule.run_pending() time.sleep(60)在实际项目中我发现将备份文件按日期组织特别有用比如backups/2023-08/2023-08-15.json这样的结构。另外定期比如每季度将备份文件压缩归档也是个好习惯可以节省存储空间。

更多文章