酷狗音乐下载,酷狗如何使用爬虫 | 爬虫篇

  今天和大家分享一下,如何秒下载酷狗音乐,无需开网页,无需下任何软件。

获取方法:

  1. 公众号回复【音乐下载】即可。得到的文件包括:

  2. exe文件,人人都可以直接使用的,秒下载酷狗音乐

  3. py文件,程序员可以直接使用,随意拿去二次开发,结合图形化界面,达到极致用户体验。

  4. 文末附源代码,以及项目思路。

公众号回复【进群】沟通交流吧,QQ扫码进群学习吧

微信群     QQ群

使用方法:

  1. 按照提示输入,你想下载的音乐,比如,输入【下山】回车。

  2. 然后提示输入,你想下载的音乐序号,比如,输入【2】回车。

  3. 下载的音乐会在执行文件(exe或py文件),同一级路径下

项目思路

1.找列表数据通过谷歌浏览器F12中Network中的链接观察,找到数据在js分类下开头是song_search_v2的链接中。注意:callback可不需要,带上的话得到的数据需要通过正则或其他截取方法处理为JSON格式数据。

    #解析数据
    json_music = res_music.json()    #解析JSON数据
    music_list=json_music['data']['lists']    #通过字典的键获取数据

    2.  找下载数据。播放页面的链接为

(https://www.kugou.com/song/#hash=EABDDF85153719DA1991B20ABE5FB80D

&album_id=33912131)通过观察列表页JSON数据和播放页的链接,我们需要拿到hash,album_id。拿到这两个数据(在列表页JSON数据中),我们就可以访问播放页面了。

那么既然要下载音乐,就需要知道下载链接。通过Network下的js分类下的链接观察,我们要的下载链接藏在 开头是 index.php的链接中,下载地址则在得到的JSON数据字典键为play_url下。

# 解析数据
# 方法1.正则获取到最后完整的下载链接
song_download=''.join(soup.text.split('https')[-1:]).replace('\\','').replace('://','').replace('"}});','')
# 方法2.json()解析数据 参考 获取列表数据

    3.下载音乐到本地。音频,视频,图片都属于二进制文件,所以需要用.content方法,而不是html结构的.text方法。

#下载歌曲
with open(music_hash_dic[user_choice][2]+'.mp3','wb' ) as f:
    print(music_hash_dic[user_choice][2],'正在下载...')
    f.write(requests.get(finall_url).content)
    print(music_hash_dic[user_choice][2],'下载完成,歌曲在执行文件,同一级路径')
    print('=' * 25)     # 25个'='

源代码

import json,requests,re,time

#伪装浏览器头部,可通用
headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}

#外层循环,保证每次下载结束后 可控制程序是否结束
songname=input('请输入你要下载的歌曲名称:')
key_word = ''       # 用于保存输入的歌曲名
begin_while = True      #开启项目循环
while begin_while:
    key_word = songname
    # 找数据,数据藏在js文件里 callback=jQuery112404079296929561982_1579355885832&可以去掉,去掉后,就是完整的json字符串,如加上则需要截取字符串为JSON格式字符串
    res_music = requests.get('https://songsearch.kugou.com/song_search_v2?keyword={}&page=1&pagesize=30&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1579355491182'.format(songname))
    # 清理多余的参数后的url,也能获取到数据
    # res_music = requests.get('https://songsearch.kugou.com/song_search_v2?keyword={}&platform=WebFilter'.format(songname))

    json_music = res_music.json()
    music_list=json_music['data']['lists']

#利用enumerate函数,将下标作为序号,方便输入选择
    music_hash_dic={}
    number = 0
    for y,x in enumerate(music_list):
        number = y + 1
        songname=x['FileName'].replace('<em>','').replace('</em>','')       # 去掉数据里<em></em>标签
        songhash=x['FileHash']
        songid=x['AlbumID']
        music_hash_dic[str(y+1)]=[songhash,songid,songname]    #将序号作为键,把hash,id,歌曲名称作为字典键值
        print(str(y+1)+'  |  '+songname)

#下面的url有部分没用,但需要带cookies,建议用此url较方便
    print('=' * 25)     # 25个'='
    user_choice = ''
    if number > 0 :
        user_choice=input('请输入你要下载的歌曲序号:')
    while True:        # 内层循环
        if user_choice.isdigit():
            if int(user_choice) > 0 and int(user_choice) <= number:
                user_choice = str(int(user_choice))     # 去掉 01前面的0
                hash_url='https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery1910017709359422550808_1579413714166&hash={}&album_id={}&dfid=2AZfAI3Sfdln0Z7zq545MRQu&mid=6bcee3705b8816d0cba7e664a5d55ea7&platid=4&_=1579228034450'.format(music_hash_dic[user_choice][0],music_hash_dic[user_choice][1])
                soup = requests.get(hash_url,headers=headers)
                # 获取到最后完整的下载链接
                song_download=''.join(soup.text.split('https')[-1:]).replace('\\','').replace('://','').replace('"}});','')
                finall_url='https://'+'{}'.format(song_download)
                if '\"err_code\":0' in soup.text:     # 下载过多,酷狗方会限制IP,可用代理IP池解决,此处不拓展,后面教程会专门提供
                    if 'mp3' in finall_url:
                        #下载歌曲
                        with open(music_hash_dic[user_choice][2]+'.mp3','wb' ) as f:
                            print(music_hash_dic[user_choice][2],'正在下载...')
                            f.write(requests.get(finall_url).content)
                            print(music_hash_dic[user_choice][2],'下载完成,歌曲在执行文件,同一级路径')
                            print('=' * 25)     # 25个'='
                            # break
                    else:
                        print('=' * 25)     # 25个'='
                        print("此歌曲为VIP版本请选择其他版本")
                        print('=' * 25)     # 25个'='
                        songname = key_word     # 把搜索的歌曲名称重新传给 songname,达到重新加载循环歌曲列表
                        print("重新读取歌曲列表中...")
                        time.sleep(3)
                        break
                else:
                    print("由于酷狗限制,下载次数过多,请稍候尝试")
                user_choice_again=input('输入【8】结束使用,其他任意键继续下载歌曲:    ')
                if user_choice_again != '8':
                    songname=input('请输入你要下载的歌曲名称:')
                    break       # 关闭内层循环  注意此时外层循环是没有关闭的
                else:
                    print('=' * 25)     # 25个'='
                    print('再见,欢迎下次使用,退出中...')
                    time.sleep(3)
                    begin_while = False     #关闭项目循环,注意外层循环关闭
                    break       #关闭内层循环
            
            else:
                user_choice=input('请输入列表中的序号,再次输入歌曲序号:')
        else:
            user_choice=input('输入有误,请输入你要下载的歌曲序号:')
    else:
        songname=input('未找到歌曲,请重新输入你要下载的歌曲名称:')

秒变大牛,就是这么简单~



每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。


​微信群(关注「Python家庭」一起轻松学Python吧)

​QQ ②群(983031854

发布了4 篇原创文章 · 获赞 12 · 访问量 2987

猜你喜欢

转载自blog.csdn.net/qq_34409973/article/details/104048312