首先,我们随便点进一个视频,比如说https://www.bilibili.com/video/BV1XW411M7Gu 。
查看源代码,发现__playinfo__
内的信息很多,疑似关键信息,先存下来。
仔细分析,可以发现里面有不同分辨率的视频地址,音频地址,真是得来不费功夫。
利用requests和re库,便可以获取到其中的内容:
1 | import requests,re |
为了方便处理,import json
添加引用,接着使用一个列表将视频信息进行整理,分类成几种清晰度。
1 | playinfo=json.loads(json_text) |
然后,定义一个download
函数,调用即可完成下载:
1 | def download(referer_url,video_url,audio_url,video_name): |
然后调用测试:
1 | download(url,video_info_list[0]['video_url'],video_info_list[0]['audio_url'],'test') |
上面下载的是列表第一个清晰度(1080p+)的视频,效果如下:
由于音视频是分开的,因此我们需要将其合并。
可以选择借助ffmpeg
来进行此操作,然后运用subprocess
命令行调用即可。
FFmpeg 是一个开放源代码的自由软件,可以运行音频和视频多种格式的录影、转换、流功能,包含了libavcodec——这是一个用于多个项目中音频和视频的解码器库,以及libavformat——一个音频与视频格式转换库。官网https://ffmpeg.org
命令行调用ffmpeg示例:ffmpeg -i test_video.mp4 -i test_audio.mp4 -c copy out.mp4
当然,此爬虫并没有完善,还可以加入诸多功能,比如说下载进度显示、异常处理,番剧和含列表视频下载支持。
代码公开在Github,仓库地址:https://github.com/hlwdy/pybilibili