淘先锋技术网

首页 1 2 3 4 5 6 7

此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。

前言

近日,有小伙伴说想看一篇关于视频下载的文章,这不,拿bilibili来开刀了。
由于没有深入的对bilibili进行研究,导致文章可读性比较差,不喜勿喷。
虽是浅尝辄止。但是下载视频的目的可以达到。

关于清视频晰度:

方法描述
未登录状态抓取的视音频url参数:mid=0
登录状态抓取的视音频url参数:mid=xxx(一串数字)

如果是未登录状态,那就没有什么清晰度可言。
若你登录状态下打开一个视频,选择高清,那么!!用你这串mid去请求的视频都是高清(视频本身没有高清除外)。

1. 思路

在这里说下整体思路!

  1. 找到视音频的url是关键
  2. 分别下载视音频后,再进行视音频混流(即画面和声音合成一个文件)。

话不多说,下面开始!!!

2. 分析

文章以下图中的视频为例。文中为Firefox浏览器,方便展示抓包效果。在这里插入图片描述
首先就是打开开发者工具抓包啦。如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

看到抓包页面的媒体分类,都是mp4格式的数据包,数据包的大小从107字节到2.30MB不等。有一个很有趣的规律如下:

  1. 107字节的数据包都是通过OPTIONS的方式请求。
  2. 大一些的数据包都是通过GET方式请求。
  3. 有两个重复多次的URL(猜测是视音频)
  4. 请求头的Range字段,下一个文件会接上上一个文件的字节尾数,1文件是0-973,2文件是974-1653。。。

既然如此,下面用代码来请求一下看看。
在这里插入图片描述
执行代码后,生成了一个1kbtest.mp4文件,很显然,打开时候报错了
在这里插入图片描述
为什么会报错呢??我觉得是文件太小了,修改请求头的Range值为0-1024000,再次运行代码。
这次生成了一个1001kbmp4文件,且可以播放!!但是视频没有声音,证实 了bilibili的视频文件是视音频分离的。
在这里插入图片描述

上面有说到,抓到的数据包大部分是两个重复的URL,现在请求另一个URL看看。

代码只是将URL做了修改,请求头没有变化。
在这里插入图片描述
(图中看不出是音频,但是是有声音的),这样,就完成本次抓包工作了。
在这里插入图片描述


到了这里,抓包工作已经完成,视音频的由来也清楚了,那问题来了,这么长的一串URL是从哪里来的呢?
!!! 看源码。
百思不得其解,却忘记了最简单的方法,查看网页源码(花费了好一会儿时间才发现,原来源码里面就有!!!)

video的URL:
在这里插入图片描述
audio的URL:
在这里插入图片描述
到了这里,剩下的用正则匹配源码里面的video和audio的URL都不是问题了吧!!!


剩余问题:

  • 还需将视频和音频混流,这个可以用ffmpeg完成或使用格式工厂。

2.1 ffmpeg合成音视频

2.1.1 安装ffmpeg

ffmpeg官网:https://ffmpeg.zeranoe.com/builds/

点击进去下载对应的电脑版本即可。
在这里插入图片描述

下载文件解压缩后入下图所示:
在这里插入图片描述
然后将bin这个文件的目录添加到系统环境变量即可。如下图:
在这里插入图片描述


稍稍解释一下这里用到的ffmpeg的命令的意思:

方法描述
-c copy拷贝所有的流
-i输入文件
-y不经询问就覆盖输出文件。
-n不要覆盖输出文件,如果指定的输出文件已经存在,则立即退出。
-loglevel使用的日志记录级别
quiet跟在loglevel后面,表示不输出日志

感兴趣的小伙伴可以点击ffmepeg中文文档,深入了解。

这里还用到了subprocess模块,用来生成子进程,并可以通过管道连接他们的输入/输出/错误,以及获得他们的返回值。

import subprocess


def merge_video_and_audio(video_name):
    """
    音视频合并函数,利用ffmpeg合并音视频
    :param video_name: 传入标题
    :return:
    """
    # 可选-y 或者 -n
    cmd = f'ffmpeg -i "{video_name}.m4s" -i "{video_name}.mp3" -c copy "{video_name}.mp4" -loglevel quiet -y'
    subprocess.Popen(command, shell=True)
    print(f'{video_name}.mp4合并完成!!!')

执行代码后的样子:

  • 可以看到已经成功合成mp4格式的视频了。

在这里插入图片描述

2.2 格式工厂合成音视频

ps:这里用了其他视频做示例。
1.下载好的视音频:
在这里插入图片描述
2.打开格式工厂:
在这里插入图片描述
3.视音频混流:
在这里插入图片描述
最后,静静等待混流完成即可。
以上代码,在这里下载。
代码自取:
https://github.com/SunriseCai/spiderCode

3. 后面的话

小伙伴们如果感兴趣的话,可以完善代码。几个建议如下:

  1. 增加可以手动输入搜索视频的功能
  2. 利用Pyqt5做成可视化的bilibili视频下载小工具

小伙伴们若是完善后代码记得发我一份哦!!!