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

  • Post author:
  • Post category:其他




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



系统开发环境

	操作系统: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)

如果觉得对你们有帮助可以点个赞或者关注一波哦~

祝你们听的愉快~

在这里插入图片描述