python初级爬虫实战:我是怎么用python下载音乐的

今天分享的内容是如何使用python下载歌曲和歌词信息,文章涉及内容主要为了帮助大家学习python技能,请大家合规合理使用。

如果你正在学习Python爬虫,但是找不到方向的话可以试试我这一份学习方法和籽料呀!点击 领取(不要米米)

首先,我们想要批量下载歌曲,那么需要找到下载源,我这里使用的是某钟音乐网,首页是这样的

在这里插入图片描述

我们去爬取数据,通常都是分为几个步骤:分析目标网站的特征–>获取里列表–>通过列表中的数据–>获取具体的内容。

  • 分析目标网站特征:

  • 1)歌手信息:

我们刷新首页,抓包的时候,看到这个接口是有返回接口数据的,但很快就会发现,这个接口只返回了18个歌手的信息,我们不能通过这个方式来得到歌手的信息;经过分析网站上的多个页面,我并没有找到现成的接口可以获取到。

在这里插入图片描述

既然没有现成的接口,那么我们能不能通过解析页面html源码来得到歌手信息呢?答案是可以的,我在页面的html源码中找到了歌手的标签。可以通过bs4这个第三方库来解析html源码得到。(这里不扩展,等后面有空了,再专门写一篇关于bs4的文章吧)

在这里插入图片描述

  • 2)获取歌手下的歌曲信息:

嘿嘿,这个接口妥妥的有现成的,我已经给大家找到了。我们只需要拼接接口地址,加上歌手名字就可以得到该歌手在该网站上的所有歌曲了。

在这里插入图片描述

  • 3)获取歌曲的下载地址:

这个也是有现成接口地址的,我们只需要将歌曲id替换成步骤2)中得到的歌曲id即可。

在这里插入图片描述

  • 4)获取歌词信息:

这个也是有现成接口地址的,我们只需要将歌曲id替换成步骤2)中得到的歌曲id即可。

在这里插入图片描述

  • 代码编写

好了,现在所需的准备工作我们已经做好了,接下来就是开始写代码了。

  • 1)根据歌手名字获取歌曲信息

# 获取张碧晨的所有歌曲信息
url = "https://music-api.tonzhon.com/songs_of_artist/张碧晨"

def get_music_info(url):
    music_url = get_url(url).json()
    songs_list = music_url['songs']
    music_info = {}
    if len(songs_list) > 0:
        for item in songs_list:
            name = item['name']
            id = item['newId']
            music_info[name] = id
    return music_info

music_info = get_music_info(url)

在这里插入图片描述

  • 2)使用歌曲id获取歌曲下载地址

base_url = "https://music-api.tonzhon.com/song_file/{}"
def get_music_download_url(music_info_list,base_url):
    for name,id in music_info_list.items():
        url = base_url.format(id)
        response = get_url(url).json()
        if response:
            try:
                download_url = response['data']
                print(f"歌曲: {name}\n下载地址:https:{download_url}")
            except Exception as e:
                print(f"歌曲【{name}】已下线,地址:{url}")

music_info_list = get_music_info(music_url)
get_music_download_url(music_info_list,base_url)

在这里插入图片描述

  • 3)封装下载文件的函数,后续放在步骤2)中调用

# 下载歌曲
def download_music(url,file_name):
    response = get_url(url)
    print(response)
    with open(file_name,'wb') as f:
        f.write(response.content)

  • 4)封装下载歌词文件的函数,然后再步骤2)中调用

# 下载歌词
def get_music_lyric(id,name):
    lrc_base_url = "https://music-api.tonzhon.com/lyrics/{}"
    lrc_url = lrc_base_url.format(id)
    response = get_url(lrc_url).json()
    try:
        lrc_content = response['data']
        lrc_name = "E:\\音乐下载\\"+name + '.lrc'
        with open(lrc_name,'w') as f:
            f.write(lrc_content)
        print(f"【{name}】的歌词下载完成")
    except Exception as e:
        print(e)
        print(f"【{name}】的歌词内容不存在,地址:{lrc_url}")
  • 5)将所有代码精简整合到一起

import time
import requests


def get_url(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
    }
    try:
        response = requests.get(url, headers=headers)
        response.raise_for_status()
        return response
    except Exception as e:
        print(e)
        return None

# 根据歌手名字获取歌曲信息
def get_music_info(geshou_name):
    url = "https://music-api.tonzhon.com/songs_of_artist/{}".format(geshou_name)
    music_url = get_url(url).json()
    songs_list = music_url['songs']
    music_info = {}
    if len(songs_list) > 0:
        for item in songs_list:
            name = item['name']
            id = item['newId']
            music_info[name] = id
    return music_info

# 下载歌曲
def download_music(url,file_name):
    response = get_url(url)
    with open(file_name,'wb') as f:
        f.write(response.content)
# 下载歌词
def get_music_lyric(id,name):
    lrc_base_url = "https://music-api.tonzhon.com/lyrics/{}"
    lrc_url = lrc_base_url.format(id)
    response = get_url(lrc_url).json()
    try:
        lrc_content = response['data']
        lrc_name = "E:\\音乐下载\\"+name + '.lrc'
        with open(lrc_name,'w') as f:
            f.write(lrc_content)
        print(f"【{name}】的歌词下载完成")
    except Exception as e:
        print(e)
        print(f"【{name}】的歌词内容不存在,地址:{lrc_url}")

def get_music_main(music_info_dict):
    for name,id in music_info_dict.items():
        # 先下载歌曲
        song_base_url = "https://music-api.tonzhon.com/song_file/{}"
        url = song_base_url.format(id)
        response = get_url(url).json()
        if response:
            try:
                download_url = "https:"+response['data']
                print(f"歌曲: {name}\n下载地址:{download_url}")
                file_name = "E:\\音乐下载\\"+name + '.mp3'
                download_music(download_url,file_name)
                print(f"【{name}】的歌曲文件下载完成")
            except Exception as e:
                print(f"【{name}】歌曲不存在,地址:{url}")

        # 再下载歌词文件
        get_music_lyric(id,name)

if __name__ == '__main__':
    # 根据歌手名字获取歌曲信息,存放入字典
    music_info_dict = get_music_info("张碧晨")
    # 根据歌曲信息下载歌曲和歌词
    get_music_main(music_info_dict)

执行效果如下:

在这里插入图片描述

在这里插入图片描述

欢迎感兴趣的小伙伴长期关注、点赞、转发

最后 如果你对Python感兴趣的话,可以试试我整理的这份Python全套学习资料,【点击这里】领取!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!
Python所有方向的学习路线图,清楚各个方向要学什么东西
100多节Python课程视频,涵盖必备基础、爬虫和数据分析
100多个Python实战案例,学习不再是只会理论
华为出品独家Python漫画教程,手机也能学习
历年互联网企业Python面试真题,复习时非常方便******

在这里插入图片描述

初级教程看:https://download.csdn.net/download/dwf1354046363/20818468 9 网络爬虫进阶之 Selenium 篇 9.1 Selenium 简介 . . . . . . . . 9.1.1 Selenium 是什么 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 9.1.2 Selenium 特点 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 9.1.3 基本安装与使用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 9.1.4 各种浏览器驱动下载地址 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 9.1.5 Selenium 初试 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109 9.2 定位元素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 9.2.1 基本的定位方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 9.2.2 使用 By 定位 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 9.2.3 定位一组元素 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 9.3 控制浏览器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 9.3.1 控制浏览器窗口大小 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 9.3.2 控制浏览器后退、前进 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 9.3.3 模拟浏览器刷新 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 9.4 WebDriver 中的常用方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 9.5 设置元素等待 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 9.5.1 显式等待 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 9.5.2 隐式等待 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 9.6 多表单切换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 9.7 多窗口切换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 9.8 其他操作 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值