B站原视频爬取,我就不多说直接上代码。直接运行就好。

B站是把视频和音频分开。要把2个合并起来使用。这个需要分析才能看出来。然后就是登陆这块是比较难的。

import os
import re
import argparse
import subprocess
import prettytable
from DecryptLogin import login'''B站类'''
class Bilibili():def __init__(self, username, password, **kwargs):self.username = usernameself.password = passwordself.session = Bilibili.login(username, password)self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/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''''运行主程序'''def run(self):while True: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) ——> ')if is_download == 'y' or is_download == 'yes' or not is_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']}return user_info'''下载目标用户的所有视频'''def __downloadVideos(self, userid):if not os.path.exists(userid):os.mkdir(userid)# 非会员用户只能下载到高清1080Pquality = [('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'}while True:res = self.session.get(self.submit_videos_url, headers=self.headers, params=params)res_json = res.json()for item in res_json['data']['vlist']:video_info['aids'].append(item['aid'])if len(video_info['aids']) < int(res_json['data']['count']):params['page'] += 1else:breakfor aid in video_info['aids']:params = {'aid': aid}res = self.session.get(self.view_url, headers=self.headers, params=params)cid_part = []for page in res.json()['data']['pages']:cid_part.append([page['cid'], page['part']])video_info['cid_parts'].append(cid_part)title = res.json()['data']['title']title = re.sub(r"[‘’\/\\\:\*\?\"\<\>\|\s']", ' ', title)video_info['titles'].append(title)print('共获取到用户ID<%s>的<%d>个视频...' % (userid, len(video_info['titles'])))for idx in range(len(video_info['titles'])):aid = video_info['aids'][idx]cid_part = video_info['cid_parts'][idx]link = []down_flag = Falsefor cid, part in cid_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' in res_json['data']:down_flag = Truev, a = res_json['data']['dash']['video'][0], res_json['data']['dash']['audio'][0]link_v = [v['baseUrl']]link_a = [a['baseUrl']]if v['backup_url']:for item in v['backup_url']:link_v.append(item)if a['backup_url']:for item in a['backup_url']:link_a.append(item)link = [link_v, link_a]else:link = [res_json['data']['durl'][-1]['url']]if res_json['data']['durl'][-1]['backup_url']:for item in res_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.PIPEout_pipe = Nonearia2c_path = os.path.join(os.getcwd(), 'tools/aria2c')ffmpeg_path = os.path.join(os.getcwd(), 'tools/ffmpeg')for idx in range(len(video_info['titles'])):title = video_info['titles'][idx]aid = video_info['aids'][idx]down_flag = video_info['down_flags'][idx]print('正在下载视频<%s>...' % title)if down_flag:link_v, link_a = video_info['links'][idx]# --视频url = '"{}"'.format('" "'.join(link_v))command = '{} -c -k 1M -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 -k 1M -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 "{}" -c copy -f mp4 -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 -k 1M -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站'''@staticmethoddef login(username, password):_, session = login.Login().bilibili(username, password)return session'''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大佬的想法写的。大家可以去关注他一下。

点赞 收藏 谢谢咯 小红书APP爬虫也写好了,如果可以的话 我更新一下

python B站原视频爬取,最高清晰度爬取。将你喜欢的up主的视频保存下来吧。相关推荐

  1. 淘宝的主图视频,怎么批量抓取、下载的?

    主图视频,淘宝.天猫.阿里巴巴等平台,为了提升客户的购物体验,能让客户看清商品的各个细节和上身的效果,淘宝.天猫.阿里巴巴平台都一直推广商家采用主图视频来展示商品,客户也喜欢通过视频来观看商品的各个角 ...

  2. 如何下载淘宝主图视频和淘宝商品链接?

    主图视频,淘宝.天猫.阿里巴巴等平台,为了提升客户的购物体验,能让客户看清商品的各个细节和上身的效果,淘宝.天猫.阿里巴巴平台都一直推广商家采用主图视频来展示商品,客户也喜欢通过视频来观看商品的各个角 ...

  3. 淘宝主图视频怎么下载?如何用工具下载?

    淘宝主图视频如何抓取.下载?在电商平台开店的商家大多数都是不会制作视频的,所以抓取.下载主图视频就成了关键,毕竟在电商平台上,主图视频也成为一种趋势了,主图图片没有视频那样的吸引力,很多客户也比较倾向 ...

  4. 爱剪辑怎么制作淘宝视频?详细的制作技巧,教你快速搞定淘宝主图视频

    众所周知,现在打开淘宝购买某种产品时,在主界面上方展示产品的部分已经出现了视频.这也是顺应潮流的做法,通过制作短视频的方式来展示产品,能引起买家更多的兴趣和购买欲.所以很多卖家现在都会制作一个精美的淘 ...

  5. 亚马逊主图视频是什么?有哪些优势?

    亚马逊主图视频是什么?不少卖家发现,现在越来越多的电商注重通过视频来向消费者展示产品,那么选择亚马逊主图视频具有哪些优势呢?大家一起来看看吧! 亚马逊主图视频是什么? 1.主图视频可以在很大程度上提高 ...

  6. 京东主图视频怎么做,一键管理主图视频

    京东主图视频怎么做?随着短视频时代的到来,快速阅读成了消费者的购物习惯,视频的吸引力远远大于图片和文字.根据数据显示:25%的京东消费者会在购买产品之前主动观看主图视频,视频播放率超过80%,平均观看 ...

  7. 亚马逊主图视频可以放几个?如何上传

    随着亚马逊的知名度上升之后,在上面开店的商家数量逐渐上升,使得各个店铺之间存在很大的竞争压力.如果想要让商品吸引更多消费者的关注,做好主图视频还是挺重要的,可是并不了解亚马逊主图视频可以放几个?如何上 ...

  8. python 爬取B站原视频的实站代码

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云,作者:python学习教程 ( 想要学习Python?Pyt ...

  9. 【Python】大数据挖掘课程作业1——使用爬虫爬取B站评论、弹幕与UP主的投稿视频列表

    [Python]大数据挖掘课程作业1--使用爬虫爬取B站评论.弹幕与UP主的投稿视频列表 数据挖掘部分的基本目标是:对于指定的UP主,能够获取其投稿视频列表:对于指定的视频,能够获取其视频标签.评论( ...

最新文章

  1. 关于Java中的线程安全(线程同步)
  2. typeof 数据类型转换
  3. ScrollReveal-元素随页面滚动产生动画的js插件
  4. java实现邮件发送, 抄送及多附件发送
  5. django学习遇到的问题解决方式
  6. 院士在西湖大学分享科研经历:读博过程中也曾想放弃,因为没有任何进展
  7. java混淆加密_源代码部分加密混淆方案
  8. android 基站信号测试软件,基站信号监测app
  9. bios 微星click_微星发表全新搭载图形化『Click BIOS』主机板 采用最新UEFI架构 迎接全图形化BIOS调教新时代...
  10. Mac OS - 让Myeclipse10支持Retina显示屏
  11. 计算机出问题英语,电脑突然蓝屏还有英文怎么回事
  12. CTSCAPIOTHUPC2018颓废记
  13. 从阿里云购买、域名购买、SSL免费购买到SSL集成开发(网络编程安全三)
  14. matlab数字图像处理——图像的读写,灰度、二值图像
  15. rfc3550-rtp:一种实时应用的传输协议
  16. 高通SDX12:Keypad按键相关(PowerKey、Reset)
  17. Java中getBytes()方法--使用详解
  18. Android: Jetpack Compose如何禁用涟漪(水波纹)效果
  19. D21 LeetCode 2038.如果相邻两个颜色均相同则删除当前颜色(中等)
  20. 事务与隔离级别------《Designing Data-Intensive Applications》读书笔记10

热门文章

  1. 解决Pytorch 训练与测试时爆显存(out of memory)的问题
  2. 阿里飞冰函数式插件转对象式
  3. 计算机毕业设计springboot酒店管理系统uah43源码+系统+程序+lw文档+部署
  4. Android_各种屏幕分辨率(VGA、HVGA、QVGA、WQVGA、WVGA、FWVGA) 详解
  5. java drawboard_学习一个月JAVA写的黑白棋程序(欢迎高手来指点)
  6. suse linux怎么卸载软件,SUSE Linux 10的卸载
  7. python跑代码电脑卡住_在连续运行python代码时,最终导致我的计算机崩溃
  8. html简单动画过度
  9. 支付宝c2c现金红包php代码/支持扫码/h5的方式没有任何依赖
  10. 【天融信centos操作系统安装EDR企业版服务端】:vmware软件下centos操作系统安装EDR企业版~温权~