如何基于Python批量下载音乐

基于Python批量下载音乐可以分为以下几个步骤:

步骤一:确定下载源和下载目录

首先,要确认所需要下载的音乐源,比如 https://music.163.com/ 。然后,要确定下载的目录。

步骤二:获取音乐详情

通过分析音乐信息,可以获取歌曲ID,歌曲名称,歌手等信息。比如可以使用Python的requests和BeautifulSoup库对网页进行解析来获取音乐详情

import requests
from bs4 import BeautifulSoup

url = 'https://music.163.com/playlist?id=5211200197'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.content, 'html.parser')
music_lists = soup.find_all('ul', {'class': 'f-hide'})[0]
musics = music_lists.find_all('a')
for music in musics:
    print(music['href'], music.text)

步骤三:下载音乐文件

获取从步骤二中解析出的音乐ID和下载目录,然后构建出音乐文件的下载链接,使用Python的requests库下载音乐文件并保存到指定目录中。下面是具体的代码片段:

def download_music_music163(_music_id, _path):
    """
    :param _music_id: 歌曲id
    :param _path: 保存路径
    """
    music_src = f"https://music.163.com/song/media/outer/url?id={_music_id}.mp3"

    try:
        r = requests.get(music_src, stream=True)
        content_size = int(r.headers['content-length'])
    except Exception as e:
        print('【错误】当前音乐无法下载')
        return

    if os.path.exists(_path):
        if not check_file_already_exists(_path, content_size):
            os.remove(_path)
        else:
            return
    download_file_count = 0
    while download_file_count < 3:
        try:
            with open(_path, "wb") as f:
                for chunk in r.iter_content(1024):
                    f.write(chunk)
                    download_size = os.path.getsize(_path)
                    if download_size >= content_size:
                        break
                download_file_count += 1
        except Exception as e:
            download_file_count += 1

    if download_file_count == 3:
        print('【错误】这个音乐文件下载失败了...')
    else:
        print(_path, '下载成功')

示例说明

下面给出两个简单的示例,分别是下载流行歌曲榜(周榜)的前五首歌曲以及下载网易云音乐热门歌单中的音乐。

示例1:下载流行歌曲榜的前五首歌曲

import requests
from bs4 import BeautifulSoup
import os

def download_music_music163(_music_id, _path):
    # 与前面的代码一致
    pass

url = 'https://music.163.com/discover/toplist?id=3778678'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.content, 'html.parser')
music_lists = soup.find_all('ul', {'class': 'f-hide'})[0]
musics = music_lists.find_all('a')

top_n = 5 # 需要下载的歌曲数,可以自己设置
download_count = 0 # 已经下载的歌曲数

for music in musics:
    if download_count == top_n:
        break
    music_id = music['href'].split('=')[1]
    music_name = music.text
    download_path = os.path.join(os.getcwd(), f'{music_name}.mp3')
    download_music_music163(music_id, download_path)
    download_count += 1

示例2:下载网易云音乐热门歌单中的音乐

import requests
from bs4 import BeautifulSoup
import os

def download_music_music163(_music_id, _path):
    # 与前面的代码一致
    pass

url = 'https://music.163.com/playlist?id=2884035'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
res = requests.get(url, headers=headers)
soup = BeautifulSoup(res.content, 'html.parser')
music_lists = soup.find_all('ul', {'class': 'f-hide'})[0]
musics = music_lists.find_all('a')

for music in musics:
    music_id = music['href'].split('=')[1]
    music_name = music.text
    download_path = os.path.join(os.getcwd(), f'{music_name}.mp3')
    download_music_music163(music_id, download_path)

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何基于Python批量下载音乐 - Python技术站

(0)
上一篇 2023年5月27日
下一篇 2023年5月27日

相关文章

  • jQWidgets jqxGrid scrollmode属性

    jQWidgets jqxGrid scrollmode属性详解 jQWidgets是一个基于jQuery的UI组件库,提供了丰富UI组件工具包。jqxGrid是其中之一,本文将细介绍jqxGrid的scrollmode属性,包括定义、语法和示例。 scrollmode属性的定义 jqxGrid的scrollmode属性用于设置网格的滚动模式。当网格的内容超…

    jquery 2023年5月10日
    00
  • jQuery Mobile面板 classes.pagePanelOpen选项

    jQuery Mobile是一款基于jQuery的框架,使得开发人员可以更简单高效地开发用于移动设备的web应用程序。其中,面板(panel)是其提供的一种重要的组件,可以用于实现左右切换的侧边栏。在使用面板组件时,有一个非常重要的选项就是classes.pagePanelOpen,本文将详细讲解该选项的用法和特性。 classes.pagePanelOpe…

    jquery 2023年5月12日
    00
  • jQuery powerFloat万能浮动层下拉层插件使用介绍

    jQuery powerFloat浮动层插件使用介绍 简介 jQuery powerFloat是一款高度可定制性的浮动层插件,提供了多种浮动层效果和选项,可以实现鼠标悬停或点击触发的弹出框、下拉菜单、提示层等功能。使用powerFloat插件可以快速地为网站添加浮动层效果,提升交互体验。 使用方法 引入文件 在网页中引入jQuery库和powerFloat库…

    jquery 2023年5月27日
    00
  • jQuery on()方法示例及jquery on()方法的优点

    下面我来详细讲解“jQuery on()方法示例及jquery on()方法的优点”的攻略。 1. 什么是jQuery on()方法? jQuery on() 方法用于为一个或多个事件元素附加一个或多个事件处理程序。支持动态添加和移除事件。 在jquery 1.7之前,我们使用的bind()、live()、delegate()方法也可以为元素绑定事件或者动态…

    jquery 2023年5月28日
    00
  • 深入学习jQuery中的data()

    深入学习jQuery中的data() 什么是data()方法 在jQuery中,data()方法是一个非常强大的函数,它能够在HTML元素上存储和取回数据。通过使用该函数,我们能够轻松地与内部JavaScript变量交互,从而实现动态更新页面. data()方法的基本语法 $(selector).data(name,value) 参数说明: name:必须,…

    jquery 2023年5月28日
    00
  • jquery中ajax函数执行顺序问题之如何设置同步

    jQuery中的ajax函数可以实现异步加载数据,也可以通过设置同步的方式让函数依次执行,避免出现执行顺序问题。下面是如何设置同步的攻略: 设置同步的方式 要设置同步,可以在ajax函数的参数中设置async为false,这样就可以让ajax函数以同步方式执行。如下所示: $.ajax({ url: "test.html", async:…

    jquery 2023年5月28日
    00
  • jQWidgets jqxSwitchButton uncheck()方法

    下面我们来详细讲解一下”jQWidgets jqxSwitchButton uncheck()方法”的使用攻略。 什么是jqxSwitchButton? jqxSwitchButton是基于jQuery和jQWidgets的开关按钮插件,能够很轻松地创建一个开关按钮。 uncheck()方法是什么? uncheck()方法是jqxSwitchButton插件…

    jquery 2023年5月12日
    00
  • jQuery Ajax页面局部加载方法汇总

    针对“jQuery Ajax页面局部加载方法汇总”,我可以给出如下完整攻略: jQuery Ajax页面局部加载方法汇总 什么是Ajax局部加载? Ajax(Asynchronous JavaScript and XML)指的是一种在不重新载入整个页面的情况下,与服务器交换数据并更新部分页面的技术。所以,Ajax局部加载即是利用Ajax技术,将指定的页面局部…

    jquery 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部