也是感觉好久都没有写博客了,主要是因为学业繁忙(其实是想多摆烂一会儿。。。)
距离暑假还有一个月,各科老师也开始布置相关的期末考试内容了。。。。。。
最近英语老师给我们留了一个期末作业(大学牲又要忙起来了),内容是拍摄一个短视频,既然是视频那素材是少不了的(我还是负责剪辑),于是我们组员开始在某站上寻找素材,找到视频发现下载不了视频,本来是想着既然下载不了,那就直接录屏吧。But,我又觉得既然学了爬虫那就要把它利用起来,顺便就当复习一下相关知识(也是好久没有写爬虫了)。
接下来让我们可以如何爬取某站上的视频吧,
话不多说直接上代码:
import requests,json,pprint,re
import os
from moviepy.editor import *
""" 获取url响应体 """
def getResponse(url):
# 设置请求头
# referer:必须要设置,否则会返回403没有权限访问,加上这段就代表我们是从哪个网页请求过来的
# User-Agent:设置浏览器标识
headers = {
'referer':'https://www.bilibili.com/',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36'
}
"""发起get请求"""
response = requests.get(url=url,headers=headers)
return response
""" 解析响应体 """
def parseResponse(url):
# 获取url响应体
response = getResponse(url)
# 用正则表达式取出返回的视频数据
html_data = re.findall('',response.text)[0]
# 解析成json数据
JsonData = json.loads(html_data)
# 获取视频标题
videoTitle= re.findall('(.*?) ',response.text)[0]
# 获取音频
audioUrl = JsonData['data']['dash']['audio'][0]['baseUrl']
# 获取视频
videoUrl = JsonData['data']['dash']['video'][0]['baseUrl']
# 封装视频信息
videoInfo = {
'videoTitle':videoTitle,
'audioUrl':audioUrl,
'videoUrl':videoUrl,
}
print("获取Response信息成功!")
return videoInfo
""" 保存视频 """
def videoSave(fileName,audioUrl,videoUrl):
# 获取音频和视频的二进制内容
audioResponse = getResponse(audioUrl).content
videoResponse = getResponse(videoUrl).content
# 写入文件
with open('./video/'+fileName+'.mp3',mode='wb') as f:
f.write(audioResponse)
f.close()
with open('./video/'+fileName+'.mp4',mode='wb') as f:
f.write(videoResponse)
f.close()
print("保存视频成功!")
""" 合并音频和视频 """
def AvMerge(Mp3Name,Mp4Name,savePath):
print("开始合并音频和视频.........")
video = VideoFileClip(Mp4Name)
audio = AudioFileClip(Mp3Name)
video_merge = video.set_audio(audio)
video_merge.write_videofile(savePath)
os.remove(Mp3Name)
os.remove(Mp4Name)
print("合并成功!")
def main():
url = input("请输入B站视频url地址:")
videoBaseUrl = 'D:\\desktop\\Code\\pythonCode\\B站视频爬取\\'
videoInfo = parseResponse(url)
videoSave(videoInfo['videoTitle'],videoInfo['audioUrl'],videoInfo['videoUrl'])
fileName = videoInfo['videoTitle']
AvMerge(videoBaseUrl+'video\\'+fileName+'.mp3',videoBaseUrl+'video\\'+fileName+'.mp4',videoBaseUrl+'\\video\\'+'merge'+fileName+'.mp4')
if __name__ == '__main__':
main()
以上就是爬取视频的代码,基本上每个地方都有注释,相信有爬虫基础的小伙伴都能看懂,一个视频会爬了,那批量爬取就不是什么难事了,我这里的是单视频爬取,有兴趣的小伙伴也可以自己实现一个批量视频爬取。