Python爬取B站视频、封面原图

您所在的位置:网站首页 哔哩哔哩获取视频封面怎么设置 Python爬取B站视频、封面原图

Python爬取B站视频、封面原图

2024-07-13 22:03| 来源: 网络整理| 查看: 265

        由于B站油猴脚本现在经常处于莫名其妙失联状态,无法用来下载视频,为了更好的利用舞蹈区,不,学习区的学习视频摸鱼学习,因此决定自己做一个简单的工具来下载视频和封面,文章最后有GitHub的地址,已经打包好对应的exe文件,可以直接去下载使用。

        使用效果简单展示:

B站视频下载,输入对应的视频URL和集数后即可下载点击保存封面,默认的文件名为:up主名字+视频标题,可自行修改。这是下载好的图片和视频

                                        爬取B站音视频并合成

下面说下思路:首先介绍下基本的思路以供参考(使用Python进行爬取):

        ① 找到想要下载的视频的URL,用正则表达式提取出对应的BV号,其格式基本如下

https://www.bilibili.com/video/BVxxxxxx,这个就是我们用来请求的url,可以通过requests模块来爬取url,获取到的response,转成text,通过正则表达式捕获我们想要的视频和音频URL。

        查找的过程也很简单,F12,查找“高清”两个字,狠狠的搜索,最后锁定在window.__playinfo__中。

        其核心的过滤,就是要找到“window.__playinfo__”,这个信息点,里面有我们需要的信息,找到该关键点以后,想要的音视频url就非常好找了

window.__playinfo__是一个字典,提取出来转字典,就可以快速找到音视频的信息。

   ② 伪装请求头进行访问,B站的视频是由音频和视频组合成的,我们需要拿到视频和音频的URL进行下载,然后合成。如果使用Python的Request模块进行获取,需要注意cookie不能放在请求头中,一定要封装成字典,放在get方法的cookies属性里面,否则传过去的cookie无效,获取的视频质量最高只有没有登陆的480p。经过研究发现,cookie里面有一个属性:

SeSSDATA,是我们需要携带的cookie信息,它是我们的用户凭证,携带它,再请求,就相当于我们登陆了。

cookie

那么如何快速“复制”到我们整一个cookie信息呢?我们随便打开一个B站视频网页,打开F12,找到网络模块,点击任意一个捕获的请求,在“标头”里面翻一翻,就能找到。

获取cookie整个字符串

当下载的视频最高没有1080P的时候,我们才需要更新cookie。

获取整个cookie

对获取的cookie字符串信息实际拿到SESSDATA的值就好:

请求头随便加一些常规的信息就好。

        son_data['data']['dash']['video']是一个列表,里面会有各种各样的画质的视频URL,其中id值是 80是普通的1080p,这个我们直接获取json_data['data']['dash']['video'][0]就是我们能下载的最高画质了,跟传递的cookie信息有关,没有开大会员的时候,我们请求返回的Response是没有超过普通1080p画质的,哈哈,也好,省得判断处理了,比较遗憾的是我也没有大会员,因此没法直接验证,是否携带大会员的cookie,可以正常获取到4k视频URL。

        目前的画质的关系如下:

        ③ 获取到对应的音频和视频 URL以后,可以用 moviepy 模块进行音视频的合成,该模块也有坑,首先是合成比较慢,其次Python项目打包时,需要对其模块的fx> all > 文件夹下

video 和 audio文件夹的 __init__.py文件做一些修改,它的动态import,pyinstaller打包模块不支持,我们要改成静态import,后面再具体展示如何修改。

        核心实现如下:

        还有一个需要注意的点,如果使用了多线程进行下载,一定要对线程做阻塞等待处理

(thread.join()), 等到我们的视频和音频下载完成以后,才开始进行音视频的合成。

threading模块也有坑,就是如果线程里面的函数,包含的是本py文件外,其他文件封装好的函数,它会忽略该函数是否已经执行完毕,直接判断函数执行瞬间就是执行完毕的了,接着执行下一行命令,加 join()阻塞都是没有用的,真的要用的时候,不要用什么模块化思想,狠狠的代码尸山堆就完事了√√√

        在实际中,如果爬取30分钟的视频,比如下面的链接:

https://www.bilibili.com/video/BV1124y117Dr/?p=2&t=5&vd_source=88de6d7bf2afd93889536491926ffed3

        使用moviepy真的会砸电脑!!!直接电脑风扇呼啦啦响了10分钟,才合成完毕,这谁顶得住啊,太慢啦,于是我又把合成的注意瞄向了ffmpeg模块,ffmpeg模块的全称是:ffmpeg-python ,千万不要下错了(比如下错成ffmpeg模块),下面 是正确的下载命令:

注意,该模块只是些方便我们在Python中使用的API,真正调用时,还需要本地有ffmpeg.exe执行文件来调用。我在GitHub的项目中已经添加了ffmpe.exe文件,偷懒的话,就把该文件放到项目根目录下就可以了,否则还要配置path。

    言归正传,说下ffmpeg模块的使用:

注意,因为我们还要另外删除合成前的素材音频和视频,因此,千万不要使用 cmd 命令行的形式,因为这样会无法预知何时合成完毕,导致上面的process.run_async还在合成视频呢,我们呼啦啦就把要合成的音频和视频删掉了,百分百合成失败,但是不删又很别扭,另外做一个按钮来点来删也觉得麻烦,于是研究 ffmpeg的命令发现,ffmpeg.output.run()已经自带线程阻塞了,也就是该行命令执行完毕后,才会执行后面的代码,刚好满足我们的需要!

        实际使用时,ffmpeg真的比 moviepy模块合成快多了,于是我也爽快地把moviepy模块抛弃了~~~

        合成视频的主要功能模块代码如下:

getVideo.py

        

                                查找Up主名字、封面原图、标题

        说完了视频的合成,接下来简单再说说查找up主名字,标题,封面原图的爬取,这个比较简单,研究发现,获取这些信息的url还是  http://www.bilibili.com/video/XXXXX,封面的url就在页面的 itemprop="image里面的content的值中。@后面是略缩图了,不需要。

封面关键页面信息

爬取的网页转码后的页面我也放在了GitHub项目中,在里面可以方便我们研究爬取各种内容。

    这里是获取图片的代码:

getVideoPicture.py

    其余的就是一些和tkinter图形界面有关的函数了,这里就不再展示。

    好了,终于到了最重要的一部分了,整个项目的GitHub地址为:

https://github.com/jiumeng714/bilibili_video_crawing

    项目里面已经打包好带Cmd的EXE文件了,如果已经安装git,可以cmd直接拉取项目使用:

打不开的同学可能是需要一个 ladder !实在不行的话可以私信我,可以偷偷推荐一下。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3