首页 编程教程正文

bilibili批量获取视频下载链接脚本,请大家指教

piaodoo 编程教程 2020-02-22 22:07:33 1001 0 python教程

本文来源吾爱破解论坛

本帖最后由 thepoy 于 2019-9-19 10:50 编辑

首先要找到视频的唯一ID,翻来翻去才找到。

image.png (642.61 KB, 下载次数: 5)

下载附件  保存到相册

2019-7-19 21:32 上传


本人刚玩B站,不是很了解,不知道这个 aid 是不是传说中的番号

以链接 https://www.bilibili.com/video/av14184325/ 为例,共536个视频。
红框里可以看见每个视频都有唯一的ID——cid。
接下来就简单了,正则表达式(bs4也可以),将所有的视频信息都挑出来。      *   不知道这种情况用正则表达式好还是bs4好,请大佬指教!

在kanbilibili上找到下载链接

image.png (241.86 KB, 下载次数: 6)

下载附件  保存到相册

2019-7-19 21:53 上传




----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
我想直接通过python进行视频下载,实时显示下载进度和网速,但是能力有限,不知道怎么敲代码。


请问大佬们,应该怎么实现呢?
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
下面是下载和重命名的代码,运行完下载脚本后,会在脚本所在的目录下生成一个存储你所选择的集数范围的下载链接的txt和一个存储所有视频文件名的txt

需要注意的是:
    1、解释器的路径(就是第一行#!/usr....)需要改成自己电脑上python的路径
    2、下载脚本第92行,会在你指定的路径下创建一个以aid命名的目录,一定要改成你自己想要保存的路径。   
    3、重命名脚本第27行,改成与第2条里相同的路径。

下载code:
[Python] 纯文本查看 复制代码
#!/usr/local/Cellar/python/3.7.4/bin/python3
# -*- coding: utf-8 -*-

import requests
import json
import re
import os

# 获取所有的视频信息
def videos_info(headers, aid):
    # av后面的数字就是 aid
    b_url = 'https://api.bilibili.com/x/web-interface/view?aid=' + aid
    web_data = requests.get(b_url,headers=headers)
    all_info = json.loads(web_data.text)
    return all_info['data']['pages']

# 从kanbilibili中找到包含每一个视频的下载链接的链接
def videos_url(start, end, all_info, aid):
    if end == 0:
        end = len(all_info)
    while True:
        choice = input('你是否要下载 %d 集到 %d 集的视频?(Y/n)' % (start, end))
        if choice == 'Y' or choice == 'y':
            break
        elif choice == 'N' or choice == 'n':
            pass
        else:
            print('你的选择有误,选择指令["Y"]为是,["n"]为否,请重新选择!')
            continue
        start = input('请重新输入你要从哪一集开始下载:(默认:1)')
        if start == '':
            start = 1
        else:
            start = int(start)
        end = input('请重新输入到哪一集结束(默认:最后一集):')
        if end == '':
            end = len(all_info)
        else:
            end = int(end)
    urls = []
    print('正在获取所选视频的下载链接,请稍候...')
    # start-1是要下载的第一个视频的索引(下标),end本身到不了,不需要-1
    for i in all_info[start-1:end]:
        page = str(all_info.index(i) + start)
        # 到这步的时候我才发现之前的videos_info可以完全不通过B站搞定,B站爬数据还得用cookie
        # 有kanbilibili这种神奇的网哪里用那么麻烦
        # 在kanbilibili上选择好清晰度「quality」只有三个值:32(480p), 64(720p), 80(1080p)]
        # 我用的是80,可以自己设置
        url = 'https://www.kanbilibili.com/api/video/' + aid + '/download?cid=' + str(i['cid']) + '&quality=80&page=' + page
        urls.append(url)
    return urls

# 真正的视频下载链接
def down_urls(urls,headers):
    down_urls = []
    for i in urls:
        down_web = requests.get(i,headers=headers)
        tmp = json.loads(down_web.text)
        # 一大堆字典里挑出有用的数据对我来说是最头疼的事,我是一点一点肉眼找的,不知道有没有好的办法
        down_url = tmp['data']['durl'][0]['url']
        down_urls.append(down_url)
    return down_urls

def main():
    while True:
        url = input('请随便输入一集你要下载的视频的链接:')
        if url == '':
            print('您的输入为空,请重新输入!')
            continue
        else:
            break
    headers = {
        'UserAgent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
        'Cookie': "你自己的cookie"
    }
    aid = re.search(r'av(\d*)', url).group(1)
    all_info = videos_info(headers, aid)
    print('此专辑共有 %d 集视频。' % all_info[-1]['page'])
    start = input('你要从哪一集开始下载?(默认:1)')
    if start == '':
        start = 1
    else:
        start = int(start)
    end = input('你想下到哪一集结束?(默认:最后一集)')
    if end == '':
        end = 0
    else:
        end = int(end)
    all_urls = videos_url(start, end, all_info, aid)
    urls = down_urls(all_urls, headers)
    try:
        os.mkdir('/Volumes/MAC专用/前端/' + str(aid))
    except FileExistsError:
        pass
    # 记录所有视频的名字和cid到aid.txt中,方便为下载的所有视频重命名
    with open(str(aid) + '.txt', 'w') as f:
        for i in all_info:
            f.write('%d %s,%d\n' % (all_info.index(i) + 1, i['part'], i['cid']))
    # 将所有链接存放进cid_down.txt中,方便后续下载
    with open(str(aid) + '_down.txt', 'w') as f:
        for i in urls:
            f.write(i + '\n')
    print('已获取全部的下载链接,请查看当前目录下的 %s_down.txt 获取。' % str(aid))

if __name__ == '__main__':
    main()



批量重命名code:
[Python] 纯文本查看 复制代码
#!/usr/local/Cellar/python/3.7.4/bin/python3
# -*- coding: utf-8 -*-

import os
import requests
import json

all_files = os.listdir()
first_dir = os.getcwd()
files = []
for i in all_files:
    prefix = i.split('.')[0]
    if prefix.isdigit():
        files.append(i)
for i in files:
    os.chdir(first_dir)
    file_name_web = requests.get('https://api.bilibili.com/x/web-interface/view?aid=' + i[:8])
    file_name_data = json.loads(file_name_web.text)
    file_name = file_name_data['data']['title']
    name_file = open(i)
    names = {}
    for j in name_file:
        info = j.split(',')
        key = info[-1].split()[0]
        name = info[0] + '.flv'
        names[key] = name
    files_dir = '/Volumes/MAC专用/前端/' + i[:8]
    os.chdir(files_dir)
    all_files = os.listdir(os.getcwd())
    for k in all_files:
        if '-1-80' in k or '-1-64' in k:
            #有的文件名需要用 '-' 切割,如果按通用条件没能完成全部重命名的话,可以试试
            if '_' in k:
                cid = k.split('_')[0]
            else:
                cid = k.split('-')[0]
            for l in names:
                if cid == l:
                    os.rename(k, names[l])
    os.rename(files_dir, files_dir[:-8] + file_name)


版权声明:

本站所有资源均为站长或网友整理自互联网或站长购买自互联网,站长无法分辨资源版权出自何处,所以不承担任何版权以及其他问题带来的法律责任,如有侵权或者其他问题请联系站长删除!站长QQ754403226 谢谢。

有关影视版权:本站只供百度云网盘资源,版权均属于影片公司所有,请在下载后24小时删除,切勿用于商业用途。本站所有资源信息均从互联网搜索而来,本站不对显示的内容承担责任,如您认为本站页面信息侵犯了您的权益,请附上版权证明邮件告知【754403226@qq.com】,在收到邮件后72小时内删除。本文链接:https://www.piaodoo.com/7614.html

搜索