python b站视频下载的示例

这篇文章将为大家详细讲解有关python b站视频下载的示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

介绍

  • 对于单P视频:直接传入B站av号或者视频链接地址(eg: 49842011或者https://www.bilibili.com/video/av49842011)

  • 对于多P视频:

1.下载全集:直接传入B站av号或者视频链接地址(eg: 49842011或者https://www.bilibili.com/video/av49842011)2.下载其中一集:传入那一集的视频链接地址(eg: https://www.bilibili.com/video/av19516333/?p=2)

版本一: bilibili_video_download_v1.py

加密API版,不需要加入cookie,直接即可下载1080p视频

#!/usr/bin/python
#-*-coding:utf-8-*-
#time:2019/04/17--08:12
__author__='Henry'


'''
项目:B站视频下载
版本1:加密API版,不需要加入cookie,直接即可下载1080p视频
20190422-增加多P视频单独下载其中一集的功能
'''
importimageio
imageio.plugins.ffmpeg.download()

importrequests,time,hashlib,urllib.request,re,json
frommoviepy.editorimport*
importos,sys


#访问API地址
defget_play_list(start_url,cid,quality):
entropy='rbMCKn@KuamXWlPMoJGsKcbiJKUfkPF_8dABscJntvqhRSETg'
appkey,sec=''.join([chr(ord(i)+2)foriinentropy[::-1]]).split(':')
params='appkey=%s&cid=%s&otype=json&qn=%s&quality=%s&type='%(appkey,cid,quality,quality)
chksum=hashlib.md5(bytes(params+sec,'utf8')).hexdigest()
url_api='https://interface.bilibili.com/v2/playurl?%s&sign=%s'%(params,chksum)
headers={
'Referer':start_url,#注意加上referer
'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/55.0.2883.87Safari/537.36'
}
#print(url_api)
html=requests.get(url_api,headers=headers).json()
#print(json.dumps(html))
video_list=[]
foriinhtml['durl']:
video_list.append(i['url'])
#print(video_list)
returnvideo_list


#下载视频
'''
urllib.urlretrieve的回调函数:
defcallbackfunc(blocknum,blocksize,totalsize):
@blocknum:已经下载的数据块
@blocksize:数据块的大小
@totalsize:远程文件的大小
'''


defSchedule_cmd(blocknum,blocksize,totalsize):
speed=(blocknum*blocksize)/(time.time()-start_time)
#speed_str="Speed:%.2f"%speed
speed_str="Speed:%s"%format_size(speed)
recv_size=blocknum*blocksize

#设置下载进度条
f=sys.stdout
pervent=recv_size/totalsize
percent_str="%.2f%%"%(pervent*100)
n=round(pervent*50)
s=('#'*n).ljust(50,'-')
f.write(percent_str.ljust(8,'')+'['+s+']'+speed_str)
f.flush()
#time.sleep(0.1)
f.write('\r')


defSchedule(blocknum,blocksize,totalsize):
speed=(blocknum*blocksize)/(time.time()-start_time)
#speed_str="Speed:%.2f"%speed
speed_str="Speed:%s"%format_size(speed)
recv_size=blocknum*blocksize

#设置下载进度条
f=sys.stdout
pervent=recv_size/totalsize
percent_str="%.2f%%"%(pervent*100)
n=round(pervent*50)
s=('#'*n).ljust(50,'-')
print(percent_str.ljust(6,'')+'-'+speed_str)
f.flush()
time.sleep(2)
#print('\r')


#字节bytes转化K\M\G
defformat_size(bytes):
try:
bytes=float(bytes)
kb=bytes/1024
except:
print("传入的字节格式不对")
return"Error"
ifkb>=1024:
M=kb/1024
ifM>=1024:
G=M/1024
return"%.3fG"%(G)
else:
return"%.3fM"%(M)
else:
return"%.3fK"%(kb)


#下载视频
defdown_video(video_list,title,start_url,page):
num=1
print('[正在下载P{}段视频,请稍等...]:'.format(page)+title)
currentVideoPath=os.path.join(sys.path[0],'bilibili_video',title)#当前目录作为下载目录
foriinvideo_list:
opener=urllib.request.build_opener()
#请求头
opener.addheaders=[
#('Host','upos-hz-mirrorks3.acgvideo.com'),#注意修改host,不用也行
('User-Agent','Mozilla/5.0(Macintosh;IntelMacOSX10.13;rv:56.0)Gecko/20100101Firefox/56.0'),
('Accept','*/*'),
('Accept-Language','en-US,en;q=0.5'),
('Accept-Encoding','gzip,deflate,br'),
('Range','bytes=0-'),#Range的值要为bytes=0-才能下载完整视频
('Referer',start_url),#注意修改referer,必须要加的!
('Origin','https://www.bilibili.com'),
('Connection','keep-alive'),
]
urllib.request.install_opener(opener)
#创建文件夹存放下载的视频
ifnotos.path.exists(currentVideoPath):
os.makedirs(currentVideoPath)
#开始下载
iflen(video_list)>1:
urllib.request.urlretrieve(url=i,filename=os.path.join(currentVideoPath,r'{}-{}.flv'.format(title,num)),reporthook=Schedule_cmd)#写成mp4也行title+'-'+num+'.flv'
else:
urllib.request.urlretrieve(url=i,filename=os.path.join(currentVideoPath,r'{}.flv'.format(title)),reporthook=Schedule_cmd)#写成mp4也行title+'-'+num+'.flv'
num+=1

#合并视频
defcombine_video(video_list,title):
currentVideoPath=os.path.join(sys.path[0],'bilibili_video',title)#当前目录作为下载目录
ifnotos.path.exists(currentVideoPath):
os.makedirs(currentVideoPath)
iflen(video_list)>=2:
#视频大于一段才要合并
print('[下载完成,正在合并视频...]:'+title)
#定义一个数组
L=[]
#访问video文件夹(假设视频都放在这里面)
root_dir=currentVideoPath
#遍历所有文件
forfileinsorted(os.listdir(root_dir),key=lambdax:int(x[x.rindex("-")+1:x.rindex(".")])):
#如果后缀名为.mp4/.flv
ifos.path.splitext(file)[1]=='.flv':
#拼接成完整路径
filePath=os.path.join(root_dir,file)
#载入视频
video=VideoFileClip(filePath)
#添加到数组
L.append(video)
#拼接视频
final_clip=concatenate_videoclips(L)
#生成目标视频文件
final_clip.to_videofile(os.path.join(root_dir,r'{}.mp4'.format(title)),fps=24,remove_temp=False)
print('[视频合并完成]'+title)

else:
#视频只有一段则直接打印下载完成
print('[视频合并完成]:'+title)


if__name__=='__main__':
#用户输入av号或者视频链接地址
print('*'*30+'B站视频下载小助手'+'*'*30)
start=input('请输入您要下载的B站av号或者视频链接地址:')
ifstart.isdigit()==True:#如果输入的是av号
#获取cid的api,传入aid即可
start_url='https://api.bilibili.com/x/web-interface/view?aid='+start
else:
#https://www.bilibili.com/video/av46958874/?spm_id_from=333.334.b_63686965665f7265636f6d6d656e64.16
start_url='https://api.bilibili.com/x/web-interface/view?aid='+re.search(r'/av(\d+)/*',start).group(1)

#视频质量
#<accept_format><![CDATA[flv,flv720,flv480,flv360]]></accept_format>
#<accept_description><![CDATA[高清1080P,高清720P,清晰480P,流畅360P]]></accept_description>
#<accept_quality><![CDATA[80,64,32,16]]></accept_quality>
quality=input('请输入您要下载视频的清晰度(1080p:80;720p:64;480p:32;360p:16)(填写80或64或32或16):')
#获取视频的cid,title
headers={
'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/55.0.2883.87Safari/537.36'
}
html=requests.get(start_url,headers=headers).json()
data=html['data']
video_title=data["title"].replace("","_")
cid_list=[]
if'?p='instart:
#单独下载分P视频中的一集
p=re.search(r'\?p=(\d+)',start).group(1)
cid_list.append(data['pages'][int(p)-1])
else:
#如果p不存在就是全集下载
cid_list=data['pages']
#print(cid_list)
foritemincid_list:
cid=str(item['cid'])
title=item['part']
ifnottitle:
title=video_title
title=re.sub(r'[\/\\:*?"<>|]','',title)#替换为空的
print('[下载视频的cid]:'+cid)
print('[下载视频的标题]:'+title)
page=str(item['page'])
start_url=start_url+"/?p="+page
video_list=get_play_list(start_url,cid,quality)
start_time=time.time()
down_video(video_list,title,start_url,page)
combine_video(video_list,title)

#如果是windows系统,下载完成后打开下载目录
currentVideoPath=os.path.join(sys.path[0],'bilibili_video')#当前目录作为下载目录
if(sys.platform.startswith('win')):
os.startfile(currentVideoPath)


#分P视频下载测试:https://www.bilibili.com/video/av19516333/

版本二:bilibili_video_download_v2.py

1.无加密API版,但是需要加入登录后cookie中的SESSDATA字段,才可下载720p及以上视频2.如果想下载1080p+视频,需要带入B站大会员的cookie中的SESSDATA才行,普通用户的SESSDATA最多只能下载1080p视频;请定期更换代码31行cookie中的SESSDATA值。跟换方法为:浏览器登录B站,在开发者模式(按F12) --> application --> cookie中找到SESSDATA值替换即可,一个月的有效期

#!/usr/bin/python
#-*-coding:utf-8-*-
#time:2019/04/16--17:12
__author__='Henry'


'''
项目:B站视频下载
版本2:无加密API版,但是需要加入登录后cookie中的SESSDATA字段,才可下载720p及以上视频
API:
1.获取cid的api为https://api.bilibili.com/x/web-interface/view?aid=47476691aid后面为av号
2.下载链接api为https://api.bilibili.com/x/player/playurl?avid=44743619&cid=78328965&qn=32cid为上面获取到的avid为输入的av号qn为视频质量
注意:
但是此接口headers需要加上登录后'Cookie':'SESSDATA=3c5d20cf%2C1556704080%2C7dcd8c41'(30天的有效期)(因为现在只有登录后才能看到720P以上视频了)
不然下载之后都是最低清晰度,哪怕选择了80也是只有480p的分辨率!!
20190422-增加多P视频单独下载其中一集的功能
'''

importrequests,time,urllib.request,re
frommoviepy.editorimport*
importos,sys

importimageio
imageio.plugins.ffmpeg.download()

#访问API地址
defget_play_list(aid,cid,quality):
url_api='https://api.bilibili.com/x/player/playurl?cid={}&avid={}&qn={}'.format(cid,aid,quality)
headers={
'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/55.0.2883.87Safari/537.36',
'Cookie':'SESSDATA=aa15d6af%2C1560734457%2Ccc8ca251',#登录B站后复制一下cookie中的SESSDATA字段,有效期1个月
'Host':'api.bilibili.com'
}
html=requests.get(url_api,headers=headers).json()
video_list=[]
foriinhtml['data']['durl']:
video_list.append(i['url'])
print(video_list)
returnvideo_list


#下载视频
'''
urllib.urlretrieve的回调函数:
defcallbackfunc(blocknum,blocksize,totalsize):
@blocknum:已经下载的数据块
@blocksize:数据块的大小
@totalsize:远程文件的大小
'''


defSchedule_cmd(blocknum,blocksize,totalsize):
speed=(blocknum*blocksize)/(time.time()-start_time)
#speed_str="Speed:%.2f"%speed
speed_str="Speed:%s"%format_size(speed)
recv_size=blocknum*blocksize

#设置下载进度条
f=sys.stdout
pervent=recv_size/totalsize
percent_str="%.2f%%"%(pervent*100)
n=round(pervent*50)
s=('#'*n).ljust(50,'-')
f.write(percent_str.ljust(8,'')+'['+s+']'+speed_str)
f.flush()
#time.sleep(0.1)
f.write('\r')


defSchedule(blocknum,blocksize,totalsize):
speed=(blocknum*blocksize)/(time.time()-start_time)
#speed_str="Speed:%.2f"%speed
speed_str="Speed:%s"%format_size(speed)
recv_size=blocknum*blocksize

#设置下载进度条
f=sys.stdout
pervent=recv_size/totalsize
percent_str="%.2f%%"%(pervent*100)
n=round(pervent*50)
s=('#'*n).ljust(50,'-')
print(percent_str.ljust(6,'')+'-'+speed_str)
f.flush()
time.sleep(2)
#print('\r')


#字节bytes转化K\M\G
defformat_size(bytes):
try:
bytes=float(bytes)
kb=bytes/1024
except:
print("传入的字节格式不对")
return"Error"
ifkb>=1024:
M=kb/1024
ifM>=1024:
G=M/1024
return"%.3fG"%(G)
else:
return"%.3fM"%(M)
else:
return"%.3fK"%(kb)


#下载视频
defdown_video(video_list,title,start_url,page):
num=1
print('[正在下载P{}段视频,请稍等...]:'.format(page)+title)
currentVideoPath=os.path.join(sys.path[0],'bilibili_video',title)#当前目录作为下载目录
foriinvideo_list:
opener=urllib.request.build_opener()
#请求头
opener.addheaders=[
#('Host','upos-hz-mirrorks3.acgvideo.com'),#注意修改host,不用也行
('User-Agent','Mozilla/5.0(Macintosh;IntelMacOSX10.13;rv:56.0)Gecko/20100101Firefox/56.0'),
('Accept','*/*'),
('Accept-Language','en-US,en;q=0.5'),
('Accept-Encoding','gzip,deflate,br'),
('Range','bytes=0-'),#Range的值要为bytes=0-才能下载完整视频
('Referer',start_url),#注意修改referer,必须要加的!
('Origin','https://www.bilibili.com'),
('Connection','keep-alive'),

]
urllib.request.install_opener(opener)
#创建文件夹存放下载的视频
ifnotos.path.exists(currentVideoPath):
os.makedirs(currentVideoPath)
#开始下载
iflen(video_list)>1:
urllib.request.urlretrieve(url=i,filename=os.path.join(currentVideoPath,r'{}-{}.flv'.format(title,num)),
reporthook=Schedule_cmd)#写成mp4也行title+'-'+num+'.flv'
else:
urllib.request.urlretrieve(url=i,filename=os.path.join(currentVideoPath,r'{}.flv'.format(title)),
reporthook=Schedule_cmd)#写成mp4也行title+'-'+num+'.flv'
num+=1


#合并视频
defcombine_video(video_list,title):
currentVideoPath=os.path.join(sys.path[0],'bilibili_video',title)#当前目录作为下载目录
iflen(video_list)>=2:
#视频大于一段才要合并
print('[下载完成,正在合并视频...]:'+title)
#定义一个数组
L=[]
#访问video文件夹(假设视频都放在这里面)
root_dir=currentVideoPath
#遍历所有文件
forfileinsorted(os.listdir(root_dir),key=lambdax:int(x[x.rindex("-")+1:x.rindex(".")])):
#如果后缀名为.mp4/.flv
ifos.path.splitext(file)[1]=='.flv':
#拼接成完整路径
filePath=os.path.join(root_dir,file)
#载入视频
video=VideoFileClip(filePath)
#添加到数组
L.append(video)
#拼接视频
final_clip=concatenate_videoclips(L)
#生成目标视频文件
final_clip.to_videofile(os.path.join(root_dir,r'{}.mp4'.format(title)),fps=24,remove_temp=False)
print('[视频合并完成]'+title)

else:
#视频只有一段则直接打印下载完成
print('[视频合并完成]:'+title)


if__name__=='__main__':
#用户输入av号或者视频链接地址
print('*'*30+'B站视频下载小助手'+'*'*30)
start=input('请输入您要下载的B站av号或者视频链接地址:')
ifstart.isdigit()==True:
#如果输入的是av号
#获取cid的api,传入aid即可
aid=start
start_url='https://api.bilibili.com/x/web-interface/view?aid='+aid
else:
#如果输入的是url(eg:https://www.bilibili.com/video/av46958874/)
aid=re.search(r'/av(\d+)/*',start).group(1)
start_url='https://api.bilibili.com/x/web-interface/view?aid='+aid
#qn参数就是视频清晰度
#可选值:
#116:高清1080P60(需要带入大会员的cookie中的SESSDATA才行,普通用户的SESSDATA最多只能下载1080p的视频)
#112:高清1080P+(hdflv2)(需要大会员)
#80:高清1080P(flv)
#74:高清720P60(需要大会员)
#64:高清720P(flv720)
#32:清晰480P(flv480)
#16:流畅360P(flv360)
print('请输入您要下载视频的清晰度(1080p60:116;1080p+:112;1080p:80;720p60:74;720p:64;480p:32;360p:16;**注意:1080p+,1080p60,720p60,720p都需要带入大会员的cookie中的SESSDATA才行,普通用户的SESSDATA最多只能下载1080p的视频):')
quality=input('请填写116或112或80或74或64或32或16:')
#获取视频的cid,title
headers={
'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/55.0.2883.87Safari/537.36'
}
html=requests.get(start_url,headers=headers).json()
data=html['data']
cid_list=[]
if'?p='instart:
#单独下载分P视频中的一集
p=re.search(r'\?p=(\d+)',start).group(1)
cid_list.append(data['pages'][int(p)-1])
else:
#如果p不存在就是全集下载
cid_list=data['pages']
#print(cid_list)
foritemincid_list:
cid=str(item['cid'])
title=item['part']
title=re.sub(r'[\/\\:*?"<>|]','',title)#替换为空的
print('[下载视频的cid]:'+cid)
print('[下载视频的标题]:'+title)
page=str(item['page'])
start_url=start_url+"/?p="+page
video_list=get_play_list(aid,cid,quality)
start_time=time.time()
down_video(video_list,title,start_url,page)
combine_video(video_list,title)

#如果是windows系统,下载完成后打开下载目录
currentVideoPath=os.path.join(sys.path[0],'bilibili_video')#当前目录作为下载目录
if(sys.platform.startswith('win')):
os.startfile(currentVideoPath)

#分P视频下载测试:https://www.bilibili.com/video/av19516333/

版本三: bilibili_video_download_v3.py

即版本二的升级版,为Threading多线程下载版本,下载速度大幅提升!

#!/usr/bin/python
#-*-coding:utf-8-*-
#time:2019/07/02--08:12
__author__='Henry'


'''
项目:B站视频下载-多线程下载
版本1:加密API版,不需要加入cookie,直接即可下载1080p视频
20190422-增加多P视频单独下载其中一集的功能
20190702-增加视频多线程下载速度大幅提升
'''

importrequests,time,hashlib,urllib.request,re,json
frommoviepy.editorimport*
importos,sys,threading

importimageio
imageio.plugins.ffmpeg.download()

#访问API地址
defget_play_list(start_url,cid,quality):
entropy='rbMCKn@KuamXWlPMoJGsKcbiJKUfkPF_8dABscJntvqhRSETg'
appkey,sec=''.join([chr(ord(i)+2)foriinentropy[::-1]]).split(':')
params='appkey=%s&cid=%s&otype=json&qn=%s&quality=%s&type='%(appkey,cid,quality,quality)
chksum=hashlib.md5(bytes(params+sec,'utf8')).hexdigest()
url_api='https://interface.bilibili.com/v2/playurl?%s&sign=%s'%(params,chksum)
headers={
'Referer':start_url,#注意加上referer
'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/55.0.2883.87Safari/537.36'
}
#print(url_api)
html=requests.get(url_api,headers=headers).json()
#print(json.dumps(html))
video_list=[]
foriinhtml['durl']:
video_list.append(i['url'])
#print(video_list)
returnvideo_list


#下载视频
'''
urllib.urlretrieve的回调函数:
defcallbackfunc(blocknum,blocksize,totalsize):
@blocknum:已经下载的数据块
@blocksize:数据块的大小
@totalsize:远程文件的大小
'''


defSchedule_cmd(blocknum,blocksize,totalsize):
speed=(blocknum*blocksize)/(time.time()-start_time)
#speed_str="Speed:%.2f"%speed
speed_str="Speed:%s"%format_size(speed)
recv_size=blocknum*blocksize

#设置下载进度条
f=sys.stdout
pervent=recv_size/totalsize
percent_str="%.2f%%"%(pervent*100)
n=round(pervent*50)
s=('#'*n).ljust(50,'-')
f.write(percent_str.ljust(8,'')+'['+s+']'+speed_str)
f.flush()
#time.sleep(0.1)
f.write('\r')


defSchedule(blocknum,blocksize,totalsize):
speed=(blocknum*blocksize)/(time.time()-start_time)
#speed_str="Speed:%.2f"%speed
speed_str="Speed:%s"%format_size(speed)
recv_size=blocknum*blocksize

#设置下载进度条
f=sys.stdout
pervent=recv_size/totalsize
percent_str="%.2f%%"%(pervent*100)
n=round(pervent*50)
s=('#'*n).ljust(50,'-')
print(percent_str.ljust(6,'')+'-'+speed_str)
f.flush()
time.sleep(2)
#print('\r')


#字节bytes转化K\M\G
defformat_size(bytes):
try:
bytes=float(bytes)
kb=bytes/1024
except:
print("传入的字节格式不对")
return"Error"
ifkb>=1024:
M=kb/1024
ifM>=1024:
G=M/1024
return"%.3fG"%(G)
else:
return"%.3fM"%(M)
else:
return"%.3fK"%(kb)


#下载视频
defdown_video(video_list,title,start_url,page):
num=1
print('[正在下载P{}段视频,请稍等...]:'.format(page)+title)
currentVideoPath=os.path.join(sys.path[0],'bilibili_video',title)#当前目录作为下载目录
ifnotos.path.exists(currentVideoPath):
os.makedirs(currentVideoPath)
foriinvideo_list:
opener=urllib.request.build_opener()
#请求头
opener.addheaders=[
#('Host','upos-hz-mirrorks3.acgvideo.com'),#注意修改host,不用也行
('User-Agent','Mozilla/5.0(Macintosh;IntelMacOSX10.13;rv:56.0)Gecko/20100101Firefox/56.0'),
('Accept','*/*'),
('Accept-Language','en-US,en;q=0.5'),
('Accept-Encoding','gzip,deflate,br'),
('Range','bytes=0-'),#Range的值要为bytes=0-才能下载完整视频
('Referer',start_url),#注意修改referer,必须要加的!
('Origin','https://www.bilibili.com'),
('Connection','keep-alive'),
]
urllib.request.install_opener(opener)
#创建文件夹存放下载的视频
ifnotos.path.exists(currentVideoPath):
os.makedirs(currentVideoPath)
#开始下载
iflen(video_list)>1:
urllib.request.urlretrieve(url=i,filename=os.path.join(currentVideoPath,r'{}-{}.flv'.format(title,num)),reporthook=Schedule_cmd)#写成mp4也行title+'-'+num+'.flv'
else:
urllib.request.urlretrieve(url=i,filename=os.path.join(currentVideoPath,r'{}.flv'.format(title)),reporthook=Schedule_cmd)#写成mp4也行title+'-'+num+'.flv'
num+=1

#合并视频(20190802新版)
defcombine_video(title_list):
video_path=os.path.join(sys.path[0],'bilibili_video')#下载目录
fortitleintitle_list:
current_video_path=os.path.join(video_path,title)
iflen(os.listdir(current_video_path))>=2:
#视频大于一段才要合并
print('[下载完成,正在合并视频...]:'+title)
#定义一个数组
L=[]
#遍历所有文件
forfileinsorted(os.listdir(current_video_path),key=lambdax:int(x[x.rindex("-")+1:x.rindex(".")])):
#如果后缀名为.mp4/.flv
ifos.path.splitext(file)[1]=='.flv':
#拼接成完整路径
filePath=os.path.join(current_video_path,file)
#载入视频
video=VideoFileClip(filePath)
#添加到数组
L.append(video)
#拼接视频
final_clip=concatenate_videoclips(L)
#生成目标视频文件
final_clip.to_videofile(os.path.join(current_video_path,r'{}.mp4'.format(title)),fps=24,remove_temp=False)
print('[视频合并完成]'+title)
else:
#视频只有一段则直接打印下载完成
print('[视频合并完成]:'+title)


if__name__=='__main__':
start_time=time.time()
#用户输入av号或者视频链接地址
print('*'*30+'B站视频下载小助手'+'*'*30)
start=input('请输入您要下载的B站av号或者视频链接地址:')
ifstart.isdigit()==True:#如果输入的是av号
#获取cid的api,传入aid即可
start_url='https://api.bilibili.com/x/web-interface/view?aid='+start
else:
#https://www.bilibili.com/video/av46958874/?spm_id_from=333.334.b_63686965665f7265636f6d6d656e64.16
start_url='https://api.bilibili.com/x/web-interface/view?aid='+re.search(r'/av(\d+)/*',start).group(1)

#视频质量
#<accept_format><![CDATA[flv,flv720,flv480,flv360]]></accept_format>
#<accept_description><![CDATA[高清1080P,高清720P,清晰480P,流畅360P]]></accept_description>
#<accept_quality><![CDATA[80,64,32,16]]></accept_quality>
quality=input('请输入您要下载视频的清晰度(1080p:80;720p:64;480p:32;360p:16)(填写80或64或32或16):')
#获取视频的cid,title
headers={
'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/55.0.2883.87Safari/537.36'
}
html=requests.get(start_url,headers=headers).json()
data=html['data']
cid_list=[]
if'?p='instart:
#单独下载分P视频中的一集
p=re.search(r'\?p=(\d+)',start).group(1)
cid_list.append(data['pages'][int(p)-1])
else:
#如果p不存在就是全集下载
cid_list=data['pages']
#print(cid_list)
#创建线程池
threadpool=[]
title_list=[]
foritemincid_list:
cid=str(item['cid'])
title=item['part']
title=re.sub(r'[\/\\:*?"<>|]','',title)#替换为空的
print('[下载视频的cid]:'+cid)
print('[下载视频的标题]:'+title)
title_list.append(title)
page=str(item['page'])
start_url=start_url+"/?p="+page
video_list=get_play_list(start_url,cid,quality)
start_time=time.time()
#down_video(video_list,title,start_url,page)
#定义线程
th=threading.Thread(target=down_video,args=(video_list,title,start_url,page))
#将线程加入线程池
threadpool.append(th)

#开始线程
forthinthreadpool:
th.start()
#等待所有线程运行完毕
forthinthreadpool:
th.join()

#最后合并视频
print(title_list)
combine_video(title_list)

end_time=time.time()#结束时间
print('下载总耗时%.2f秒,约%.2f分钟'%(end_time-start_time,int(end_time-start_time)/60))
#如果是windows系统,下载完成后打开下载目录
currentVideoPath=os.path.join(sys.path[0],'bilibili_video')#当前目录作为下载目录
if(sys.platform.startswith('win')):
os.startfile(currentVideoPath)


#分P视频下载测试:https://www.bilibili.com/video/av19516333/
#下载总耗时14.21秒,约0.23分钟

版本四: GUI版本 - bilibili_video_download-GUI.py

#!/usr/bin/python
#-*-coding:utf-8-*-
#time:2019/07/02--08:12
__author__='Henry'


'''
项目:B站视频下载-GUI版本
版本1:加密API版,不需要加入cookie,直接即可下载1080p视频
20190422-增加多P视频单独下载其中一集的功能
20190702-增加视频多线程下载速度大幅提升
20190711-增加GUI版本,可视化界面,操作更加友好
'''

importrequests,time,hashlib,urllib.request,re,json
importimageio
imageio.plugins.ffmpeg.download()
frommoviepy.editorimport*
importos,sys,threading



fromtkinterimport*
fromtkinterimportttk
fromtkinterimportStringVar
root=Tk()
start_time=time.time()

#将输出重定向到表格
defprint(theText):
msgbox.insert(END,theText+'\n')


#访问API地址
defget_play_list(start_url,cid,quality):
entropy='rbMCKn@KuamXWlPMoJGsKcbiJKUfkPF_8dABscJntvqhRSETg'
appkey,sec=''.join([chr(ord(i)+2)foriinentropy[::-1]]).split(':')
params='appkey=%s&cid=%s&otype=json&qn=%s&quality=%s&type='%(appkey,cid,quality,quality)
chksum=hashlib.md5(bytes(params+sec,'utf8')).hexdigest()
url_api='https://interface.bilibili.com/v2/playurl?%s&sign=%s'%(params,chksum)
headers={
'Referer':start_url,#注意加上referer
'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/55.0.2883.87Safari/537.36'
}
#print(url_api)
html=requests.get(url_api,headers=headers).json()
#print(json.dumps(html))
video_list=[]
foriinhtml['durl']:
video_list.append(i['url'])
#print(video_list)
returnvideo_list


#下载视频
'''
urllib.urlretrieve的回调函数:
defcallbackfunc(blocknum,blocksize,totalsize):
@blocknum:已经下载的数据块
@blocksize:数据块的大小
@totalsize:远程文件的大小
'''


defSchedule_cmd(blocknum,blocksize,totalsize):
speed=(blocknum*blocksize)/(time.time()-start_time)
#speed_str="Speed:%.2f"%speed
speed_str="Speed:%s"%format_size(speed)
recv_size=blocknum*blocksize

#设置下载进度条
pervent=recv_size/totalsize
percent_str="%.2f%%"%(pervent*100)
download.coords(fill_line1,(0,0,pervent*465,23))
root.update()
pct.set(percent_str)



defSchedule(blocknum,blocksize,totalsize):
speed=(blocknum*blocksize)/(time.time()-start_time)
#speed_str="Speed:%.2f"%speed
speed_str="Speed:%s"%format_size(speed)
recv_size=blocknum*blocksize

#设置下载进度条
f=sys.stdout
pervent=recv_size/totalsize
percent_str="%.2f%%"%(pervent*100)
n=round(pervent*50)
s=('#'*n).ljust(50,'-')
print(percent_str.ljust(6,'')+'-'+speed_str)
f.flush()
time.sleep(2)
#print('\r')


#字节bytes转化K\M\G
defformat_size(bytes):
try:
bytes=float(bytes)
kb=bytes/1024
except:
print("传入的字节格式不对")
return"Error"
ifkb>=1024:
M=kb/1024
ifM>=1024:
G=M/1024
return"%.3fG"%(G)
else:
return"%.3fM"%(M)
else:
return"%.3fK"%(kb)


#下载视频
defdown_video(video_list,title,start_url,page):
num=1
print('[正在下载P{}段视频,请稍等...]:'.format(page)+title)
currentVideoPath=os.path.join(sys.path[0],'bilibili_video',title)#当前目录作为下载目录
foriinvideo_list:
opener=urllib.request.build_opener()
#请求头
opener.addheaders=[
#('Host','upos-hz-mirrorks3.acgvideo.com'),#注意修改host,不用也行
('User-Agent','Mozilla/5.0(Macintosh;IntelMacOSX10.13;rv:56.0)Gecko/20100101Firefox/56.0'),
('Accept','*/*'),
('Accept-Language','en-US,en;q=0.5'),
('Accept-Encoding','gzip,deflate,br'),
('Range','bytes=0-'),#Range的值要为bytes=0-才能下载完整视频
('Referer',start_url),#注意修改referer,必须要加的!
('Origin','https://www.bilibili.com'),
('Connection','keep-alive'),
]
urllib.request.install_opener(opener)
#创建文件夹存放下载的视频
ifnotos.path.exists(currentVideoPath):
os.makedirs(currentVideoPath)
#开始下载
iflen(video_list)>1:
urllib.request.urlretrieve(url=i,filename=os.path.join(currentVideoPath,r'{}-{}.flv'.format(title,num)),reporthook=Schedule_cmd)#写成mp4也行title+'-'+num+'.flv'
else:
urllib.request.urlretrieve(url=i,filename=os.path.join(currentVideoPath,r'{}.flv'.format(title)),reporthook=Schedule_cmd)#写成mp4也行title+'-'+num+'.flv'
num+=1

#合并视频(20190802新版)
defcombine_video(title_list):
video_path=os.path.join(sys.path[0],'bilibili_video')#下载目录
fortitleintitle_list:
current_video_path=os.path.join(video_path,title)
iflen(os.listdir(current_video_path))>=2:
#视频大于一段才要合并
print('[下载完成,正在合并视频...]:'+title)
#定义一个数组
L=[]
#遍历所有文件
forfileinsorted(os.listdir(current_video_path),key=lambdax:int(x[x.rindex("-")+1:x.rindex(".")])):
#如果后缀名为.mp4/.flv
ifos.path.splitext(file)[1]=='.flv':
#拼接成完整路径
filePath=os.path.join(current_video_path,file)
#载入视频
video=VideoFileClip(filePath)
#添加到数组
L.append(video)
#拼接视频
final_clip=concatenate_videoclips(L)
#生成目标视频文件
final_clip.to_videofile(os.path.join(current_video_path,r'{}.mp4'.format(title)),fps=24,remove_temp=False)
print('[视频合并完成]'+title)
else:
#视频只有一段则直接打印下载完成
print('[视频合并完成]:'+title)

defdo_prepare(inputStart,inputQuality):
#清空进度条
download.coords(fill_line1,(0,0,0,23))
pct.set('0.00%')
root.update()
#清空文本栏
msgbox.delete('1.0','end')
start_time=time.time()
#用户输入av号或者视频链接地址
print('*'*30+'B站视频下载小助手'+'*'*30)
start=inputStart
ifstart.isdigit()==True:#如果输入的是av号
#获取cid的api,传入aid即可
start_url='https://api.bilibili.com/x/web-interface/view?aid='+start
else:
#https://www.bilibili.com/video/av46958874/?spm_id_from=333.334.b_63686965665f7265636f6d6d656e64.16
start_url='https://api.bilibili.com/x/web-interface/view?aid='+re.search(r'/av(\d+)/*',start).group(1)

#视频质量
#<accept_format><![CDATA[flv,flv720,flv480,flv360]]></accept_format>
#<accept_description><![CDATA[高清1080P,高清720P,清晰480P,流畅360P]]></accept_description>
#<accept_quality><![CDATA[80,64,32,16]]></accept_quality>
quality=inputQuality
#获取视频的cid,title
headers={
'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/55.0.2883.87Safari/537.36'
}
html=requests.get(start_url,headers=headers).json()
data=html['data']
cid_list=[]
if'?p='instart:
#单独下载分P视频中的一集
p=re.search(r'\?p=(\d+)',start).group(1)
cid_list.append(data['pages'][int(p)-1])
else:
#如果p不存在就是全集下载
cid_list=data['pages']
#print(cid_list)
#创建线程池
threadpool=[]
title_list=[]
foritemincid_list:
cid=str(item['cid'])
title=item['part']
title=re.sub(r'[\/\\:*?"<>|]','',title)#替换为空的
print('[下载视频的cid]:'+cid)
print('[下载视频的标题]:'+title)
title_list.append(title)
page=str(item['page'])
start_url=start_url+"/?p="+page
video_list=get_play_list(start_url,cid,quality)
start_time=time.time()
#down_video(video_list,title,start_url,page)
#定义线程
th=threading.Thread(target=down_video,args=(video_list,title,start_url,page))
#将线程加入线程池
threadpool.append(th)

#开始线程
forthinthreadpool:
th.start()
#等待所有线程运行完毕
forthinthreadpool:
th.join()

#最后合并视频
combine_video(title_list)

end_time=time.time()#结束时间
print('下载总耗时%.2f秒,约%.2f分钟'%(end_time-start_time,int(end_time-start_time)/60))

#如果是windows系统,下载完成后打开下载目录
currentVideoPath=os.path.join(sys.path[0],'bilibili_video')#当前目录作为下载目录
if(sys.platform.startswith('win')):
os.startfile(currentVideoPath)



defthread_it(func,*args):
'''将函数打包进线程'''
#创建
t=threading.Thread(target=func,args=args)
#守护!!!
t.setDaemon(True)
#启动
t.start()


if__name__=="__main__":
#设置标题
root.title('B站视频下载小助手-GUI')
#设置ico
root.iconbitmap('./Pic/favicon.ico')
#设置Logo
photo=PhotoImage(file='./Pic/logo.png')
logo=Label(root,image=photo)
logo.pack()
#各项输入栏和选择框
inputStart=Entry(root,bd=4,width=600)
labelStart=Label(root,text="请输入您要下载的B站av号或者视频链接地址:")#地址输入
labelStart.pack(anchor="w")
inputStart.pack()
labelQual=Label(root,text="请选择您要下载视频的清晰度")#清晰度选择
labelQual.pack(anchor="w")
inputQual=ttk.Combobox(root,state="readonly")
#可供选择的表
inputQual['value']=('1080P','720p','480p','360p')
#对应的转换字典
keyTrans=dict()
keyTrans['1080P']='80'
keyTrans['720p']='64'
keyTrans['480p']='32'
keyTrans['360p']='16'
#初始值为720p
inputQual.current(1)
inputQual.pack()
confirm=Button(root,text="开始下载",command=lambda:thread_it(do_prepare,inputStart.get(),keyTrans[inputQual.get()]))
msgbox=Text(root)
msgbox.insert('1.0',"对于单P视频:直接传入B站av号或者视频链接地址\n(eg:49842011或者https://www.bilibili.com/video/av49842011)\n对于多P视频:\n1.下载全集:直接传入B站av号或者视频链接地址\n(eg:49842011或者https://www.bilibili.com/video/av49842011)\n2.下载其中一集:传入那一集的视频链接地址\n(eg:https://www.bilibili.com/video/av19516333/?p=2)")
msgbox.pack()
download=Canvas(root,width=465,height=23,bg="white")
#进度条的设置
labelDownload=Label(root,text="下载进度")
labelDownload.pack(anchor="w")
download.pack()
fill_line1=download.create_rectangle(0,0,0,23,width=0,fill="green")
pct=StringVar()
pct.set('0.0%')
pctLabel=Label(root,textvariable=pct)
pctLabel.pack()
root.geometry("600x800")
confirm.pack()
#GUI主循环
root.mainloop()

版本五: bilibili_video_download_bangumi.py

在版本一,三基础上增加下载B站番剧视频(eg: https://www.bilibili.com/bangumi/play/ep269835)

#!/usr/bin/python
#-*-coding:utf-8-*-
#time:2019/07/21--20:12
__author__='Henry'


'''
项目:B站动漫番剧(bangumi)下载
版本2:无加密API版,但是需要加入登录后cookie中的SESSDATA字段,才可下载720p及以上视频
API:
1.获取cid的api为https://api.bilibili.com/x/web-interface/view?aid=47476691aid后面为av号
2.下载链接api为https://api.bilibili.com/x/player/playurl?avid=44743619&cid=78328965&qn=32cid为上面获取到的avid为输入的av号qn为视频质量
注意:
但是此接口headers需要加上登录后'Cookie':'SESSDATA=3c5d20cf%2C1556704080%2C7dcd8c41'(30天的有效期)(因为现在只有登录后才能看到720P以上视频了)
不然下载之后都是最低清晰度,哪怕选择了80也是只有480p的分辨率!!
'''

importrequests,time,urllib.request,re
frommoviepy.editorimport*
importos,sys,threading,json

importimageio
imageio.plugins.ffmpeg.download()

#访问API地址
defget_play_list(aid,cid,quality):
url_api='https://api.bilibili.com/x/player/playurl?cid={}&avid={}&qn={}'.format(cid,aid,quality)
headers={
'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/55.0.2883.87Safari/537.36',
'Cookie':'SESSDATA=75a75cf2%2C1564669876%2Cb7c7b171',#登录B站后复制一下cookie中的SESSDATA字段,有效期1个月
'Host':'api.bilibili.com'
}
html=requests.get(url_api,headers=headers).json()
#print(html)
#当下载会员视频时,如果cookie中传入的不是大会员的SESSDATA时就会返回:{'code':-404,'message':'啥都木有','ttl':1,'data':None}
ifhtml['code']!=0:
print('注意!当前集数为B站大会员专享,若想下载,Cookie中请传入大会员的SESSDATA')
return'NoVIP'
video_list=[]
foriinhtml['data']['durl']:
video_list.append(i['url'])
print(video_list)
returnvideo_list


#下载视频
'''
urllib.urlretrieve的回调函数:
defcallbackfunc(blocknum,blocksize,totalsize):
@blocknum:已经下载的数据块
@blocksize:数据块的大小
@totalsize:远程文件的大小
'''


defSchedule_cmd(blocknum,blocksize,totalsize):
speed=(blocknum*blocksize)/(time.time()-start_time)
#speed_str="Speed:%.2f"%speed
speed_str="Speed:%s"%format_size(speed)
recv_size=blocknum*blocksize

#设置下载进度条
f=sys.stdout
pervent=recv_size/totalsize
percent_str="%.2f%%"%(pervent*100)
n=round(pervent*50)
s=('#'*n).ljust(50,'-')
f.write(percent_str.ljust(8,'')+'['+s+']'+speed_str)
f.flush()
#time.sleep(0.1)
f.write('\r')


defSchedule(blocknum,blocksize,totalsize):
speed=(blocknum*blocksize)/(time.time()-start_time)
#speed_str="Speed:%.2f"%speed
speed_str="Speed:%s"%format_size(speed)
recv_size=blocknum*blocksize

#设置下载进度条
f=sys.stdout
pervent=recv_size/totalsize
percent_str="%.2f%%"%(pervent*100)
n=round(pervent*50)
s=('#'*n).ljust(50,'-')
print(percent_str.ljust(6,'')+'-'+speed_str)
f.flush()
time.sleep(2)
#print('\r')


#字节bytes转化K\M\G
defformat_size(bytes):
try:
bytes=float(bytes)
kb=bytes/1024
except:
print("传入的字节格式不对")
return"Error"
ifkb>=1024:
M=kb/1024
ifM>=1024:
G=M/1024
return"%.3fG"%(G)
else:
return"%.3fM"%(M)
else:
return"%.3fK"%(kb)


#下载视频
defdown_video(video_list,title,start_url,page):
num=1
print('[正在下载第{}话视频,请稍等...]:'.format(page)+title)
currentVideoPath=os.path.join(sys.path[0],'bilibili_video',title)#当前目录作为下载目录
foriinvideo_list:
opener=urllib.request.build_opener()
#请求头
opener.addheaders=[
#('Host','upos-hz-mirrorks3.acgvideo.com'),#注意修改host,不用也行
('User-Agent','Mozilla/5.0(Macintosh;IntelMacOSX10.13;rv:56.0)Gecko/20100101Firefox/56.0'),
('Accept','*/*'),
('Accept-Language','en-US,en;q=0.5'),
('Accept-Encoding','gzip,deflate,br'),
('Range','bytes=0-'),#Range的值要为bytes=0-才能下载完整视频
('Referer',start_url),#注意修改referer,必须要加的!
('Origin','https://www.bilibili.com'),
('Connection','keep-alive'),

]
urllib.request.install_opener(opener)
#创建文件夹存放下载的视频
ifnotos.path.exists(currentVideoPath):
os.makedirs(currentVideoPath)
#开始下载
iflen(video_list)>1:
urllib.request.urlretrieve(url=i,filename=os.path.join(currentVideoPath,r'{}-{}.flv'.format(title,num)),
reporthook=Schedule_cmd)#写成mp4也行title+'-'+num+'.flv'
else:
urllib.request.urlretrieve(url=i,filename=os.path.join(currentVideoPath,r'{}.flv'.format(title)),
reporthook=Schedule_cmd)#写成mp4也行title+'-'+num+'.flv'
num+=1


#合并视频(20190802新版)
defcombine_video(title_list):
video_path=os.path.join(sys.path[0],'bilibili_video')#下载目录
fortitleintitle_list:
current_video_path=os.path.join(video_path,title)
iflen(os.listdir(current_video_path))>=2:
#视频大于一段才要合并
print('[下载完成,正在合并视频...]:'+title)
#定义一个数组
L=[]
#遍历所有文件
forfileinsorted(os.listdir(current_video_path),key=lambdax:int(x[x.rindex("-")+1:x.rindex(".")])):
#如果后缀名为.mp4/.flv
ifos.path.splitext(file)[1]=='.flv':
#拼接成完整路径
filePath=os.path.join(current_video_path,file)
#载入视频
video=VideoFileClip(filePath)
#添加到数组
L.append(video)
#拼接视频
final_clip=concatenate_videoclips(L)
#生成目标视频文件
final_clip.to_videofile(os.path.join(current_video_path,r'{}.mp4'.format(title)),fps=24,remove_temp=False)
print('[视频合并完成]'+title)
else:
#视频只有一段则直接打印下载完成
print('[视频合并完成]:'+title)


if__name__=='__main__':
start_time=time.time()
#用户输入番剧完整链接地址
#1.https://www.bilibili.com/bangumi/play/ep267692(用带ep链接)
#2.https://www.bilibili.com/bangumi/play/ss26878(不要用这个ss链接,epinfo的aid会变成'-1')
print('*'*30+'B站番剧视频下载小助手'+'*'*30)
print('[提示]:1.如果您想下载720P60,1080p+,1080p60质量的视频,请将35行代码中的SESSDATA改成你登录大会员后得到的SESSDATA,普通用户的SESSDATA最多只能下载1080p的视频')
print('2.若发现下载的视频质量在720p以下,请将35行代码中的SESSDATA改成你登录后得到的SESSDATA(有效期一个月),而失效的SESSDATA就只能下载480p的视频')

start=input('请输入您要下载的B站番剧的完整链接地址(例如:https://www.bilibili.com/bangumi/play/ep267692):')
ep_url=start
headers={
'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/55.0.2883.87Safari/537.36'
}
html=requests.get(ep_url,headers=headers).text
ep_info=re.search(r'INITIAL_STATE__=(.*?"]});',html).group(1)
#print(ep_info)
ep_info=json.loads(ep_info)
#print('您将要下载的番剧名为:'+ep_info['mediaInfo']['title'])#字段格式太不统一了
y=input('请输入1或2-1.只下载当前一集2.下载此番剧的全集:')
#1.如果只下载当前ep
id_list=[]
ify=='1':
try:
id_list.append([ep_info['epInfo']['aid'],ep_info['epInfo']['cid'],
ep_info['epInfo']['titleFormat']+''+ep_info['epInfo']['longTitle']])
except:
id_list.append([ep_info['epInfo']['aid'],ep_info['epInfo']['cid'],
'第'+str(ep_info['epInfo']['index'])+'话'+ep_info['epInfo']['index_title']])
#2.下载此番剧全部ep
else:
foriinep_info['epList']:
#ifi['badge']=='':#当badge字段为'会员'时,接口返回404
try:
id_list.append([i['aid'],i['cid'],
i['titleFormat']+''+i['longTitle']])
except:
id_list.append([i['aid'],i['cid'],'第'+str(i['index'])+'话'+i['index_title']])

#qn参数就是视频清晰度
#可选值:
#116:高清1080P60(需要带入大会员的cookie中的SESSDATA才行,普通用户的SESSDATA最多只能下载1080p的视频,不带入SESSDATA就只能下载480p的)
#112:高清1080P+(hdflv2)(需要大会员)
#80:高清1080P(flv)
#74:高清720P60(需要大会员)
#64:高清720P(flv720)
#32:清晰480P(flv480)
#16:流畅360P(flv360)
print('请输入您要下载视频的清晰度(1080p60:116;1080p+:112;1080p:80;720p60:74;720p:64;480p:32;360p:16;**注意:1080p+,1080p60,720p60都需要带入大会员的cookie中的SESSDATA才行,普通用户的SESSDATA最多只能下载1080p的视频):')
quality=input('请输入116或112或80或74或64或32或16:')
threadpool=[]
title_list=[]
page=1
print(id_list)
foriteminid_list:
aid=str(item[0])
cid=str(item[1])
title=item[2]
title=re.sub(r'[\/\\:*?"<>|]','',title)#替换为空的
print('[下载番剧标题]:'+title)
title_list.append(title)
start_url=ep_url
video_list=get_play_list(aid,cid,quality)
start_time=time.time()
#down_video(video_list,title,start_url,page)
#定义线程
ifvideo_list!='NoVIP':
th=threading.Thread(target=down_video,args=(video_list,title,start_url,page))
#将线程加入线程池
threadpool.append(th)
page+=1

#开始线程
forthinthreadpool:
th.start()
#等待所有线程运行完毕
forthinthreadpool:
th.join()

#最后合并视频
print(title_list)
combine_video(title_list)

end_time=time.time()#结束时间
print('下载总耗时%.2f秒,约%.2f分钟'%(end_time-start_time,int(end_time-start_time)/60))
#如果是windows系统,下载完成后打开下载目录
currentVideoPath=os.path.join(sys.path[0],'bilibili_video')#当前目录作为下载目录
if(sys.platform.startswith('win')):
os.startfile(currentVideoPath)


#番剧视频下载测试:https://www.bilibili.com/bangumi/play/ep269828

关于“python b站视频下载的示例”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

发布于 2021-05-30 14:04:20
分享
海报
177
上一篇:vue+springboot如何实现登录验证码 下一篇:Vue如何实现多图添加显示和删除
目录

    推荐阅读

    忘记密码?

    图形验证码