网易云怎么下载mp3格式的音乐(网易云怎么下载mp3格式的音乐)

如果你常听音乐的话,肯定绕不开网易云,作为一款有情怀的音乐 App,我对网易云也是喜爱有加。虽然说现在都已经是 5G 时代了,大家的手机流量都绰绰有余,但在线播放还是不如本地存着音乐文件靠谱,今天我们就用 Python 来一键下载网易云音乐乐库。

其实下载音乐不难,只需要获取到音乐文件播放的地址就可以通过文件流读取的方式直接下载下来。那么问题就转化为如何获取音乐文件的播放地址了。

榜单分析

我们可以打开网易云排行榜 https://music.163.com/#/discover/toplist?id=19723756,仔细分析我们发现该网页左边一列全是排行榜,每个排行榜都对应这不同的排行榜 ID,具体 ID 是多少,直接调开开发者工具即可清晰的看到。

由上图我们可以看到榜单是放在一个 class='f-cb'ul 列表里面的,所以只需要获取到该 ul 列表的 li 标签即可。而对于每一个 li 标签来说,其 data-res-id 属性则是榜单 id,而榜单名称则是属于该 li 标签下的 divclass='name'p 标签下的 a 标签的内容。因此我们获取到 li 标签的集合之后,遍历该集合依次取出榜单 id 和榜单名称即可。

于是我们有了下面的函数,获取所有的榜单,该函数返回值是一个字典,key 为 榜单 id,值为榜单名称。

url = 'https://music.163.com/discover/toplist'
hd = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'
}

def get_topic_ids():
    r = requests.get(url, headers=hd)
    html = etree.HTML(r.text)
    nodes = html.xpath("//ul[@class='f-cb']/li")
    logger.info('{}  {}'.format('榜单 ID', '榜单名称'))
    ans = dict()
    for node in nodes:
        id = node.xpath('./@data-res-id')[0]
        name = node.xpath("./div/p[@class='name']/a/text()")[0]
        ans[id] = name
        logger.info('{}  {}'.format(id, name))
    return ans

歌曲分析

上面我们获取到了所有的榜单数据,那么针对单个榜单来说,就是要获取其下的所有歌曲了。

分析页面原属可知,歌曲列表是在一个 table 中的,但是通过 requests.get(url,headers=hd) 方式获取返回的网页文本内容的话,貌似是获取不到 table 元素的。于是我们将其返回值输出后做了仔细分析,发现歌曲是在 class="f-hide"ul 标签中。与获取榜单类似,同样需要先获取所有的 li 标签,然后在逐个获取歌曲 id 和歌曲 name 就可以了。

def get_topic_songs(topic_id, topic_name):
    params = {
        'id': topic_id
    }
    r = requests.get(url, params=params, headers=hd)
    html = etree.HTML(r.text)
    nodes = html.xpath("//ul[@class='f-hide']/li")
    ans = dict()
    logger.info('{} 榜单 {} 共有歌曲 {} 首 {}'.format('*' * 10, topic_name, len(nodes), '*' * 10))
    for node in nodes:
        id = node.xpath('./a/@href')[0].split('=')[1]
        name = node.xpath('./a/text()')[0]
        ans[id] = name
        logger.info('{}  {}'.format(id, name))

    return ans

同样该函数返回一个字典,key 为歌曲 id,value 为歌曲名称。

下载歌曲

我们还需要一个下载歌曲的函数,该函数接收歌曲 id,然后以文件流的形式直接读取到本地。

def down_song_by_song_id_name(id, name):
    if not os.path.exists(download_dir):
        os.mkdir(download_dir)
    url = 'http://music.163.com/song/media/outer/url?id={}.mp3'
    r = requests.get(url.format(id), headers=hd)
    is_fail = False
    try:
        with open(download_dir + name + '.mp3', 'wb') as f:
            f.write(r.content)
    except:
        is_fail = True
        logger.info("%s 下载出错" % name)
    if (not is_fail):
        logger.info("%s 下载完成" % name)

最后将所有的操作组合到 main 函数中,作为程序的入口函数。

def main():
    ids = get_topic_ids()
    while True:
        print('')
        logger.info('输入 Q 退出程序')
        logger.info('输入 A 下载全部榜单歌曲')
        logger.info('输入榜单 Id 下载当前榜单歌曲')

        id = input('请输入:')

        if str(id) == 'Q':
            break
        elif str(id) == 'A':
            for id in ids:
                down_song_by_topic_id(id, ids[id])
        else:
            print('')
            ans = get_topic_songs(id, ids[id])
            print('')
            logger.info('输入 Q 退出程序')
            logger.info('输入 A 下载全部歌曲')
            logger.info('输入歌曲 Id 下载当前歌曲')
            id = input('请输入:')
            if str(id) == 'Q':
                break
            elif id == 'A':
                down_song_by_topic_id(id, ans[id])
            else:
                down_song_by_song_id_name(id, ans[id])

if __name__ == "__main__":
    main()

总结

今天我们以网易云网页版为数据源来下载音乐文件,其中下载操作是最简单的,比较麻烦的是分析榜单 id 和获取榜单下的歌曲列表,但榜单下的歌曲列表其实远不止 10 条,而我们获取歌曲的函数 get_topic_songs 每次只可以获取 10 条歌曲,这是因为我们没有在 headers 添加 cookie 导致的,因为只有登录之后才会显示所有的歌曲。小伙伴们可以登录自己的账户然后添加 cookie 做下尝试。

本文所有内容来自互联网,如有侵权/不实内容请联系我们删除,联系邮箱postusb@foxmail.com

发布者:缘分,转转请注明出处:https://www.bjxdyg.com/life/261759.html

(0)
缘分缘分
上一篇 2023年 6月 17日 上午5:18
下一篇 2023年 6月 17日 上午5:45

相关推荐

  • 12v免维护电瓶亏电怎么修复(12v免维护蓄电池亏电修复方法)

    最近,许多网友对12v免维护电瓶亏电怎么修复产生疑问。当然也有一部分网友想弄明白关于12v免维护蓄电池亏电修复方法,泰缘号(www.bjxdyg.com)已经为你找到了相关问题的答案,接下来和我们一起看看吧,让我们一起来探索一下,希望对大家有所帮助! 设计的充电器的工作原理如下:   输入接通电源,待输出接上电瓶后(对于12V电瓶,亏电后端电压不应小于5V)…

    趣味生活 2022年 10月 20日
    1.2K00
  • 防溺水小口诀4句(防溺水小口诀4句游泳热身运动)

    大家好,近期很多朋友对于防溺水小口诀4句产不是很理解。然后还有一些网友想弄清楚防溺水小口诀4句游泳热身运动,泰缘号(www.bjxdyg.com)已经为你找到了相关问题的答案,接下来和我们一起看看吧,希望对大家有所帮助! 暑期来临,天气逐渐炎热,溺水事件进入易发期、高发期,家长们一定要警惕! 崇左警方这份防溺水小知识,大家一定要收好! 防溺水“六不准” 防溺…

    趣味生活 2022年 12月 18日
    20900
  • 大雁往南飞什么季节要到了(大雁什么时候向南飞去)

    燕子从南方飞回来和大雁从北方南飞分别是什么季节? 燕子和大雁是人类除鸡、鸭、鹅、鸭、麻雀、布谷鸟等常见鸟类外,最喜欢的两种候鸟。燕子从南方飞回来和大雁从北方南飞分别是什么季节呢? 根据鸟类资料显示,燕子最愿意接近人类,人类最爱护这种益鸟。一般在10-11左右开始南飞海南及更南的地区,4~6月从海岛北飞到靠近农田的农家繁殖。而大雁北飞是农历3月3左右(阳历4月…

    2023年 6月 20日
    14400
  • 深圳移动宽带套餐资费一览表2022(深圳移动宽带套餐资费一览表2022年)

    大家好,近期很多朋友对于深圳移动宽带套餐资费一览表2022产不是很理解。然后还有一些网友想弄清楚深圳移动宽带套餐资费一览表2022年,泰缘号(www.bjxdyg.com)已经为你找到了相关问题的答案,接下来和我们一起看看吧,希望对大家有所帮助! 众所周知,在国内给我们提供通信服务的运营商几乎只有联通、移动和电信三家,对于如何选择一个合适的运营商就成了很多消…

    2022年 10月 22日
    1.2K00
  • 一公里等于多少里地(1公里等于多少里地 怎么算的)

    内蒙古自治区位于中国北部,是中国少数民族自治区之一。它的历史可追溯到远古时代,在不同的时期经历了不同的政治和文化变革。 仅展示各省位置关系 历史: 内蒙古从古至今经历了不同的政治和文化变迁。据考古证实,公元前1万年内蒙古已有人居住。内蒙古的疆域和政治地位在历史上一直变化,但在清朝时期,它成为一个独立的政治实体。1911年,辛亥革命导致了清朝的瓦解,内蒙古成为…

    2023年 5月 3日
    16700

发表回复

登录后才能评论

联系邮箱

postusb@foxmail.com

邮箱咨询: QQ交谈

邮箱:postusb@foxmail.com

工作时间:周一至周五,9:30-18:30,节假日休息