小破站听周董的歌是一种什么样的体验?我用Python告诉你!




公众号后台回复“图书“,了解更多号主新书内容
     作者:曜
     来源:菜J学Python

作者简介:曜,好奇心重的科研学生党,单纯的爬虫爱好者,以输出倒逼自己输入,希望与大家一起进步。

01

前言

现在要说年轻人的聚集地,小破站(B站)绝对是大多数人的选择,毕竟小破站无所不有,无所不能。最近又发现了大家上B站除了看番,看剧,还有听音乐(如下图),既然这样何不把这些周董的歌的音频爬到本地,供我们享受嘞!

小破站听周董的歌是一种什么样的体验?我用Python告诉你!_第1张图片

话不多说开始着手。

所需要的第三方库:

import requests
from lxml import etree
import re

实现的大思路分为两步:

1、获得这193首歌的名字

2、将音频下载下来,并以其对应的名字本地保存

02

获取歌名

接下来进行第一个任务:获取名字

通过对网页进行分析发现列表的名字以json格式呈现,如下图所示:

小破站听周董的歌是一种什么样的体验?我用Python告诉你!_第2张图片

对该url请求得到json数据:

小破站听周董的歌是一种什么样的体验?我用Python告诉你!_第3张图片

小破站听周董的歌是一种什么样的体验?我用Python告诉你!_第4张图片

观察发现歌曲名字在data里面的part部分,接下来写代码:

#定义一个函数用来获得歌曲名字列表
def get_songname():
    url = 'https://api.bilibili.com/x/player/pagelist?bvid=BV1fx411N7bU&jsonp=jsonp'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42',
    'referer': 'https://www.bilibili.com/video/BV1fx411N7bU'
    }
    r =requests.get(url,headers=headers).json()
    data_list = r['data']
    title_list = []
    for title in data_list:
        title_list.append(title['part'])
    return title_list

03

音频下载

接下来进行第二步:获取音频

依旧对网页分析发现,下面这两张图所对应的分别是视频地址(纯视频无声)【图一】

音频地址【图二】(所以想要爬取视频,emm,大家懂得.....)

小破站听周董的歌是一种什么样的体验?我用Python告诉你!_第5张图片

【图一】

小破站听周董的歌是一种什么样的体验?我用Python告诉你!_第6张图片

【图二】

接下来我们要做的就是从网页源代码中获得音频地址,这就需要用到正则表达式。

小破站听周董的歌是一种什么样的体验?我用Python告诉你!_第7张图片

ok,然后我们写代码来获得地址,并把文件保存到本地:

#传入之前获得的歌曲名字列表
def get_song(title_list):
    for i in range(len(title_list)):#歌曲数量与列表歌曲名数量保持一致
        #构造每一首歌的链接
        url1 = f'https://www.bilibili.com/video/BV1fx411N7bU?p={str(i+1)}'
        headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36 Edg/90.0.818.42',
            'referer': 'https://www.bilibili.com/video/BV1fx411N7bU'
        }
        r = requests.get(url1,headers = headers)
        tree = etree.HTML(r.text)
        link = tree.xpath("/html/head/script[5]/text()")[0]
        #构造正则表达式获得音频地址(获得b站视频将audio换成video即可)
        x = re.findall(r'"audio":\[{"id":\d+,"baseUrl":"(.*?)"', link)[0]
        audio_ = requests.get(x, headers=headers)
        with open(f"{title_list[i]}.mp3", 'wb')as f:
            f.write(audio_.content)

04

运行结果

运行结果如图所示:

小破站听周董的歌是一种什么样的体验?我用Python告诉你!_第8张图片

◆ ◆ ◆  ◆ ◆
麟哥新书已经在当当上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前当当正在举行活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:


数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。
管理员二维码:
猜你喜欢
● 卧槽!原来爬取B站弹幕这么简单● 厉害了!麟哥新书登顶京东销量排行榜!● 笑死人不偿命的知乎沙雕问题排行榜
● 用Python扒出B站那些“惊为天人”的阿婆主!● 你相信逛B站也能学编程吗

你可能感兴趣的:(列表,wireshark,数据可视化,ant,curl)