写一个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 相关文章推荐
Python批量修改文件后缀的方法
Jan 26 Python
Python注释详解
Jun 01 Python
Python装饰器实现几类验证功能做法实例
May 18 Python
Tornado高并发处理方法实例代码
Jan 15 Python
python opencv 直方图反向投影的方法
Feb 24 Python
Python简单生成随机数的方法示例
Mar 31 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
Jul 04 Python
树莓派动作捕捉抓拍存储图像脚本
Jun 22 Python
Pandas之groupby( )用法笔记小结
Jul 23 Python
Python中关于logging模块的学习笔记
Jun 03 Python
python re模块常见用法例举
Mar 01 Python
python 模块重载的五种方法
Apr 24 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 和 HTML
2006/10/09 PHP
用PHP生成excel文件到指定目录
2015/06/22 PHP
详解WordPress中用于合成数组的wp_parse_args()函数
2015/12/18 PHP
Prototype PeriodicalExecuter对象 学习
2009/07/19 Javascript
P3P Header解决Cookie跨域的问题
2013/03/12 Javascript
jquery实现div拖拽宽度示例代码
2013/07/31 Javascript
jquery实现图片裁剪思路及实现
2013/08/16 Javascript
js(jQuery)获取时间的方法及常用时间类搜集
2013/10/23 Javascript
juery框架写的弹窗效果适合新手
2013/11/27 Javascript
js获取视频时长代码
2014/04/10 Javascript
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
初始Nodejs
2014/11/08 NodeJs
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
学习JavaScript设计模式之责任链模式
2016/01/18 Javascript
js阻止浏览器默认行为的简单实例
2016/05/15 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
vue如何从接口请求数据
2017/06/22 Javascript
Vue.js学习笔记之常用模板语法详解
2017/07/25 Javascript
bootstrap fileinput实现文件上传功能
2017/08/23 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
原生javascript的ajax请求及后台PHP响应操作示例
2020/02/24 Javascript
[05:48]DOTA2英雄梦之声vol21 屠夫
2014/06/20 DOTA
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
python如何使用unittest测试接口
2018/04/04 Python
Django 使用logging打印日志的实例
2018/04/28 Python
python Django 创建应用过程图示详解
2019/07/29 Python
python3将变量输入的简单实例
2020/08/19 Python
如何设置PyCharm中的Python代码模版(推荐)
2020/11/20 Python
白俄罗斯在线大型超市:e-dostavka.by
2019/07/25 全球购物
幼师自我鉴定范文
2013/10/01 职场文书
新员工培训个人的自我评价
2013/10/09 职场文书
电气技术员岗位职责
2013/11/19 职场文书
品质主管的岗位职责
2013/12/04 职场文书
公司财务自我评价分享
2013/12/17 职场文书
门卫人员岗位职责
2013/12/24 职场文书
你有一份《诚信考试承诺书》待领取
2019/11/13 职场文书