安迪Python
2023/02/18阅读:109主题:默认主题
25. Python爬虫教学:爬取B站视频源代码(复制可用)
25. Python爬虫教学:爬取B站视频源代码(复制可用)
1. 准备工作
-
Python解释器(我安装的是Python3.9.6);
-
pycharm编辑器或vscode编辑器;
-
安装requests。
安装命令:
pip install requests
-
ffmpeg 软件。
ffmpeg 软件的作用合成视频。
因为b站的音频数据和视频画面是数据是分开的,需要用 ffmpeg 合成后才能得到我们要的视频。
ffmpeg 需要安装并配置变量环境后才能使用。
找 xyz77520520
获取 ffmpeg 软件。
-
在电脑桌面新建一个文件夹,命名为
爬虫
。 -
在
爬虫
文件夹里新建一个名为爬B站视频.py
文件。 -
用编辑器打开
爬虫
文件夹,在爬B站视频.py
文件中编写代码。 -
将下面的源代码复制到
爬B站视频.py
中运行即可。
【温馨提示】
源代码中的url变量需要修改成你要下载的网址。
不理解相对路径的同学,按照我的笔记用打开文件夹。
,打开的文件夹不同,相对路径不同。
不懂相对路径知识,你可能找不到下载的音频和视频画面,且程序也找不到要合成的音频和视频画面。
懂相对路径的同学就可以随意了。
2. 爬取视频源代码
# 导入数据请求模块 安装命令:pip install requests
import requests
# 正则表达式 不需要安装
import re
# 导入json 不需要安装
import json
# 导入进程模块
import subprocess
# os模块是Python中整理文件和目录最为常用的模块
import os
# 要请求的网址:B站视频网址
# 这个变量需要替换成你要下载的视频网址
url = "https://www.bilibili.com/video/BV1Vq4y1Z7op"
# 添加headers请求头,对Python解释器进行伪装
# referer 和 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/108.0.0.0 Safari/537.36"
}
# 用 requests 的 get 方法访问网页
response = requests.get(url=url, headers=headers)
# 返回响应状态码:<Response [200]>
print("返回200,则网页请求成功:",response)
# .text获取网页源代码
# print(response.text)
# 提取视频标题
# 调用 re 的 findall 方法,去response.text中匹配我们要的标题
# 正则表达式提取的数据返回的是一个列表,用[0]从列表中取值
title = re.findall('<h1 title="(.*?)"', response.text)[0]
# 如果标题里有[\/:*?<>|]特殊字符,直接删除
title = re.sub(r"[\/:*?<>|]","",title)
print("视频标题为:",title)
# type函数查看title的数据类型
# print(type(title))
# 提取 playinfo 里的数据
# 调用 re的 findall 方法,去 response.text 中匹配我们要的数据
# 正则表达式提取的数据返回的是一个列表,用[0]从列表中取值
html_data = re.findall('<script>window.__playinfo__=(.*?)</script>', response.text)[0]
# html_data是字符串类型,将字符串转换成字典
json_data=json.loads(html_data)
# 让pycharm控制台以json格式化输出
# 不影响程序,只改变pycharm或vscode编辑器的终端输出显示
# indent=4 缩进4个空格
json_dicts = json.dumps(json_data,indent=4)
# print(json_dicts)
# 提取视频画面网址
video_url = json_data["data"]["dash"]["video"][0]["baseUrl"]
print("视频画面地址为:", video_url)
# 提取音频网址
audio_url = json_data["data"]["dash"]["audio"][0]["baseUrl"]
print("音频地址为:", audio_url)
# response.content获取响应体的二进制数据
video_content = requests.get(url=video_url,headers=headers).content
audio_content = requests.get(url=audio_url,headers=headers).content
# 创建mp4文件,写入二进制数据
with open (title+".mp4", mode = "wb") as f :
f.write(video_content)
# 创建mp3文件,写入二进制数据
with open (title+".mp3", mode = "wb") as f :
f.write(audio_content)
print("数据写入成功!")
# 合成视频
# ffmpeg -i video.mp4 -i audio.wav -c:v copy -c:a aac -strict experimental output.mp4
cmd =f"ffmpeg -i {title}.mp4 -i {title}.mp3 -c:v copy -c:a aac -strict experimental {title}(最终版).mp4"
subprocess.run(cmd,shell=True)
print( '恭喜你,视频合成成功!')
# 删除不需要的mp3和mp4文件
os.remove(f'{title}.mp3')
os.remove(f'{title}.mp4')
print("程序结束!")
运行上述的代码,在我们刚才新建的爬虫
文件夹中会多增加了一个视频。
3. 更改代码
1. 更改url
url = "https://www.bilibili.com/video/BV1Vq4y1Z7op"
原则上你只需要把url变量中的网址替换成你需要的网址程序就能成功运行,下载到你想要的视频。
2. 更改title
如果数据写入成功,但没合成视频,可能是视频标题里含有的特殊字符导致视频没有合成成功。
不懂正则表达的同学,直接给变量title赋值,也课修改这个错误。
下面的代码是原本的title:
# 提取视频标题
# 调用 re 的 findall 方法,去response.text中匹配我们要的标题
# 正则表达式提取的数据返回的是一个列表,用[0]从列表中取值
title = re.findall('<h1 title="(.*?)"', response.text)[0]
# 如果标题里有[\/:*?<>|]特殊字符,直接删除
title = re.sub(r"[\/:*?<>|]","",title)
print("视频标题为:",title)
直接赋值修改变量title,注意下面的倒数第2行代码:
# 提取视频标题
# 调用 re 的 findall 方法,去response.text中匹配我们要的标题
# 正则表达式提取的数据返回的是一个列表,用[0]从列表中取值
title = re.findall('<h1 title="(.*?)"', response.text)[0]
# 如果标题里有[\/:*?<>|]特殊字符,直接删除
title = re.sub(r"[\/:*?<>|]","",title)
title = "爬虫教学"
print("视频标题为:",title)
3. 相对路径错误
还有的同学没有下载成功,就是相对路径错误。
那就是因为即不懂相对路径,又不按我的方式来打开文件夹。
建议回看以前的笔记:
70.with open( ) as 以自动关闭文件的方式打开文件https://mp.weixin.qq.com/s?__biz=MzI2MzE1NTg2OA==&mid=2649776391&idx=1&sn=24419a14191b74fb772e5a74df809466&chksm=f244f8f4c53371e264b4fe2779f2ba42fbc6f801ddd10ec86efa41f9a24bf93f274ebc47ca95#rd
4. 温馨提示
只想要源代码的可以直接复制,或者找 xyz77520520
想了解代码含义的,关注后面的笔记,会有详细介绍。
作者介绍