爬取某站音频
写在前面
最近不是在入门Web3吗,但是大部分的资料都是英文,这真的是让人头大.
所以没办法,每天学点英语吧,哪怕不会讲,至少需要看得懂吧。并且还要准备六级,啊啊啊,头大啊。
那就好好学吧,就在B站上找各种各样的资料,最后找到了一个视频资料,里面的老师真的太好啦,墙裂推荐,全英文授课并且使用的单词都是日常词汇,一节课跟下来也能看听懂个60%,注意是直接盲听,没有翻译的那种,这一下把我的积极性给整起来了视频地址
现在需求来了,我想把这个音频下载到自己的手机上,注意是音频,不是视频。让自己能随时随地听,有些朋友可能会说,B站手机端不是有听视频的功能吗,为什么一定要下载再听呢?因为我一直认为,短视频,从商业的角度来说,这绝对是成功的。但从个人发展的角度,很大程度上是有害的。经常在网络上看到有人聊,短视频怎么怎么有危害,我要怎么才能戒掉它,但这没有讲到根本。我对这个东西的看法就是,人都是会死的,但我想死的慢一点。现在谁不会看短视频,上到八十岁老人,下到三岁小孩,不说未来,现在短视频已经涉及到我们的方方面面,想要彻底断绝很难,不是说不可能。我们都希望能够晚点接触死亡,但晚点不代表死亡不会到来,所以有些人天天锻炼,经常健身,饮食均衡,目的就是让自己死的慢点。在面对短视频的时候,我也想死的慢点,所以我尽量让自己接触那些高质量,有价值的内容,能让自己认知,能力各方各面都能得到提升的内容。具体落实到实践,我不会允许自己的手机(那种随手可得的电子设备)有抖快B站,游戏等等会分散注意力的软件。
也真是因为有这哪哪这的需求,所以我才想把这套视频的音频抓取下来。 废话不多说,直接上代码,建议大家和我在B站发布的视频使用一起使用喔
代码实践
页面分析
告诉大家吧,其实就是这个。不要问我怎么知道,问就是靠直觉,有没有觉得像以前问学霸题目,哈哈哈,这个歌大家多爬几个网站就会知道的。
实际代码
- 爬取一条视频的音频
import requests
# requests包需要额外安装: pip install requests -i https://pypi.douban.com/simple
import re
import json
import random
def DownloadAudio():
# 获取原始页面数据
text_page = requests.get(url=url, headers=headers).text
# 解析出格式化的数,因为b站的前端页面改了,把那些格式化的数据嵌在script标签中
json_str = re.findall("window.__playinfo__=(.*?)</script>", text_page)
# 反序列化数据
data = json.loads(json_str[0])
# 解析出音频的URL
audio_url = data['data']['dash']['audio'][0]['baseUrl']
# 对音频URL发起请
content = requests.get(url=audio_url, headers=headers).content
# 保存音频数据
with open("./audio/{}.mp3".format(random.randint(100, 999)), 'wb') as fp:
fp.write(content)
if __name__ == "__main__":
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36",
"referer": "https://www.bilibili.com",
}
url = "https://www.bilibili.com/video/BV1qF411t775/"
DownloadAudio()
经过我们分析,每播放一个视频,拿到的音频地址就是那个正在播放的视频的,所以我们需要对视频列表中所有的视频发起请求,然后拿到相对应的音频地址。
特别需要注意的是,当我们拿到音频地址的时候,请务必在headers
加上referer
字段,否则请求拿不到真实的音频数据的
- 爬取多条视频的音频
https://www.bilibili.com/video/BV1qF411t775?p=1&vd_source=7cc08d639d8a63e2f7b12375409b89a8
https://www.bilibili.com/video/BV1qF411t775?p=2&vd_source=7cc08d639d8a63e2f7b12375409b89a8
https://www.bilibili.com/video/BV1qF411t775?p=3&vd_source=7cc08d639d8a63e2f7b12375409b89a8
https://www.bilibili.com/video/BV1qF411t775?p=4&vd_source=7cc08d639d8a63e2f7b12375409b89a8
......
从地址栏可以发现,P
控制播放列表中的每一个视频,所以我们直接起一个循环,沿用之间的逻辑就可完成需求
import requests
import re
import json
def DownloadAudio(url, headers, num):
for i in range(1, num + 1):
# 获取原始页面数据
text_page = requests.get(url=url.format(i), headers=headers).text
# 解析出格式化的数,因为b站的前端页面改了,把那些格式化的数据嵌在script标签中
json_str = re.findall("window.__playinfo__=(.*?)</script>", text_page)
# 反序列化数据
data = json.loads(json_str[0])
# 解析出音频的URL
audio_url = data['data']['dash']['audio'][0]['baseUrl']
# 对音频URL发起请
content = requests.get(url=audio_url, headers=headers).content
# 保存音频数据
with open("./audio/{}.mp3".format(i), 'wb') as fp:
fp.write(content)
print("{}下载完成。".format(i))
if __name__ == "__main__":
header = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36",
"referer": "https://www.bilibili.com",
}
start_url = "https://www.bilibili.com/video/BV1qF411t775/?p={}"
DownloadAudio(start_url, header, num=95)
总结
这篇文档主要是为了完成我的特殊需求,所以对于代码没有做很好的封装,一切都是为了完成自己需求为主。希望大家能够从我的例子中得到启发以完成自己的需求。如果有任何问题欢迎在评论区留言,或者B站视频下留言~
转载自:https://juejin.cn/post/7211075678833279035