写一个Python脚本下载哔哩哔哩舞蹈区的所有视频


Posted in Python onMay 31, 2021

一、抓取列表

首先点开舞蹈区先选择宅舞列表。

写一个Python脚本下载哔哩哔哩舞蹈区的所有视频

然后打开 F12 的控制面板,可以找到一条 https://api.bilibili.com/x/web-interface/newlist?rid=20&type=0&pn=1&ps=20&jsonp=jsonp&callback=jsonCallback_bili_57905715749828263 的 url,其中 rid 是 B 站的小分类,pn 是页数。

写一个Python脚本下载哔哩哔哩舞蹈区的所有视频

小编试着在浏览器将地址打开居然报了 404,可是在控制面板中这个地址的返回值明明就是视频列表。试着去掉 callback 的参数,意外的得到了想要的结果。

写一个Python脚本下载哔哩哔哩舞蹈区的所有视频

众所周知 bid 是一个 B 站视频的唯一 ID,想要获取 bid 可以从上面 url 的返回值中提取 aid,然后将 aid 转换为 bid。

Str = 'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'  # 准备的一串指定字符串
Dict = {}
 
# 将字符串的每一个字符放入字典一一对应 , 如 f对应0 Z对应1 一次类推。
for i in range(58):
    Dict[Str[i]] = i
 
s = [11, 10, 3, 8, 4, 6, 2, 9, 5, 7]  # 必要的解密列表
xor = 177451812 
add = 100618342136696320  # 这串数字最后要被减去或加上
 
def algorithm_enc(av):
    ret = av
    av = int(av)
    av = (av ^ xor) + add
    # 将BV号的格式(BV + 10个字符) 转化成列表方便后面的操作
    r = list('BV          ')
    for i in range(10):
        r[s[i]] = Str[av // 58 ** i % 58]
    return ''.join(r)
 
 
def find_bid(p):
    bids = []
    r = requests.get(
            'https://api.bilibili.com/x/web-interface/newlist?&rid=20&type=0&pn={}&ps=50&jsonp=jsonp'.format(p))
      
    data = json.loads(r.text)
    archives = data['data']['archives']
 
    for item in archives:
        aid = item['aid']
        bid = algorithm_enc(aid)
        bids.append(bid)
 
    return bids

二、获取视频的 CID

想要下载 1080 的视频,光有 bid 是不够的,还需要 登录后 Cookie 中的 SESSDATA 值和 cid 。

首先登录 B 站将 Cookie 中的 SESSDATA 复制到对象头中。用地址为 https://api.bilibili.com/x/player/pagelist?bvid= url 返回 cid。

def get_cid(bid):
    url = 'https://api.bilibili.com/x/player/pagelist?bvid=' + bid
 
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
        'Cookie': 'SESSDATA=182cd036%2C1636985829%2C3b393%2A51',
        'Host': 'api.bilibili.com'
    }
 
    html = requests.get(url, headers=headers).json()
 
    infos = []
 
    data = html['data']
    cid_list = data
    for item in cid_list:
        cid = item['cid']
        title = item['part']
        infos.append({'bid': bid, 'cid': cid, 'title': title})
    return infos

三、下载视频

下载视频的 https://api.bilibili.com/x/player/playurl 来自于每次视频播放完之后的推荐列表。

写一个Python脚本下载哔哩哔哩舞蹈区的所有视频

最后使用 urllib.request.urlretrieve 函数下载视频。

def get_video_list(aid, cid, quality):
    url_api = 'https://api.bilibili.com/x/player/playurl?cid={}&bvid={}&qn={}'.format(cid, aid, quality)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36',
        'Cookie': 'SESSDATA=182cd036%2C1636985829%2C3b393%2A51',
        'Host': 'api.bilibili.com'
    }
    html = requests.get(url_api, headers=headers).json()
    video_list = []
 
    for i in html['data']['durl']:
        video_list.append(i['url'])
    return video_list
 
def schedule_cmd(blocknum, blocksize, totalsize):
    percent = 100.0 * blocknum * blocksize/ totalsize
    s = ('#' * round(percent)).ljust(100, '-')
    sys.stdout.write('%.2f%%' % percent + '[' + s + ']' + '\r')
    sys.stdout.flush()
 
def download(video_list, title, bid):
    for i in video_list:
        opener = urllib.request.build_opener()
        opener.addheaders = [
            ('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36'),
            ('Accept', '*/*'),
            ('Accept-Language', 'en-US,en;q=0.5'),
            ('Accept-Encoding', 'gzip, deflate, br'), 
            ('Range', 'bytes=0-'),  
            ('Referer', 'https://www.bilibili.com/video/'+bid),
            ('Origin', 'https://www.bilibili.com'),
            ('Connection', 'keep-alive'),
 
        ]
 
        filename=os.path.join('D:\\video', r'{}_{}.mp4'.format(bid,title)) 
 
        try:
            urllib.request.install_opener(opener)
            urllib.request.urlretrieve(url=i, filename=filename, reporthook=schedule_cmd) 
        except:
            print(bid + "下载异常,文件:" + filename)

到此这篇关于写一个Python脚本下载哔哩哔哩舞蹈区的所有视频的文章就介绍到这了,更多相关python下载哔哩哔哩视频内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
如何处理Python3.4 使用pymssql 乱码问题
Jan 08 Python
Python爬虫抓取手机APP的传输数据
Jan 22 Python
详解python函数传参是传值还是传引用
Jan 16 Python
python Pandas 读取txt表格的实例
Apr 29 Python
Python实现判断一行代码是否为注释的方法
May 23 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
May 29 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
Apr 15 Python
django框架使用orm实现批量更新数据的方法
Jun 21 Python
浅析pandas 数据结构中的DataFrame
Oct 12 Python
python操作gitlab API过程解析
Dec 27 Python
PyQt5连接MySQL及QMYSQL driver not loaded错误解决
Apr 29 Python
Python代码,能玩30多款童年游戏!这些有几个是你玩过的
Apr 27 Python
python中的plt.cm.Paired用法说明
May 31 #Python
在pycharm中无法import所安装的库解决方案
如何在pycharm中快捷安装pip命令(如pygame)
Python 实现绘制子图及子图刻度的变换等问题
python 利用PyAutoGUI快速构建自动化操作脚本
pandas中DataFrame数据合并连接(merge、join、concat)
Pandas加速代码之避免使用for循环
You might like
Laravel 5框架学习之表单验证
2015/04/08 PHP
PHP如何通过传引用的思想实现无限分类(代码简单)
2015/10/13 PHP
Laravel重写用户登录简单示例
2016/10/08 PHP
详谈PHP面向对象中常用的关键字和魔术方法
2017/02/04 PHP
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
js如何改变文章的字体大小
2016/01/08 Javascript
JavaScript实现的SHA-1加密算法完整实例
2016/02/02 Javascript
BootStrap iCheck插件全选与获取value值的解决方法
2016/08/24 Javascript
JS实现页面数据无限加载
2016/09/13 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
JS调用安卓手机摄像头扫描二维码
2018/10/16 Javascript
JavaScript缺少insertAfter解决方案
2020/07/03 Javascript
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
[02:36]DOTA2英雄基础教程 一击致命幻影刺客
2013/12/06 DOTA
Python读写Excel文件的实例
2013/11/01 Python
详解Python import方法引入模块的实例
2017/08/02 Python
利用Pandas 创建空的DataFrame方法
2018/04/08 Python
python pcm音频添加头转成Wav格式文件的方法
2019/01/09 Python
浅析python 中大括号中括号小括号的区分
2019/07/29 Python
python图形界面开发之wxPython树控件使用方法详解
2020/02/24 Python
Python3 shelve对象持久存储原理详解
2020/03/23 Python
基于Python词云分析政府工作报告关键词
2020/06/02 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
美国尼曼百货官网:Neiman Marcus
2019/09/05 全球购物
工程建设实施方案
2014/03/14 职场文书
大学生个人求职信例文
2014/07/07 职场文书
安全保卫工作竞聘材料
2014/08/25 职场文书
初中家长评语大全
2014/12/26 职场文书
2015年南京大屠杀纪念日活动总结
2015/03/24 职场文书
2015年副班长工作总结
2015/05/15 职场文书
老干部局2015年度工作总结
2015/10/22 职场文书
2016年党员岗位承诺书
2016/03/24 职场文书
Django程序的优化技巧
2021/04/29 Python
浅谈Python中的函数(def)及参数传递操作
2021/05/25 Python
Python中生成随机数据安全性、多功能性、用途和速度方面进行比较
2022/04/14 Python