写一个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 相关文章推荐
win7安装python生成随机数代码分享
Dec 27 Python
python操作xml文件示例
Apr 07 Python
跟老齐学Python之Import 模块
Oct 13 Python
Python字符编码与函数的基本使用方法
Sep 30 Python
Ubuntu18.04中Python2.7与Python3.6环境切换
Jun 14 Python
Python实现元素等待代码实例
Nov 11 Python
Python 模拟动态产生字母验证码图片功能
Dec 24 Python
Python TCPServer 多线程多客户端通信的实现
Dec 31 Python
最新2019Pycharm安装教程 亲测
Feb 28 Python
Python3爬虫中关于Ajax分析方法的总结
Jul 10 Python
Pandas直接读取sql脚本的方法
Jan 21 Python
Matplotlib绘制条形图的方法你知道吗
Mar 21 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
php面向对象全攻略 (十六) 对象的串行化
2009/09/30 PHP
thinkphp学习笔记之多表查询
2014/07/28 PHP
PHP实现的简单三角形、矩形周长面积计算器分享
2014/11/18 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
PHP中CheckBox多选框上传失败的代码写法
2017/02/13 PHP
php反序列化长度变化尾部字符串逃逸(0CTF-2016-piapiapia)
2020/02/15 PHP
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
jQuery打印图片pdf、txt示例代码
2014/07/22 Javascript
javascript实现的图片切割多块效果实例
2015/05/07 Javascript
Angular.js中用ng-repeat-start实现自定义显示
2016/10/18 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
2017/03/22 Javascript
微信小程序实现手指触摸画板
2018/07/09 Javascript
vue中render函数的使用详解
2018/10/12 Javascript
微信小程序Echarts覆盖正常组件问题解决
2019/07/13 Javascript
[15:39]教你分分钟做大人:龙骑士
2014/10/30 DOTA
详细解析Python当中的数据类型和变量
2015/04/25 Python
Python自动登录126邮箱的方法
2015/07/10 Python
一张图带我们入门Python基础教程
2017/02/05 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
浅析Python函数式编程
2018/10/06 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
2019/08/18 Python
redis数据库及与python交互用法简单示例
2019/11/01 Python
基于torch.where和布尔索引的速度比较
2020/01/02 Python
python pip如何手动安装二进制包
2020/09/30 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
英国水族馆和池塘用品购物网站:Warehouse Aquatics
2019/08/29 全球购物
民主评议党员总结
2014/10/20 职场文书
2014教师年度工作总结
2014/11/10 职场文书
2014年党支部工作总结
2014/11/13 职场文书
小学语文教师年度考核个人总结
2015/02/05 职场文书
毕业论文致谢怎么写
2015/05/14 职场文书
大学毕业晚会开场白
2015/05/29 职场文书
少先队中队工作总结
2015/08/14 职场文书
小学生运动会广播
2015/08/19 职场文书
浅谈Python 中的复数问题
2021/05/19 Python