仁科百华资料 如何利用 Python 批量下载 Bilibili up主视频
最近学习各式常识仁科百华资料,仍是从 Youtube 迁徙到了 Bilibili 。之前一直观得B站是个二次元的全国。天然当今亦然,然则各式学习资源险些太多了。最主要的原因便是莫得告白!有些视频的确很抢手,然则偶尔会有版权问题,会被B站下架,是以B站的保藏夹偶尔会出现视频丢失的情况。为了幸免这种情况的发生,决定把优秀的资源下载到腹地保存。是以又要请出咱们的神器Python了。
利用 Python 的 Requests 库,基本上汇集上的资源没什么不行下载的。即使有,那么加上 Selenium 也不成问题。
熟女乱伦网 一、利用you-get下载哔哩哔哩播放列表you-get 是一个开源法子,专诚用来下载各式视频的,从名字上来看,就知说念动身点应该仅仅为了下载 Youtube 视频的,之后跟着各式 contributer 的加入,发展成了一个不错下载各式视频网站的器具。不错在这里稽查中语阐述。
1. 装置 you-get装置 you-get 之前,还得装置 you-get 的各式依赖才不错进愚弄用。 - python - FFmpeg
2. 使用 you-get使用程序也很简便,径直一句话代码下载即可。
you-get --playlist <url>
PS:对于 you-get 不知说念为什么,有本领老是出现没速率的情况,况且对于文献名问题,没主义自界说。Forece 下载了几P,然后就不断的出现超时差错。于是就废弃了这个庞大的器具。
二、利用 Python 下载B站播放列表视频对于 Python 爬虫就未几说了,这里也写不下,人人我方去B站学吧。这里仅仅讲一下分析经过。
1. 分析网页通过分析视频列表页,发现基本上总共信息齐在 HTML 里边了。
1. 视频、音频地址通过分析,亚洲欧美另类发现视频、音频被拆分为两部分。而这段代码齐在
<script>window.__playinfo__=
这段代码之后,进行 JSON 体式化之后省略是这表情的,通过分析,拿到刻下播放视频的 Video URL 还有 Audio URL。
2. 并吞文献因为视频和音频是分袂的,是以需要用到 FFmpeg 来将两个文献进行并吞。铭记需要将 FFmpeg 加入环境变量先。并吞敕令是:
ffmpeg -i video.mp4 -i audio.mp4 -c copy final.mp43. 视频列表信息
知说念如何下载单个视频后,就需要对总共这个词列表进行分析。很庆幸的是,在搜索联系良友的本领,发现了一个 API,
https://api.bilibili.com/x/player/pagelist?aid=xxxxxx
通过拜谒这个网址,就不错拿到一个 JSON 文献,里边便是播放列内外边的总共信息,不外需要传入一个 aid 值。 aid 值也很容易找到,在底本的 HTML 中就不错利用正则索要到。之后咱们就通过遍历这个 JSON 文献,然后就能下载总共的视频了。
其实视频页面的 HTML 也能拿到这个列表,不外利用正则索要稍稍艰难了点。是以不如径直利用 API 赢得信息。
4. 完满代码仁科百华资料
import re import requests import json import os headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36', 'cookie': "" # YOUR COOKIES } def download_single_video(url, name): res = requests.get(url, headers=headers) video_pattern = '__playinfo__=(.*?)</script><script>' playlist_info = json.loads(re.findall(video_pattern, res.text)[0]) video_url = playlist_info['data']['dash']['video'][0]['baseUrl'] audio_url = playlist_info['data']['dash']['audio'][0]['baseUrl'] save_file(video_url, 'video') save_file(audio_url, 'audio') merge(name) print('{} 下载兑现'.format(name)) def save_file(url, type): download_content = requests.get(url, headers=headers).content with open('{}.mp4'.format(type), 'wb') as output: output.write(download_content) def merge(name): command = 'ffmpeg -i video.mp4 -i audio.mp4 -c copy "{}".mp4'.format(name) os.system(command) os.remove('video.mp4') os.remove('audio.mp4') def get_list_info(url): aid_pattern = 'window.__INITIAL_STATE__={"aid":(\d*?),' res = requests.get(url, headers=headers) aid = re.findall(aid_pattern, res.text)[0] playlist_json_url = 'https://api.bilibili.com/x/player/pagelist?aid={}'.format(aid) json_info = json.loads(requests.get(playlist_json_url, headers=headers).content.decode('utf-8'))['data'] return json_info if __name__ == '__main__': base_url = 'https://www.bilibili.com/video/BV14J4114768' json_info = get_list_info(base_url) for i in json_info: p = i['page'] name = 'P{} - {}'.format(p, i['part']) url = base_url + '?p={}'.format(p) download_single_video(url, name)