python 爬取B站原视频的实例代码
B站原视频爬取,我就不多说直接上代码。直接运行就好。
B站是把视频和音频分开。要把2个合并起来使用。这个需要分析才能看出来。然后就是登陆这块是比较难的。
importos
importre
importargparse
importsubprocess
importprettytable
fromDecryptLoginimportlogin
'''B站类'''
classBilibili():
def__init__(self,username,password,**kwargs):
self.username=username
self.password=password
self.session=Bilibili.login(username,password)
self.headers={
'User-Agent':'Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/79.0.3945.117Safari/537.36'
}
self.user_info_url='http://api.bilibili.com/x/space/acc/info'
self.submit_videos_url='http://space.bilibili.com/ajax/member/getSubmitVideos'
self.view_url='http://api.bilibili.com/x/web-interface/view'
self.video_player_url='http://api.bilibili.com/x/player/playurl'
'''运行主程序'''
defrun(self):
whileTrue:
userid=input('请输入目标用户ID(例:345993405)(我的一个LOL好友凯撒可以关注他一下谢谢)——>')
user_info=self.__getUserInfo(userid)
tb=prettytable.PrettyTable()
tb.field_names=list(user_info.keys())
tb.add_row(list(user_info.values()))
print('获取的用户信息如下:')
print(tb)
is_download=input('是否下载该用户的所有视频(y/n,默认:y)——>')
ifis_download=='y'oris_download=='yes'ornotis_download:
self.__downloadVideos(userid)
'''根据userid获得该用户基本信息'''
def__getUserInfo(self,userid):
params={'mid':userid,'jsonp':'jsonp'}
res=self.session.get(self.user_info_url,params=params,headers=self.headers)
res_json=res.json()
user_info={
'用户名':res_json['data']['name'],
'性别':res_json['data']['sex'],
'个性签名':res_json['data']['sign'],
'用户等级':res_json['data']['level'],
'生日':res_json['data']['birthday']
}
returnuser_info
'''下载目标用户的所有视频'''
def__downloadVideos(self,userid):
ifnotos.path.exists(userid):
os.mkdir(userid)
#非会员用户只能下载到高清1080P
quality=[('16','流畅360P'),
('32','清晰480P'),
('64','高清720P'),
('74','高清720P60'),
('80','高清1080P'),
('112','高清1080P+'),
('116','高清1080P60')][-3]
#获得用户的视频基本信息
video_info={'aids':[],'cid_parts':[],'titles':[],'links':[],'down_flags':[]}
params={'mid':userid,'pagesize':30,'tid':0,'page':1,'order':'pubdate'}
whileTrue:
res=self.session.get(self.submit_videos_url,headers=self.headers,params=params)
res_json=res.json()
foriteminres_json['data']['vlist']:
video_info['aids'].append(item['aid'])
iflen(video_info['aids'])\|\s']",'',title)
video_info['titles'].append(title)
print('共获取到用户ID<%s>的<%d>个视频...'%(userid,len(video_info['titles'])))
foridxinrange(len(video_info['titles'])):
aid=video_info['aids'][idx]
cid_part=video_info['cid_parts'][idx]
link=[]
down_flag=False
forcid,partincid_part:
params={'avid':aid,'cid':cid,'qn':quality,'otype':'json','fnver':0,'fnval':16}
res=self.session.get(self.video_player_url,params=params,headers=self.headers)
res_json=res.json()
if'dash'inres_json['data']:
down_flag=True
v,a=res_json['data']['dash']['video'][0],res_json['data']['dash']['audio'][0]
link_v=[v['baseUrl']]
link_a=[a['baseUrl']]
ifv['backup_url']:
foriteminv['backup_url']:
link_v.append(item)
ifa['backup_url']:
foritemina['backup_url']:
link_a.append(item)
link=[link_v,link_a]
else:
link=[res_json['data']['durl'][-1]['url']]
ifres_json['data']['durl'][-1]['backup_url']:
foriteminres_json['data']['durl'][-1]['backup_url']:
link.append(item)
video_info['links'].append(link)
video_info['down_flags'].append(down_flag)
#开始下载
out_pipe_quiet=subprocess.PIPE
out_pipe=None
aria2c_path=os.path.join(os.getcwd(),'tools/aria2c')
ffmpeg_path=os.path.join(os.getcwd(),'tools/ffmpeg')
foridxinrange(len(video_info['titles'])):
title=video_info['titles'][idx]
aid=video_info['aids'][idx]
down_flag=video_info['down_flags'][idx]
print('正在下载视频<%s>...'%title)
ifdown_flag:
link_v,link_a=video_info['links'][idx]
#--视频
url='"{}"'.format('""'.join(link_v))
command='{}-c-k1M-x{}-d"{}"-o"{}"--referer="https://www.bilibili.com/video/av{}"{}{}'
command=command.format(aria2c_path,len(link_v),userid,title+'.flv',aid,"",url)
print(command)
process=subprocess.Popen(command,stdout=out_pipe,stderr=out_pipe,shell=True)
process.wait()
#--音频
url='"{}"'.format('""'.join(link_a))
command='{}-c-k1M-x{}-d"{}"-o"{}"--referer="https://www.bilibili.com/video/av{}"{}{}'
command=command.format(aria2c_path,len(link_v),userid,title+'.aac',aid,"",url)
print(command)
process=subprocess.Popen(command,stdout=out_pipe,stderr=out_pipe,shell=True)
process.wait()
#--合并
command='{}-i"{}"-i"{}"-ccopy-fmp4-y"{}"'
command=command.format(ffmpeg_path,os.path.join(userid,title+'.flv'),os.path.join(userid,title+'.aac'),os.path.join(userid,title+'.mp4'))
print(command)
process=subprocess.Popen(command,stdout=out_pipe,stderr=out_pipe_quiet,shell=True)
process.wait()
os.remove(os.path.join(userid,title+'.flv'))
os.remove(os.path.join(userid,title+'.aac'))
else:
link=video_info['links'][idx]
url='"{}"'.format('""'.join(link))
command='{}-c-k1M-x{}-d"{}"-o"{}"--referer="https://www.bilibili.com/video/av{}"{}{}'
command=command.format(aria2c_path,len(link),userid,title+'.flv',aid,"",url)
process=subprocess.Popen(command,stdout=out_pipe,stderr=out_pipe,shell=True)
process.wait()
os.rename(os.path.join(userid,title+'.flv'),os.path.join(userid,title+'.mp4'))
print('所有视频下载完成,该用户所有视频保存在<%s>文件夹中...'%(userid))
'''借助大佬开源的库来登录B站'''
@staticmethod
deflogin(username,password):
_,session=login.Login().bilibili(username,password)
returnsession
'''run'''
if__name__=='__main__':
parser=argparse.ArgumentParser(description='下载B站指定用户的所有视频(仅支持Windows下使用)')
parser.add_argument('--username',dest='username',help='xxx',type=str,required=True)
parser.add_argument('--password',dest='password',help='xxxx',type=str,required=True)
print(parser)
args=parser.parse_args(['--password','xxxx','--username','xxx'])
#args=parser.parse_args(['--password','FOO'])
print('5')
bili=Bilibili(args.username,args.password)
bili.run()
把账号密码填上就行。这是我根据一个微信公众号Charles大佬的想法写的。大家可以去关注他一下。
以上就是python爬取B站原视频的实例代码的详细内容,更多关于python爬取B站原视频的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。