likes
comments
collection
share

爬取某站音频

作者站长头像
站长
· 阅读数 14

写在前面

最近不是在入门Web3吗,但是大部分的资料都是英文,这真的是让人头大.

爬取某站音频 所以没办法,每天学点英语吧,哪怕不会讲,至少需要看得懂吧。并且还要准备六级,啊啊啊,头大啊。

那就好好学吧,就在B站上找各种各样的资料,最后找到了一个视频资料,里面的老师真的太好啦,墙裂推荐,全英文授课并且使用的单词都是日常词汇,一节课跟下来也能看听懂个60%,注意是直接盲听,没有翻译的那种,这一下把我的积极性给整起来了视频地址

爬取某站音频 现在需求来了,我想把这个音频下载到自己的手机上,注意是音频,不是视频。让自己能随时随地听,有些朋友可能会说,B站手机端不是有听视频的功能吗,为什么一定要下载再听呢?因为我一直认为,短视频,从商业的角度来说,这绝对是成功的。但从个人发展的角度,很大程度上是有害的。经常在网络上看到有人聊,短视频怎么怎么有危害,我要怎么才能戒掉它,但这没有讲到根本。我对这个东西的看法就是,人都是会死的,但我想死的慢一点。现在谁不会看短视频,上到八十岁老人,下到三岁小孩,不说未来,现在短视频已经涉及到我们的方方面面,想要彻底断绝很难,不是说不可能。我们都希望能够晚点接触死亡,但晚点不代表死亡不会到来,所以有些人天天锻炼,经常健身,饮食均衡,目的就是让自己死的慢点。在面对短视频的时候,我也想死的慢点,所以我尽量让自己接触那些高质量,有价值的内容,能让自己认知,能力各方各面都能得到提升的内容。具体落实到实践,我不会允许自己的手机(那种随手可得的电子设备)有抖快B站,游戏等等会分散注意力的软件。

也真是因为有这哪哪这的需求,所以我才想把这套视频的音频抓取下来。 废话不多说,直接上代码,建议大家和我在B站发布的视频使用一起使用喔

代码实践

页面分析

爬取某站音频

爬取某站音频

爬取某站音频 告诉大家吧,其实就是这个。不要问我怎么知道,问就是靠直觉,有没有觉得像以前问学霸题目,哈哈哈,这个歌大家多爬几个网站就会知道的。

实际代码

  1. 爬取一条视频的音频
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字段,否则请求拿不到真实的音频数据的

  1. 爬取多条视频的音频
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
评论
请登录