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

时间:2020-9-1 作者:admin


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

运行环境:

	操作系统:windows 10
	开发平台:pycharm 2019.2
	所需库:requests, lxml(请确认pycharm上是否有安装否则导入会报错)

难度系数:⭐⭐

一、先上图(最终效果)

通过网易云歌单链接下载网易云歌曲
说明:可见即可爬,暂时只能爬取已经显示的歌曲列表,后面知道怎么爬取全部歌曲有时间会更新或者另写一篇。

二、需要理解的知识点

  1. 根据playlist找到真实请求地址,找出规律

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

    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
    通过网易云歌单链接下载网易云歌曲
    查看歌曲id
    通过网易云歌单链接下载网易云歌曲
    复制id到编译工具查找对应的标签
    通过网易云歌单链接下载网易云歌曲
    查找对应的标签方便提取(这里是觉得在编辑器上查看更明了,如果直接看Elements能写出应该怎么样提取,看那个也是可以)
    通过网易云歌单链接下载网易云歌曲
    根据标签提取name和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
    通过网易云歌单链接下载网易云歌曲
    复制到网易外链转换查找
    通过网易云歌单链接下载网易云歌曲
    分析规律
    通过网易云歌单链接下载网易云歌曲
    代码:

        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命名规范的,这里先捕获异常,后面一篇会提到怎么替换不符合规范的歌曲名
    通过网易云歌单链接下载网易云歌曲

    代码:

            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打开
通过网易云歌单链接下载网易云歌曲
参考
通过网易云歌单链接下载网易云歌曲

四、项目全部代码

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"}


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]
        # 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
        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)

如果觉得对你们有帮助可以点个赞或者关注一波哦~
祝你们听的愉快~
通过网易云歌单链接下载网易云歌曲

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。