【爬虫】批量下载B站收藏夹视频 - Python
批量下载B站收藏夹视频
- 起因
- 开发过程
- 环境需求
- B站API介绍
- 收藏夹基本信息
- 收藏夹中各个视频的AV号
- 收藏夹中各个视频的BV号
- 最终代码
起因
不知道大家在浏览自己的B站收藏夹的时候,有没有遇到这样的情况:自己之前的收藏的视频不见了。
然后,一脸懵逼的对着自己的收藏夹发呆,懊恼自己为啥只收藏不下载,捶胸顿足,后悔万分。
综上所述,处于对视频的惋惜以及希望不要再发生这样的事情。写了一个批量下载B站收藏夹视频的python脚本。
以下讲述整个过程。喜欢直接发车的,请跳转到最终代码。
开发过程
人问:为什么我要重复造轮子呢?下载B站视频的工具那么多?
答曰:是的,下载B站视频的工具确实多。但是(Tempermonkey, Chrome Extension, Github, Baidu, Google)确实没有 批量 下载 收藏夹 视频的工具。
于是,我开始了思考,如何批量下载收藏夹视频。
- 首先,我想到的是我正在使用的油猴脚本 Bilibili Evolved. 该脚本自带下载功能。能识别单个视频和番剧,但是收藏夹不行。
- 然后,我又想到它自带的批量下载功能。但是,这项功能需要输入av号且目前只支持av号。
- 因此,我想到了通过爬虫批量获取收藏夹中的bv号,在通过算法得出av号。看了B站专栏上用户樱花三味线发布的复杂算法,果断放弃。
- 开玩笑,是打算按着这个原理,自己写一个转换器的。接下来打开Jupyter otebook, 开始尝试通过requests获取收藏夹视频列表及其bv号。
- 尝试通过登陆后的收藏夹界面获取,失败。因为requests很难模仿b站的登陆。尝试使用Cookie模式登陆,发现不方便。
- 之后发现,收藏夹中的 播放全部 按钮打开的播单,不需要登录即可访问。
- 尝试使用requests获取播单的html文件,发现全是js脚本。并没有任何html元素。立马明白了,b站的页面是页面打开之后,再动态加载的。
- 打开chrome的控制台,刷新界面,通过排查网页发出的请求。发现了b站的获取播放列表信息api。
- 期间,发现了python写的视频下载工具:you-get。但是,它下载速度并不快(我的电脑不快,但是我另一台电脑,在腾讯和优酷上挺快的)。于是,果断使用多进程。
环境需求
- Python 3.6+ 环境
- pip install you-get
- pip install requests
- pip install multiprocessing
B站API介绍
收藏夹播放网址一般为:https://www.bilibili.com/medialist/play/ml941734307/p1 , 其中ml941734307为收藏夹id号
收藏夹基本信息
API地址:https://api.bilibili.com/x/v1/medialist/info?media_id=xxxxxx
将列链接中的xxxxx替换为收藏夹的id号941734307,即可获得收藏夹基本信息。
收藏夹中各个视频的AV号
API地址:https://api.bilibili.com/x/v1/medialist/resource/ids4Player?media_id=xxxxxxx
将列链接中的xxxxxxx替换为收藏夹的id号941734307,即可获得收藏夹中所有视频的av号(收藏的视频所属播单 的其他视频除外)
收藏夹中各个视频的BV号
通过一下的api可以获取收藏夹播放列表中所有的视频信息(json格式)
API地址:https://api.bilibili.com/x/v1/medialist/resource/list?type=3&biz_id=941734307&offset_index=0&from=web&first_page=true&ps=1000
其中
- type=3 表示列表的类型,不要变动。没有具体研究,目前只知type=2的列表需要登录,type=3不需要
- biz_id=730696607 收藏夹的id
- offset_index=0 从收藏夹中的第几个视频开始往后读取
- from=web 表示请求来自web
- first_page=true 当前为第一页
- ps=1000 每次获取多少个视频的info
- 这里设置为1000,因为自定义收藏夹最大为1000,可以保证一次性获取到所有的视频信息
- 设为1000,有时会报错。该API获取播单所有视频的信息(包括视频所属其它播单),若收藏夹中保存了过多其它播单的视频,会导致json字符串过长,超出b站的限制,导致报错。 酌情修改。
最终代码
import requests
from multiprocessing import Pool
import osdef analyse_palylist(ml_link):#获取收藏夹播放列表idml_id = ml_link.split(r'/')[-2][2:]#获取收藏夹基本信息及名称info_api = 'https://api.bilibili.com/x/v1/medialist/info?media_id='+ml_idinfo_res = requests.get(info_api)collection_name = info_res.json()['data']['title']#获取播放列表的所有视频的链接list_api = 'https://api.bilibili.com/x/v1/medialist/resource/list?type=3&biz_id='+ml_id+'&offset_index=0&from=web&first_page=true&ps=1000'res = requests.get(list_api)video_infos = res.json()video_list = video_infos['data']['mediaList']video_link_list = [video_info['short_link'] for video_info in video_list]return collection_name, video_link_listdef download_video(save_dir, link):cmd = r'you-get -o "'+ save_dir +'" "'+ link+'"'os.system(cmd)def current_batch_download(collection_name, save_dir, link_list):p = Pool(8)for link in link_list:p.apply_async(download_video, args=(save_dir,link))p.close()p.join()print(collection_name+" is done...")if __name__ == '__main__':ml_link_list = ['收藏夹网址','https://www.bilibili.com/medialist/play/xxxxxx/p1']base_dir = r'G:\\B站收藏夹\\'for link in ml_link_list:collection_name, video_link_list = analyse_palylist(link)save_dir = base_dir + collection_nameif not os.path.exists(save_dir):os.mkdir(save_dir)print("Start "+collection_name+ " donwloading...")current_batch_download(collection_name, save_dir, video_link_list)
其实,除了使用you-get下载视频之外,还有可直接调用B站的API下载视频和其音频,然后在合并成一个视频。没错,B站确实把音频和视频分开来传输了。这也是为什么,明明B站视频缓冲了,但是你还能听到的原因。播放器同时播放音视频。
不过,这个功能在这里并没有实现,就不多细说了。有兴趣的同学可以自行研究。
以上。
【爬虫】批量下载B站收藏夹视频 - Python相关推荐
- Python网络爬虫实战(五)批量下载B站收藏夹视频
我们除了爬取文本信息,有的时候还需要爬媒体信息,比如视频图片音乐等.就拿B站来说,我的收藏夹内的视频可能随时会失效,所以把它们下载到本地是非常保险的一件事. 对于这种大量列表型的数据,可以猜测B站收藏 ...
- 又一视频下载神器,一键下载b站收藏夹视频和up主所有视频
苏生不惑第219 篇原创文章,将本公众号设为星标,第一时间看最新文章. 之前分享过如何找回bilibili(b站)收藏夹里失效的视频? ,为了以防万一最好把收藏夹的视频都下载了,今天就分享几个好用的工 ...
- 简单python网络爬虫批量下载视频
寒假闲来无事,决定尝试一下用python写一个小网络爬虫批量下载视频. 由于是第一次写网络爬虫,可以说是两眼一抹黑,整个程序都是自己一点点试出来的,所以程序本身肯定有一些漏洞和缺陷,如果有建议请批评指 ...
- python批量下载b站_PYTHON批量下载B站视频小脚本
无聊废话 最近在学习HCIE的视频,收藏了几个相关的视频,结果前几天...视频被下架了了...呃...(⊙o⊙)- 视频被下架 视频被下架了...我学了一半呀...哭... 在网上一顿找,依旧找不到. ...
- (详细思路)利用py批量下载某站的视频
(详细思路)利用py批量下载某站的视频 @[TOC]((详细思路)利用py批量下载某站的视频) 前言 一.视频的种类 二.分析网站 三.视频音频合并 四.想要看的更具体的点击这个网址 总结 前言 某站 ...
- 使用you-get批量下载B站视频
描述是在Mac环境下使用iterm2进行的B站视频下载操作.具体方法如下: 1.需安装Python环境: 2.终端运行 pip/pip3 install you-get 命令,安装 you-get 包 ...
- 利用you-get批量下载bilibili等网站的视频
因为资源保存问题我需要下载b站的一组视频,一共64p 2020.4更新 因为b站从av号改为了bv号,直接下载会出错.下载之前将bv转换为av即可.有个大佬的工具箱很好用可以用下https://too ...
- 【爬虫实战项目】Python爬虫批量下载音乐飙升榜并保存本地(附源码)
前言 今天给大家介绍的是Python爬虫批量下载音乐飙升榜并保存本地,在这里给需要的小伙伴们代码,并且给出一点小心得. 首先是爬取之前应该尽可能伪装成浏览器而不被识别出来是爬虫,基本的是加请求头,但是 ...
- PC端下载B站和yotube视频的简单方法: you-get
简介 you-get是一个基于python3的下载工具,可以轻松下载网络上的图片,视频及音乐,而且速度还可以,亲测达到几M每秒.它也是一款命令行工具,所有命令需要在cmd命令行下实现(win10).这 ...
最新文章
- 注释标记的原则_它关系到平台如何标记操纵的媒体。 这是设计师应遵循的12条原则。
- Oracle-数据实现竖排打印
- 冯珊珊_模拟器企业衡泰信签约冯珊珊,推动高尔夫运动下沉
- 繁体简体转换器 v 1.0
- 产生死锁的四个必要条件
- TigerGraph持续产品创新,发布最新的“全民图”版本
- php explore im,浏栏器-explore.class.php
- xlrd合并单元格的读取的注意事项
- mysql中对象标识符的命名规则,标准规范数据库命名规范.doc
- 如何在虚拟机上安装TrueNAS系统
- Vue3开发教程(全)
- 飞机大战游戏微信小程序源码
- 4g通信模块怎么连接sim卡_SIM卡GPRS模块知识详解 浅谈SIM卡GPRS之原理模块
- linux 最新cpu型号,linux如何查看cpu型号
- 浏览器显示网页的原理 多种情况方式
- easyexcel 检查表头是否匹配_利用easyexcel生成excel文件-自定义表头与数据栏对应的处理方式...
- Scrapy爬虫框架管道文件pipelines数据图像存储
- 教你如何使用SwipeRefreshLayout来构建一个上拉加载下拉刷新框架
- 5分钟读懂UML类图
- 关于Intellij IDEA中文注释字体不统一的解决办法
热门文章
- 蒙特卡洛积分 matlab,菜鸟之路——数学建模之蒙特卡罗积分(投点法,平均值法)+牛顿法解方程组MATLAB实现...
- 机器学习项目:泰坦尼克号幸存者预测
- nginx的负载均衡(centos7)
- windows下使用ELK搭建SGK教程
- 说明书丨链霉亲和素相关研究
- 一个 SAP 开发工程师的 2022 年终总结:四十不惑
- VMware虚拟机更改静态IP报错Unit network.service entered failed state解决方案
- 最有经验的域名注册邮箱运营商:TOM企邮
- axios小记之基本用法
- 方框加对勾怎么输入_Word文档里的□(方框)里怎么加入√(对勾)?