python爬虫:免费下载周董的歌

331 阅读2分钟

导语:

在经历了汪啊,王啊,吴啊等一系列的翻车案,网友们破碎的心全寄托在周杰伦身上了,挺住,杰伦,你是网民们最后的底线了…

杰伦啊,你要是想喝奶茶呢你就喝,你要是不想发专辑呢咱就不发,你就好好在家养老开心就好,做一个好老公好爸爸,千万别折腾...

正文:

今天小编写一个python案例,免费下载周董的歌,在这里我们所需要的第三方库:

import requests
from lxml import etree

import re

实现的大思路分为两步:

  1. 获得歌曲的名字
  2. 将音频下载下来,并以其对应的名字本地保存

①获取名字

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

对该url请求得到json数据:

观察发现歌曲名字在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

②获取音频

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

音频地址

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

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)

运行结果如图所示:

结尾:

好啦今日代码分享就到这了,喜欢的记得三连噢~家人们的支持是小编更新最大的动力!需要源码的可以私信小编哦!点击这个也行