写一个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 isinstance判断对象类型
Sep 06 Python
浅析Python多线程下的变量问题
Apr 28 Python
浅谈Python 字符串格式化输出(format/printf)
Jul 21 Python
pandas 将索引值相加的方法
Nov 15 Python
详解利用python+opencv识别图片中的圆形(霍夫变换)
Jul 01 Python
python绘制多个子图的实例
Jul 07 Python
对python中assert、isinstance的用法详解
Nov 27 Python
keras打印loss对权重的导数方式
Jun 10 Python
如何用Matplotlib 画三维图的示例代码
Jul 28 Python
Python如何解除一个装饰器
Aug 07 Python
详解scrapy内置中间件的顺序
Sep 28 Python
Python 数据科学 Matplotlib图库详解
Jul 07 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实现动态执行代码的方法
2016/03/25 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
thinkphp分页集成实例
2017/07/24 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
2018/06/14 PHP
Laravel 登录后清空COOKIE的操作方法
2019/10/14 PHP
Laravel修改验证提示信息为中文的示例
2019/10/23 PHP
JavaScript中“基本类型”之争小结
2013/01/03 Javascript
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
js获取客户端网卡的IP地址、MAC地址
2014/03/26 Javascript
jquery.hotkeys监听键盘按下事件keydown插件
2014/05/11 Javascript
javascript初学者常用技巧
2014/09/02 Javascript
javascript检测浏览器的缩放状态实现代码
2014/09/28 Javascript
JS 实现 ajax 异步浏览器兼容问题
2017/01/21 Javascript
NodeJS基础API搭建服务器详细过程记录
2017/04/01 NodeJs
微信小程序中input标签详解及简单实例
2017/05/18 Javascript
vue系列之动态路由详解【原创】
2017/09/10 Javascript
javascript计算渐变颜色的实例
2017/09/22 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
Vuex新手的理解与使用详解
2019/05/31 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
2019/08/23 Javascript
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
Python实现爬虫爬取NBA数据功能示例
2018/05/28 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
详解python读取和输出到txt
2019/03/29 Python
python 字符串格式化的示例
2020/09/21 Python
8款精美的CSS3表单设计(登录表单/下拉选择/按钮附演示及源码)
2013/02/04 HTML / CSS
Hotels.com南非:酒店预订
2017/11/02 全球购物
Luxplus瑞典:香水和美容护理折扣
2018/01/28 全球购物
Gucci法国官方网站:意大利奢侈品牌
2018/07/25 全球购物
广州足迹信息技术有限公司Java软件工程师试题
2014/02/15 面试题
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
考试不及格的检讨书
2014/01/22 职场文书
大二学生职业生涯规划书
2014/02/05 职场文书
教师个人考察材料
2014/12/16 职场文书
《乌鸦喝水》教学反思
2016/02/19 职场文书