写一个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 相关文章推荐
数据挖掘之Apriori算法详解和Python实现代码分享
Nov 07 Python
教大家使用Python SqlAlchemy
Feb 12 Python
Python提取Linux内核源代码的目录结构实现方法
Jun 24 Python
python实现多线程抓取知乎用户
Dec 12 Python
使用pytorch进行图像的顺序读取方法
Jul 27 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
Jun 17 Python
centos+nginx+uwsgi+Django实现IP+port访问服务器
Nov 15 Python
Python异常继承关系和自定义异常实现代码实例
Feb 20 Python
如何在python中实现线性回归
Aug 10 Python
pycharm配置python 设置pip安装源为豆瓣源
Feb 05 Python
解决pytorch 模型复制的一些问题
Mar 03 Python
python 通过使用Yolact训练数据集
Apr 06 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
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
PHP生成带有雪花背景的验证码
2006/10/09 PHP
PHP获取和操作配置文件php.ini的几个函数介绍
2013/06/24 PHP
PHP实现根据图片色界在不同位置加水印的方法
2015/08/08 PHP
php+jquery+html实现点击不刷新加载更多的实例代码
2016/08/12 PHP
详解PHP如何更好的利用PHPstorm的自动提示
2017/08/18 PHP
详解laravel安装使用Passport(Api认证)
2018/07/27 PHP
JavaScript版代码高亮
2006/06/26 Javascript
Jquery中使用setInterval和setTimeout的方法
2013/04/08 Javascript
jquery获取对象的方法足以应付常见的各种类型的对象
2014/05/14 Javascript
jquery带有索引按钮且自动轮播切换特效代码分享
2015/09/15 Javascript
EasyUI布局 高度自适应
2016/06/04 Javascript
js精确的加减乘除实例
2017/11/14 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
vue项目中添加单元测试的方法
2018/07/21 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
vue瀑布流组件实现上拉加载更多
2020/03/10 Javascript
js实现页面图片消除效果
2020/03/24 Javascript
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
使用实现XlsxWriter创建Excel文件并编辑
2018/05/04 Python
Python HTML解析器BeautifulSoup用法实例详解【爬虫解析器】
2019/04/05 Python
Python正则表达式匹配数字和小数的方法
2019/07/03 Python
python爬虫开发之使用python爬虫库requests,urllib与今日头条搜索功能爬取搜索内容实例
2020/03/10 Python
python将音频进行变速的操作方法
2020/04/08 Python
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
2012/09/08 面试题
Python是如何进行类型转换的
2013/06/09 面试题
大学生个人求职信范文
2013/09/21 职场文书
药品质量检测应届生求职信
2013/11/14 职场文书
机械专业求职信
2014/05/25 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
党的群众路线教育实践活动整改落实情况报告
2014/10/28 职场文书
优秀团队申报材料
2014/12/26 职场文书
项目经理助理岗位职责
2015/04/13 职场文书
刑事上诉状(量刑过重)
2015/05/23 职场文书
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技
Python Django / Flask如何使用Elasticsearch
2022/04/19 Python