实现一键下载,批量快速爬取B站视频
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。
作者:Corley
源自:快学python
一、项目概述
1.项目背景
有一天,我突然想找点事做,想起一直想学但是没有学的C语言,就决定来学一下。可是怎么学呢?看书的话太无聊,报班学呢又快吃土了没钱,不如去B站看看?果然,关键字C语言搜索,出现了很多C语言的讲课视频:
B站https://www.bilibili.com/是一个很神奇的地方,简直就是一个无所不有的宝库,几乎可以满足你一切的需求和视觉欲。不管你是想看动画、番剧 ,还是游戏、鬼畜 ,亦或科技和各类教学视频 ,只要你能想到的,基本上都可以在B站找到。对于程序猿或即将成为程序猿的人来说,B站上的编程学习资源是学不完的,可是B站没有提供下载的功能,如果想保存下载在需要的时候看,那就是一个麻烦了。我也遇到了这个问题,于是研究怎么可以实现一键下载视频,最终用Python这门神奇的语言实现了。
2.环境配置
这次项目不需要太多的环境配置,最主要的是有ffmpeg(一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序)并设置环境变量就可以了。ffmpeg主要是用于将下载下来的视频和音频进行合并形成完整的视频。
下载ffmpeg
可点击https://download.csdn.net/download/CUFEECR/12234789或进入官网http://ffmpeg.org/download.html进行下载,并解压到你想保存的目录。
设置环境变量
- 复制ffmpeg的bin路径,如xxx\ffmpeg-20190921-ba24b24-win64-shared\bin
- 此电脑右键点击属性,进入控制面板\系统和安全\系统
- 点击高级系统设置→进入系统属性弹窗→点击环境变量→进入环境变量弹窗→选择系统变量下的Path→点击编辑点击→进入编辑环境变量弹窗
- 点击新建→粘贴之前复制的bin路径
- 点击确定,逐步保存退出 动态操作示例如下:
除了ffmpeg,还需要安装pyinstaller库用于程序打包。可用以下命令进行安装:
pip install pyinstaller
如果遇到安装失败或下载速度较慢,可换源:
pip install pyinstaller -i https://pypi.doubanio.com/simple/
二、项目实施
1.导入需要的库
import json
import os
import re
import shutil
import ssl
import time
import requests
from concurrent.futures import ThreadPoolExecutor
from lxml import etree
导入的库包括用于爬取和解析网页的库,还包括创建线程池的库和进行其他处理的库,大多数都是Python自带的,如有未安装的库,可使用pip install xxx命令进行安装。
2.设置请求参数
## 设置请求头等参数,防止被反爬
headers = {'Accept': '*/*','Accept-Language': 'en-US,en;q=0.5','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'
}
params = {'from': 'search','seid': '9698329271136034665'
}
设置请求头等参数,减少被反爬的可能。
3.基本处理
def re_video_info(text, pattern):'''利用正则表达式匹配出视频信息并转化成json'''match = re.search(pattern, text)return json.loads(match.group(1))def create_folder(aid):'''创建文件夹'''if not os.path.exists(aid):os.mkdir(aid)def remove_move_file(aid):'''删除和移动文件'''file_list = os.listdir('./')for file in file_list:## 移除临时文件if file.endswith('_video.mp4'):os.remove(file)passelif file.endswith('_audio.mp4'):os.remove(file)pass## 保存最终的视频文件elif file.endswith('.mp4'):if os.path.exists(aid + '/' + file):os.remove(aid + '/' + file)shutil.move(file, aid)
主要包括两方面的基本处理,为正式爬取下载做准备:
- 利用正则表达式提取信息 通过requests库请求得到请求后的网页,属于文本,通过正则表达式提取得到关于将要下载的视频的有用信息,便于后一步处理。
- 文件处理 将下载视频完成后的相关文件进行处理,包括删除生成的临时的音视频分离的文件和移动最终视频文件到指定文件夹。
4.下载视频
def download_video_batch(referer_url, video_url, audio_url, video_name, index):'''批量下载系列视频'''## 更新请求头headers.update({"Referer": referer_url})## 获取文件名short_name = video_name.split('/')[2]print("%d.\t视频下载开始:%s" % (index, short_name))## 下载并保存视频video_content = requests.get(video_url, headers=headers)print('%d.\t%s\t视频大小:' % (index, short_name),round(int(video_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')received_video = 0with open('%s_video.mp4' % video_name, 'ab') as output:headers['Range'] = 'bytes=' + str(received_video) + '-'response = requests.get(video_url, headers=headers)output.write(response.content)## 下载并保存音频audio_content = requests.get(audio_url, headers=headers)print('%d.\t%s\t音频大小:' % (index, short_name),round(int(audio_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')received_audio = 0with open('%s_audio.mp4' % video_name, 'ab') as output:headers['Range'] = 'bytes=' + str(received_audio) + '-'response = requests.get(audio_url, headers=headers)output.write(response.content)received_audio += len(response.content)return video_name, indexdef download_video_single(referer_url, video_url, audio_url, video_name):'''单个视频下载'''## 更新请求头headers.update({"Referer": referer_url})print("视频下载开始:%s" % video_name)## 下载并保存视频video_content = requests.get(video_url, headers=headers)print('%s\t视频大小:' % video_name, round(int(video_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')received_video = 0with open('%s_video.mp4' % video_name, 'ab') as output:headers['Range'] = 'bytes=' + str(received_video) + '-'response = requests.get(video_url, headers=headers)output.write(response.content)## 下载并保存音频audio_content = requests.get(audio_url, headers=headers)print('%s\t音频大小:' % video_name, round(int(audio_content.headers.get('content-length', 0)) / 1024 / 1024, 2), '\tMB')received_audio = 0with open('%s_audio.mp4' % video_name, 'ab') as output:headers['Range'] = 'bytes=' + str(received_audio) + '-'response = requests.get(audio_url, headers=headers)output.write(response.content)received_audio += len(response.content)print("视频下载结束:%s" % video_name)video_audio_merge_single(video_name)
这部分包括系列视频的批量下载和单个视频的下载,两者的大体实现原理近似,但是由于两个函数的参数有差别,因此分别实现。在具体的实现中,首先更新请求头,请求视频链接并保存视频(无声音),再请求音频链接并保存音频,在这个过程中得到相应的视频和音频文件的大小。
5.视频和音频合并成完整的视频
def video_audio_merge_batch(result):'''使用ffmpeg批量视频音频合并'''video_name = result.result()[0]index = result.result()[1]import subprocessvideo_final = video_name.replace('video', 'video_final')command = 'ffmpeg -i "%s_video.mp4" -i "%s_audio.mp4" -c copy "%s.mp4" -y -loglevel quiet' % (video_name, video_name, video_final)subprocess.Popen(command, shell=True)print("%d.\t视频下载结束:%s" % (index, video_name.split('/')[2]))def video_audio_merge_single(video_name):'''使用ffmpeg单个视频音频合并'''print("视频合成开始:%s" % video_name)import subprocesscommand = 'ffmpeg -i "%s_video.mp4" -i "%s_audio.mp4" -c copy "%s.mp4" -y -loglevel quiet' % (video_name, video_name, video_name)subprocess.Popen(command, shell=True)print("视频合成结束:%s" % video_name)
这个过程也是批量和单个分开,大致原理差不多,都是调用subprogress模块生成子进程,Popen类来执行shell命令,由于已经将ffmpeg加入环境变量,所以shell命令可以直接调用ffmpeg来合并音视频。
三、项目分析和说明
1.结果测试
对3种方式进行测试的效果如下:
实现一键下载,批量快速爬取B站视频相关推荐
- 想要快速爬取整站图片?速进(附完整代码)
大家好,我是不温卜火,是一名计算机学院大数据专业大三的学生,昵称来源于成语-不温不火,本意是希望自己性情温和.作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己 ...
- 爬取B站视频 - m4s与flv文件的那些事
参考链接 使用 Python 爬取 B 站视频 爬取B站视频 目录 1. 前言说明 2. 自动化分析 3. 爬取单个视频 4. 批量爬取视频 5. 总结 一.前言说明 ↶ 前言 每次查找资料和研究总是 ...
- python视频网站分类_用Python爬取b站视频
本文概要 爬取B站视频的办法在csdn和B站有很多 但是本文算作是对爬取步骤的一个拆解 同时也算是我的笔记.本代码的参考对象是https://blog.csdn.net/Mr_Ohahah/artic ...
- 从入门到入土:Python实现爬取某站视频|根据视频编号|支持通过视频名称和创作者名称寻找编号|以及python moviepy合并音频视频
写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) Python实现爬取某站视频|根据视频编号|支持通过视频名称 ...
- 爬取B站视频 - m4s文件的相关研究
相关教程的直通车: 怎样在电脑上下载哔哩哔哩的视频? 如何下载B站(bilibili)视频手动法 b站视频怎么保存在手机本地 偶遇的网站: 看哔哩哔哩 唧唧-哔哩哔哩唧唧-bilibili视频|弹幕在 ...
- python爬b站视频_python代码福利:用requests爬取B站视频封面
最近看到一篇文章介绍了利用Python爬虫爬取B站视频封面的文章,虽然我完全没看文章,但是只看了一眼这个封面图就彻底把我吸引了.不过我也对爬虫这方面比较熟悉了,这么简单的事情还用看别人的文章教我做事? ...
- python爬取bilibili弹幕_用Python爬取B站视频弹幕
原标题:用Python爬取B站视频弹幕 via:菜J学Python 众所周知,弹幕,即在网络上观看视频时弹出的评论性字幕.不知道大家看视频的时候会不会点开弹幕,于我而言,弹幕是视频内容的良好补充,是一 ...
- python b站 排行_Python 爬取B站 视频热度排行数据
时间:2019-03-07 概述:抓取数据 爬虫 采集 Python 爬取bilibili站 视频热度排行视频数据,有文件为 bilibili.py,只需输入一个大模块名,如游戏模块名为'game', ...
- python3爬取B站视频历史弹幕
python爬取B站视频历史弹幕 演示 演示 1.运行程序,输入Bvid和爬取日期. 2.程序运行完成后会在当前文件夹下生成一个csv格式文件. 百度网盘链接: https://pan.baidu.c ...
最新文章
- 微软职位内部推荐-Sr. SW Engineer for Privacy Id
- VS2019配置库文件
- ajax 更新页面变量,[Django 1.5] jQuery/Ajax 在Django使用 ,如何更新模板里里变量
- 【错误记录】Error creating bean with name: Unsatisfied dependency expressed through field
- oracle不开归档对效率会快吗,关于性能:存档庞大的数据库(oracle),而不会影响向其插入记录的进程...
- 有关AutoCompleteBox组件的研究[5][Final]_集成搜索引擎搜索建议(Search Suggestion)——Silverlight学习笔记[40]...
- php数据表格的重载,layui数据表格实现重载数据表格功能(搜索功能)
- LeetCode 480. 滑动窗口中位数(大小堆升级版+set实现)
- Dart学习笔记01:环境搭建与开发环境配置
- iphone分屏功能怎么用_iPhone终于上线这功能,可惜安卓都用烂了
- CSS快速学习2:选择符权重和字体类属性
- 2023王道计算机考研数据结构第一章-绪论
- Python问题:ImportError: cannot import name ‘Template‘ from ‘string‘
- 高等数学-【3.1-4】微分中值定理与导数的应用
- 一张废手机卡的作用......
- 5、bam格式转为bigwig格式
- 口袋理财:“来了就是深圳人?”全国均价最高的房租了解一下
- 【Flume】Flume原理简述及示例实践
- HTML(一、语法规范,二、结构标签,三、开发工具,四、HTML常用标签,五、注释和特殊字符)
- VMware设置共享文件夹之后Linux中看不到怎么办?