首页 > 编程语言 >python 爬取mp3音乐

python 爬取mp3音乐

时间:2025-01-07 18:00:54浏览次数:1  
标签:search name python 爬取 url mp3 audio data id

一、酷狗音乐

1、代码

import requests
import time
# 导入解密模块
import hashlib
import re
import os
import json
# 导入制表模块
import prettytable as pt

# 模拟浏览器
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 '
                  'Safari/537.36 Edg/119.0.0.0',
    'Cookie': 'kg_mid=3a8e2eda6b55afd434ed43d762bae621; kg_dfid=4XSJ8z0tMH343y3JOZ2ZluzO; '
              'kg_dfid_collect=d41d8cd98f00b204e9800998ecf8427e; Hm_lvt_aedee6983d4cfc62f509129360d6bb3d=1701158152,'
              '1701163020,1701180349,1701337969; kg_mid_temp=3a8e2eda6b55afd434ed43d762bae621; '
              'Hm_lpvt_aedee6983d4cfc62f509129360d6bb3d=1701337996'
}


def Hash_md5(audio_id, date_time):
    # audio_id = '9gaecb60'
    s = [
        "NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt",
        "appid=1014",
        # 时间戳
        f"clienttime={date_time}",
        "clientver=20000",
        "dfid=4XSJ8z0tMH343y3JOZ2ZluzO",
        # 歌曲id
        f"encode_album_audio_id={audio_id}",
        "mid=3a8e2eda6b55afd434ed43d762bae621",
        "platid=4",
        "srcappid=2919",
        "token=",
        "userid=0",
        "uuid=3a8e2eda6b55afd434ed43d762bae621",
        "NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt"
    ]
    # 把列表拼接成字符串
    string = ''.join(s)
    MD5 = hashlib.md5()
    MD5.update(string.encode('utf-8'))
    signature = MD5.hexdigest()
    # print(signature)
    return signature


def search_MD5(world, date_time):
    search_s = [
        "NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt",
        "appid=1014",
        "bitrate=0",
        "callback=callback123",
        f"clienttime={date_time}",
        "clientver=1000",
        "dfid=4XSJ8z0tMH343y3JOZ2ZluzO",
        "filter=10",
        "inputtype=0",
        "iscorrection=1",
        "isfuzzy=0",
        f"keyword={world}",
        "mid=3a8e2eda6b55afd434ed43d762bae621",
        "page=1",
        "pagesize=30",
        "platform=WebFilter",
        "privilege_filter=0",
        "srcappid=2919",
        "token=",
        "userid=0",
        "uuid=3a8e2eda6b55afd434ed43d762bae621",
        "NVPh5oo715z5DIWAeQlhMDsWXXQV4hwt"
    ]
    search_string = ''.join(search_s)
    MD5 = hashlib.md5()
    MD5.update(search_string.encode('utf-8'))
    search_signature = MD5.hexdigest()
    # print(signature)
    return search_signature


# audio_id = '9gaecb60'
# 获取当前时间的毫秒数
# 时间戳13位,所以是到毫秒的,所以我们要*1000,因为我们获取当前时间只精确到秒
date_time = int(time.time() * 1000)
# signature = Hash_md5(audio_id, date_time)


# key = '周杰伦'
key = input('请输入歌名或歌手:')
# 获取加密参数
search_signature = search_MD5(key, date_time)

# 搜索链接
search_url = 'https://complexsearch.kugou.com/v2/search/song?'
# search_url = 'https://www.kugou.com/yy/html/search.html#searchType=song?'
# 搜索请求参数
search_data = {
    'callback': 'callback123',
    'srcappid': '2919',
    'clientver': '1000',
    'clienttime': date_time,
    'mid': '3a8e2eda6b55afd434ed43d762bae621',
    'uuid': '3a8e2eda6b55afd434ed43d762bae621',
    'dfid': '4XSJ8z0tMH343y3JOZ2ZluzO',
    'keyword': key,
    'page': '1',
    'pagesize': '30',
    'bitrate': '0',
    'isfuzzy': '0',
    'inputtype': '0',
    'platform': 'WebFilter',
    'userid': '0',
    'iscorrection': '1',
    'privilege_filter': '0',
    'filter': '10',
    'token': '',
    'appid': '1014',
    'signature': search_signature
}

# 发送请求
response = requests.get(url=search_url, params=search_data, headers=headers)
"""" 获取数据 """
search_data = response.text
html_data = re.findall('callback123\((.*)', search_data)[0].replace(')', '')
# 把json字符串,转成字典数据
json_data = json.loads(html_data)
# print(json_data)
tb = pt.PrettyTable()
tb.field_names = ['序号', '歌名', '歌手', '专辑', 'id']
lis = []
num = 1
# for循坏遍历
for index in json_data['data']['lists']:
    dit = {
        '歌名': index['SongName'],
        '歌手': index['SingerName'],
        '专辑': index['AlbumName'],
        'id': index['EMixSongID']
    }
    lis.append(dit)
    tb.add_row([num, index['SongName'], index['SingerName'], index['AlbumName'], index['EMixSongID']])
    num += 1
    # print(dit)
    # print(audio_id)
print(tb)


# audio_id = input('请输入歌曲id:')
# signature = Hash_md5(audio_id, date_time)

def save(audio_id):
    signature = Hash_md5(audio_id, date_time)
    url = 'https://wwwapi.kugou.com/play/songinfo?'

    data = {
        'srcappid': '2919',
        'clientver': '20000',
        'clienttime': date_time,
        'mid': '3a8e2eda6b55afd434ed43d762bae621',
        'uuid': '3a8e2eda6b55afd434ed43d762bae621',
        'dfid': '4XSJ8z0tMH343y3JOZ2ZluzO',
        'appid': '1014',
        'platid': '4',
        'encode_album_audio_id': audio_id,
        'token': '',
        'userid': '0',
        'signature': signature
    }

    response = requests.get(url=url, params=data, headers=headers)
    json_data = response.json()

    # 打印 JSON 响应以检查字段
    # print(json.dumps(json_data, indent=4, ensure_ascii=False))

    try:
        # 歌名
        audio_name = json_data['data']['audio_name']
        # 音频链接
        play_url = json_data['data']['play_url']

        # 歌手名
        author_info = json_data['data'].get('authors', [{}])  # 获取作者信息,若不存在则用空字典
        singer_name = author_info[0].get('author_name', '未知歌手')  # 获取作者名,若无则用默认值

        # 创建保存路径
        save_directory = os.path.join('kugou', singer_name)
        os.makedirs(save_directory, exist_ok=True)  # 检查并创建目录

        # 保存音频
        music_content = requests.get(url=play_url, headers=headers).content
        audio_file_path = os.path.join(save_directory, f'{audio_name}.mp3')

        with open(audio_file_path, mode='wb+') as f:
            f.write(music_content)

        print(f'{audio_name}.mp3下载完成')

        # 保存歌词
        lyrics = json_data['data']['lyrics']
        song_info_cleaned = re.sub("\[(.*?)\]", "", lyrics)
        lyrics_file_path = os.path.join(save_directory, f'{audio_name}.txt')

        with open(lyrics_file_path, 'w+', encoding="utf-8") as f:
            f.write(song_info_cleaned)

        print(f'{audio_name}.txt下载完成')

        # 保存图片
        img = json_data['data']['authors'][0]['sizable_avatar']  # 使用头像 URL 作为图片
        music_img = requests.get(url=img, headers=headers).content
        img_file_path = os.path.join(save_directory, f'{audio_name}.jpg')

        with open(img_file_path, mode='wb+') as f:
            f.write(music_img)

        print(f'{audio_name}.jpg下载完成')

    except KeyError as e:
        print(f'获取数据时出错: {e}')


if __name__ == '__main__':
    page = input('请输入你要下载的歌曲序号 / 全部下载<0>:')
    try:
        if page == '0':
            for li in lis:
                save(audio_id=li['id'])
        else:
            save(audio_id=lis[int(page) - 1]['id'])
    except Exception as e:
        print('你可能输入有误', e)

二、网易云热榜音乐

1、代码

import requests
import re
import os

filename = 'music'
if not os.path.exists(filename):
    os.makedirs(filename)

url = "https://music.163.com/discover/toplist?id=3778678"  # 网易云音乐热歌榜单页面
headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/131.0.0.0 Safari/537.36 Edg/131.0.0.0'}

response = requests.get(url, headers=headers)
html_data = re.findall('<li><a href="/song\?id=(\d+)">(.*?)</a>', response.text)

for song_id, song_name in html_data:
    song_name_clean = ''.join(c for c in song_name if c not in '<>:"/\\|?*')  # 清理文件名
    music_url = f'http://music.163.com/song/media/outer/url?id={song_id}.mp3'

    # 对于音乐播放地址发送请求 获取二进制数据内容
    music_content = requests.get(url=music_url, headers=headers).content

    # 使用完整的路径保存文件
    with open(os.path.join(filename, f'{song_name_clean}.mp3'), mode='wb') as f:
        f.write(music_content)

    print(f'Song ID: {song_id}, Song Name: {song_name_clean}')

  

 

标签:search,name,python,爬取,url,mp3,audio,data,id
From: https://www.cnblogs.com/dgp-zjz/p/18658073

相关文章

  • 使用Python执行Shell命令并获取结果
    使用Python执行Shell命令并获取结果是一项非常有用的技能,尤其在自动化任务、系统管理和数据处理方面。Python提供了多种方法来运行Shell命令并捕获输出,最常用的是 subprocess模块。以下是如何使用 subprocess模块执行Shell命令并获取结果的详细指南。1.导入 subprocess模块......
  • WxPython跨平台开发框架之使用PyInstaller 进行打包处理
    使用PyInstaller 打包Python项目是一个常见的需求,它可以将Python程序及其所有依赖项打包成一个独立的可执行文件或者安装文件,方便在没有安装Python环境的机器上运行。本随笔介绍WxPython跨平台开发框架中使用PyInstaller进行打包处理,包括在WIndow平台下生成独立的exe文件,松散结......
  • Python 中的迭代器与生成器、列表与元组的区别、作用域与命名空间的关系、异常处理机
    引言在Python的面试中,除了基础知识,还经常会涉及到一些稍微复杂的概念与问题。这篇文章将继续为大家分析一些高频Python面试题,帮助你更好地准备面试,提升自己的技术能力。......
  • 整理了6个Python经典项目(python爬虫、python人工智能、python数据分析、python web、p
    包含编程籽料、学习路线图、爬虫代码、安装包等!【点击领取】前言职场中一贯有“金三银四”、“金九银十”的说法。尤其是3、4月刚过完年后,很多企业的员工会选择离职,大量空缺职位被放出,同时HR招聘压力增大,求职者往往可以借此机会,获得一个更好的报价。如果你是一名正在求职......
  • Python实战--爬虫音乐数据的笔记
    开发工具Python版本:3.6相关模块:requests模块time模块parsel模块re模块time模块环境搭建安装Python并添加到环境变量,pip安装需要的相关模块即可。数据来源查询分析浏览器中打开我们要爬取的页面按F12进入开发者工具,查看我们想要的酷狗音乐飙升榜在哪里这里我们需......
  • (免费送源码)计算机毕业设计原创定制:python+Django+MySQL Django实验室管理系统
    摘 要本论文主要论述了如何使用python语言、Django框架开发一个实验室管理系统,本系统将严格按照软件开发流程,进行各个阶段的工作,面向对象编程思想进行项目开发。在引言中,作者将论述该系统的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析......
  • Python爬虫应用领域
    Python爬虫作为一种强大的数据获取工具,在多个领域发挥着重要作用。以下是Python爬虫在不同领域的应用情况:一、数据采集与分析(一)市场调研产品信息收集:爬取电商平台的产品详情、价格、销量、用户评价等数据,分析产品市场占有率、用户喜好、竞争对手情况,为产品开发、定价策略、营销......
  • 学霸带你游戏化探索 Python 类与对象
    面向对象编程:实践与应用在现代编程中,面向对象编程(OOP)成为了主流方法论,尤其是在游戏开发领域,OOP的优势得到了广泛应用。从《我的世界》到《巫师3》,面向对象的设计模式使得开发者能够更高效地组织代码、管理复杂的游戏世界及其动态元素。通过类、对象以及继承等概念,程序员可以......
  • Python爬虫与1688图片搜索API接口:深度解析与显著收益
     在电子商务的浩瀚海洋中,数据是驱动业务决策的核心引擎。阿里巴巴旗下的1688平台,作为全球领先的B2B在线市场,不仅汇聚了海量的商品信息,还提供了丰富的API接口,为开发者提供了强大的数据获取工具。本文将深入探讨1688图片搜索API接口,通过Python爬虫技术的结合,展示如何高效利用这......
  • 爬取电影数据结合Flask实现数据可视化
    网站:Scrape|Movie本案例(爬虫)所需要的模块requests (网络请求模块)pandas(数据保存模块)parsel  (数据解析模块)lxml(数据解析模块)pyecharts(可视化库)flask(框架)以上的模块均需要通过指令pipinstall模块名安装 Explain:    分析此......