通过网易云歌单链接下载网易云歌曲

本文介绍了如何使用Python从网易云音乐通过歌单链接下载歌曲。讲解了观察网络请求、提取链接、处理非法字符以及实际运行过程中的步骤。读者需要理解HTTP、HTML,并具备基本的Python编程能力。
部署运行你感兴趣的模型镜像

通过网易云歌单链接下载网易云歌曲

系统开发环境

	操作系统:windows 10
	Python版本:Python3.x
	开发工具:pycharm 2019.2
	所需模块:os,requests, lxml(请确认pycharm上是否有安装否则导入会报错)

难度系数:⭐⭐

一、先上图(最终效果)

最终效果
说明:可见即可爬,暂时只能爬取已经显示的歌曲列表,后面知道怎么爬取全部歌曲有时间会更新或者另写一篇。

二、需要理解的知识点

  1. 通过F12或者右键检查调出开发者工具,查看Network找到播放列表请求链接,找到播放列表链接和歌单链接之间的规律
    如图可以看到他们之间的规律为https://music.163.com/playlist?id=歌单链接最后的id,即"https://music.163.com/playlist?id=%s" % 歌单id
    在这里插入图片描述

    代码:

    import requests
    from lxml import etree
    
    # 歌单地址和播放列表地址不一样,所以需要一些处理
    str = input(r"请输入要下载的歌单链接:")
    print()
    # 获取歌单最后面的id
    id = str.split("=")[-1]
    # playlist中的请求地址
    url = "https://music.163.com/playlist?id=%s" % id
    # 伪装头部信息爬取当前网页全部内容
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"}
    
  2. 获取网易云歌曲链接和歌曲名

    查看url
    查看url
    查看歌曲id
    查看歌曲id
    复制id到编译工具查找对应的标签
    复制id到编辑工具
    查找对应的标签方便提取(这里应该是在Pycharm上查看比较好,content中能打印出来的就能解析出来,有的网站做了反爬会根据你的Hearders和ip决定给你展示多少内容,有些内容并不会给你展示而你是根据网页中的Elements解析的内容,你就获取不到你解析中想要的内容)
    在这里插入图片描述
    根据标签提取name和url
    根据url获取音乐名和链接
    代码:

    def get_content(url):
        # 1.请求要抓取的网站--获取网站返回的数据
        html = requests.get(url, headers=headers).content.decode("utf-8")
        # 2.加载html
        tree = etree.HTML(html)
        # print(html)
        """
        // : 根目录
        [] :谓语-条件
        / : 单个元素
        @ :提取这个元素
        """
        url_music = tree.xpath('//ul[@class="f-hide"]/li/a/@href')
        name = tree.xpath('//ul[@class="f-hide"]/li/a/text()')
    
  3. 获取网易云歌曲外链
    这里用的是第二个
    外链工具
    查看音乐id
    音乐id
    复制到网易外链转换查找
    在这里插入图片描述
    分析规律
    规律
    代码:

        for index, item in enumerate(url_music):
            url_id = item.split("=")[-1]
            file_name = name[index]
            # print(url_id, file_name)
            print("正在读取 %s.mp3" % file_name)
            # 网易云外链 http://music.163.com/song/media/outer/url?id=
            music_base = "http://music.163.com/song/media/outer/url?id=%s" % url_id
            print(music_base)
            # 加r防止字符转义
            file_path = r"E:\PyCharm\Project\Module_01\网易云歌曲/%s.mp3" % file_name
    
  4. 读取音乐文件并写入
    这个可能会报异常,因为如果歌曲名中有\ / : * ? " < > | 是不符合windows命名规范的,已用正则做处理(更)
    导入re库,用sub替换非法字符
    import re
    new_name = re.sub(r’[/:?*"<>|]+’, ‘_’, file_name)
    异常

    代码:

            with open(file_path, "wb") as mu:
                try:
                    req = requests.get(music_base, headers=headers)
                    mu.write(req.content)
                    print("下载 %s.mp3 成功" % file_name)
                    print()
                except Exception as e:
                    print("读取 %s.mp3 失败" % file_name)
                    pass
                continue
    
    
    get_content(url)
    

三、运行

复制歌单链接
复制歌单链接
粘贴到编辑器
粘贴到编辑器
因为直接粘贴并Enter会打开网页跳转到网页界面,所以链接后面加个空格再按Enter键
在这里插入图片描述
好了,你可以看到音乐开始下载了
在这里插入图片描述
查看音乐
Ctrl+Alt+F12打开音乐文件目录或者右键后再点击Directory Path打开

参考
在这里插入图片描述

四、项目全部代码(2020.9.29更)

import os
import re

import requests
from lxml import etree

# 歌单地址和播放列表地址不一样,所以需要一些处理
str = input(r"请输入要下载的歌单链接:")
print()
# 获取歌单最后面的id
id = str.split("=")[-1]
# playlist中的请求地址
url = "https://music.163.com/playlist?id={}".format(id)
# 伪装头部信息爬取当前网页全部内容
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"}


def get_content(url):
    # 1.请求要抓取的网站--获取网站返回的数据
    html = requests.get(url, headers=headers).content.decode("utf-8")
    # 2.加载html
    tree = etree.HTML(html)
    # print(html)
    """
    // : 根目录
    [] :谓语-条件
    / : 单个元素
    @ :提取这个元素
    """
    url_music = tree.xpath('//ul[@class="f-hide"]/li/a/@href')
    name = tree.xpath('//ul[@class="f-hide"]/li/a/text()')
    # print(url_music, name)
    for index, item in enumerate(url_music):
        url_id = item.split("=")[-1]

        file_name = name[index]
        # 将不符合windows文件命名规范的文件名用 _ 替换
        new_name = re.sub(r'[/\:?*"<>|]+', '_', file_name)

        # print(url_id, file_name)
        print("正在读取 {}.mp3".format(file_name))
        # 网易云外链 http://music.163.com/song/media/outer/url?id=
        music_base = "http://music.163.com/song/media/outer/url?id={}".format(url_id)
        print(music_base)
        # 加r防止字符转义
        file_dir = "E:\PyCharm\Project\Module_09\网易云歌曲"
        file_path = r"{}/{}.mp3".format(file_dir, new_name)
        # 判断文件目录是否存在,如果不存在,新建一个文件夹
        if not os.path.exists(file_dir):
            os.makedirs(file_dir)
        with open(file_path, "wb") as mu:
            try:
                req = requests.get(music_base, headers=headers)
                mu.write(req.content)
                print("下载 {}.mp3 成功".format(new_name))
                print()
            except Exception as e:
                p = print("读取 {}.mp3 失败".format(new_name))
                continue


if __name__ == '__main__':
    get_content(url)

如果觉得对你们有帮助可以点个赞或者关注一波哦~
祝你们听的愉快~
在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值