爬取B站多P视频

import requests
from parsel import Selector
import json, os, timeclass GetBv():def __init__(self, bvid, page=1):'''bvid:视频号 eg:BV1hE411N7q2,strpage: P几的视频,默认为1 int'''self.bvid = bvidself.page = pageself.pg_dic, self.file_name, self.all_page = GetBv.get_name_pages(self)  # 视频名称表单、文件夹名称、总视频数# 表头self.headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1','Referer': 'https://www.bilibili.com',}# 获取视频网址def get_video_audio_urls(self):url = f'https://www.bilibili.com/video/{self.bvid}?p={self.page}'r = requests.get(url)selector = Selector(text=r.text)# 视频连接video_audio = selector.xpath('/html/head/script[5]/text()').getall()video_dic = video_dic = json.loads(video_audio[0][video_audio[0].index('{'):])['data']['dash']['video'] # 找到{}才能loadsvideo_url = video_dic[0]['baseUrl']# 音频连接audio = video_dic = json.loads(video_audio[0][video_audio[0].index('{'):])['data']['dash']['audio']audio_url = audio[0]['baseUrl']return video_url, audio_url# 获取视频名称表单并创建存放视频的文件夹def get_name_pages(self):# 获取名称表单url = f'https://www.bilibili.com/video/{self.bvid}'r_ng = requests.get(url)selector = Selector(r_ng.text)video_message = selector.xpath('/html/head/script[6]/text()').getall()video_message = json.loads(video_message[0][video_message[0].index('{'):video_message[0].index('};')+1])      # 找到{}才能loadsall_page = video_message['videoData']['videos']    # 总页数/视频数page_name_dic = {}             # 页数对应的名称for x in video_message['videoData']['pages']:page_name_dic[x['page']] = x['part']# 创建文件夹file_name = video_message['videoData']['title']if os.path.exists(file_name) == False: # 判断是否存在该文件夹os.mkdir(file_name)return page_name_dic, file_name,all_page# 获取video.m4s和audio.m4s格式的音频和视频def get_mp4(self):# bv_name: 视频名称bv_name = self.pg_dic[self.page]path = f'{self.file_name}/{bv_name}'    # 视频路径if os.path.exists(f'{path}.mp4'):  # 判断是否存在该视频print(f'已存在第{self.page}P视频——{bv_name}.mp4')else:video_url, audio_url = GetBv.get_video_audio_urls(self)# 爬取视频start = time.time()size = 0#stream参数设置成True时,它不会立即开始下载,当你使用iter_content或iter_lines遍历内容或访问内容属性时才开始下载r_video = requests.get(video_url, headers=self.headers,stream = True)chunk_size = 1024#每次块大小为1024content_size = int(r_video.headers['content-length'])#返回的response的headers中获取文件大小信息print(f"第{page}P--{bv_name}")print(f"{bv_name}_video.m4s ,文件大小:{format(content_size/chunk_size/1024,'.2f')}MB")with open(f'{path}_video.m4s', 'wb') as f:for data in r_video.iter_content(chunk_size=chunk_size):#每次只获取一个chunk_size大小f.write(data)#每次只写入data大小size = len(data)+size#'r'每次重新从开始输出,end = ""是不换行print('\r'+"已经下载:"+int(size/content_size*30)*"█"+f" 【{format(size/chunk_size/1024,'.2f')}MB】 【{format(size/content_size,'.2%')}】",end="")end = time.time()print("   总耗时:%.2f秒"%(end-start))# 音频start = time.time()size = 0#stream参数设置成True时,它不会立即开始下载,当你使用iter_content或iter_lines遍历内容或访问内容属性时才开始下载r_audio = requests.get(audio_url, headers=self.headers,stream = True)chunk_size = 1024#每次块大小为1024content_size = int(r_audio.headers['content-length'])#返回的response的headers中获取文件大小信息print(f"{bv_name}_audio.m4s ,文件大小:{format(content_size/chunk_size/1024,'.2f')}MB")with open(f'{path}_audio.m4s', 'wb') as f:for data in r_audio.iter_content(chunk_size=chunk_size):#每次只获取一个chunk_size大小f.write(data)#每次只写入data大小size = len(data)+size#'r'每次重新从开始输出,end = ""是不换行print('\r'+"已经下载:"+int(size/content_size*30)*"█"+f" 【{format(size/chunk_size/1024,'.2f')}MB】 【{format(size/content_size,'.2%')}】",end="")end = time.time()print("   总耗时:%.2f秒"%(end-start))# 合并视频order = f'ffmpeg -i "{path}_video.m4s" -i "{path}_audio.m4s" -codec copy "{path}.mp4"'  # 路径加引号是为了解决路径不能包含空格 . 的问题os.system(order)# 删除原来的音频+视频.m4s文件os.remove(f"{path}_audio.m4s")os.remove(f"{path}_video.m4s")print(f'合并为{bv_name}.mp4')if __name__ == '__main__':bvid = 'BV1C5411H7dz'           # ----视频的id----getBv = GetBv(bvid)max_page = getBv.all_page        # 获取最大页数page_list = list(range(1, max_page+1))   # ---爬取第几P视频的列表-,记得加1--for page in page_list:getBv.page = pagegetBv.get_mp4()print(f'爬取完成,请在"{os.getcwd()}\\{getBv.file_name}"路径下查看')

在这里插入图片描述

在这里插入图片描述我打包成了exe程序,有需要的朋友请到github下载:github–
Blibli-video

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/25130.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【python+pyqt5】B站直播弹幕姬

文章目录 前言1.日志对象2.获取弹幕3.qt窗口窗口间传递信号主窗口设置窗口弹幕展示窗口托盘 4.主函数5.最终成果及使用方法6.开源地址 前言 这个软件是基于我半年多前写的一个小小小软件(https://www.bilibili.com/video/BV1zN411Q7u4)的一个大更新&…

B站有哪些程序员大牛up主?

B站有哪些程序员大牛up主 接下来分享一波有利于大家 面试 和 提高自己技术 的B站程序员up主 :B站,想必大家都再熟悉不过 :B站是啥?说清楚点 :就是哔哩哔哩啊; :哦 :你在b站上学习吗…

B 站崩了,受害程序员聊聊

非吃瓜,B 站事件始末分析 防治技术分享 大家好,我是鱼皮,昨天小破站崩了的事情相信很多朋友都听说了。 这要是搁以前,不爱吃瓜的我根本不会去关注这种事,崩了就崩了呗,反正天塌下来有程序员大佬们扛着&am…

B站发帖软件哪个好用?好用的哔哩哔哩发帖工具

B站发帖软件哪个好用?好用的哔哩哔哩发帖工具#发帖软件#哔哩哔哩发帖#视频发布软件 登录成功之后,进入到这样一个界面,默认情况下是这个样子的,我们在这里输入一下我们的一个文件夹的路径,输入到这里,点击添加账号&a…

B站一键查询视频/分P视频/番剧的弹幕发送者

近几年因为B站的门槛越来越低,时常会看到一些让人眼前一亮的弹幕。直接举报拉黑这种做法显然已经太便宜了、、 网上大部分查询工具时效性已经过了或者有局限性,所以我打算自己写一款能通过视频、分P视频、番剧来查询弹幕发送者的工具,输入视频…

新开源项目(solidjs-use)随想录

大厂技术 高级前端 Node进阶 点击上方 程序员成长指北,关注公众号 回复1,加入高级Node交流群 前言 如果你是 React 技术栈,就会发现其对新手其实是不太友好的,会导致新人写出很多重复渲染的组件和 BUG,而且排查难度高…

Semantic Kernel 知多少 | 开启面向AI编程新篇章

引言 在ChatGPT 火热的当下, 即使没有上手亲自体验,想必也对ChatGPT的强大略有耳闻。当一些人在对ChatGPT犹犹豫豫之时,一些敏锐的企业主和开发者们已经急不可耐得开展基于ChatGPT模型AI应用的落地探索。 因此,可以明确预见的是,「…

Semantic Kernel 知多少 | 开启面向 AI 编程新篇章

在 ChatGPT 火热的当下, 即使没有上手亲自体验,想必也对 ChatGPT 的强大略有耳闻。当一些人在对 ChatGPT 犹犹豫豫之时,一些敏锐的企业主和开发者们已经急不可耐地开展基于 ChatGPT 模型 AI 应用的落地探索。 因此,可以明确预见的是&#xf…

我做了个GPT3键盘,用了两个月发现它有点傻

自 ChatGPT 出世,各类文本类AI产品层出不穷。甚至接连几日,Producthunt 上新品过半都是AI相关。 这其中部分原因是 OpenAI 公司开放的 GPT3 1API 接口十分易用。只要一个简单的文本请求,就能将现有产品加入AI功能。例如,Notion、…

使用ChatGPT帮你提升代码编写能力

第一次ChatGPT代码沟通评审 import org.apache.http.*; import org.apache.http.client.*; import org.apache.http.client.methods.*; import org.apache.http.conn.ssl.*; import org.apache.http.entity.*; import org.apache.http.impl.client.*; import org.apache.http.s…

设计模式(七)门面模式(Facade Pattern 外观模式)

一、模式定义 门面模式(Facade Pattern):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。门面模式又称为外观…

html实现牌匾效果,4款店面牌匾设计效果图 店铺门头亚克力牌匾样式制作设计图...

4款店面牌匾设计效果图 店铺门头亚克力牌匾样式制作设计图 店铺门头亚克力牌匾样式设计很规整自然,同时这种材质也是很受现代人的欢迎,酒红色的色调很自然,醒目的视觉冲击也很不错,中央是点名和logo的设计,再加上图示&…

设计模式 -- 门面模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

市场主流智能语音音箱对话系统哪个做的更好?

市场主流智能语音音箱对话系统哪个做的更好? 如何评价智能语音音箱对话系统的好与坏呢?智能音箱的对话技能如何实现?评价指标又有哪些呢?带着一连串的问题,小君来说说自己的理解。首先,智能音箱的对话技能…

语音聊天app开发——语音聊天室系统如何开发

网络直播行业近些年算得上是多元化发展,各个互联网平台陆续入驻,开发自身的短视频直播平台,像百度,腾讯,阿里等,直播也多种渠道发展,1对多视频直播,1对1直播,视频语音多人…

C语言实现扫雷游戏完整代码

文章目录 游戏整体框架游戏具体功能及实现整体代码 一、雷盘的定义 1.雷盘的定义 对于扫雷游戏,我们遇到的第一个问题就是:应该如何表示扫雷的雷盘及如何存放布雷、排雷的数据;我们发现,二维数组可以很好的解决这个问题。 #inc…

Java扫雷全代码

Java极致还原XP系统经典扫雷 前言 最近疫情在家,没有工作上的996压迫着,使我倍感无聊,不知这满头秀发该如何消耗。   闲逛着游戏社区,常常回想起和朋友一起通宵玩游戏的那种快感。   一款扫雷游戏使我眼前一亮,他…

编写代码实现简单的扫雷游戏

扫雷 菜单 比较简单,代码如下 void menu() {printf("*******************\n");printf("**** 1. play ****\n");printf("**** 0. exit ****\n");printf("*******************\n"); }效果如图 然后就是根据不同的输入…

【C语言】扫雷游戏详解及完整代码

文章目录 前言一、程序环境配置二、各种功能的实现以及逻辑关系的整理2.1 创建游戏初始界面(进入\退出 游戏)2.2 创建并初始化二维数组board[][] mine[][] (board存放棋盘的信息 mine存放雷的信息)2.3 初始化棋盘2.4 打印棋盘2.5 设置雷区2.6 扫雷 三、完…

互联网最值得加入的 173 家国企名单

大家好!我是韩老师。 今年的就业相比以往是难了不少,感受到的人都懂。有一位学妹毕业后在互联网公司工作了两年多,受到的业绩考核压力越来越大,萌发了跳去国企的念头,和她通话聊了挺久。 就是这次的起因,给…