python爬取qq音乐第二种方法

分析参考https://blog.csdn.net/XBODHX/article/details/100743069

这个播放接口是在网站找信息的时候找到的:

用到的接口为:

搜索接口:

https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=62240638881390953&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p='+str(page)+'&n='+str(num)+'&w='+str(keyword)+'&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0

获取vkey接口:

https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?&jsonpCallback=MusicJsonCallback&cid=205361747&songmid=' +\
       songid+ '&filename=C400' +strMediaMid+ '.m4a&guid=6612300644

播放接口:

http://isure.stream.qqmusic.qq.com/C400' + strMediaMid + '.m4a?vkey=' + vkey + '&guid=6612300644&uin=0&fromtag=66

代码如下:

#-*- coding: utf-8 -*-
import requests
import json
import urllib
import sys,os
class Music_tx():
    def __init__(self):
        self.header = {
            'Connection': "keep-alive",
            'Pragma': "no-cache",
            'Cache-Control': "no-cache",
            'User-Agent': "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) "
                          "Chrome/72.0.3626.119 Safari/537.36",
            'Accept': "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3",
            'Referer': "https://y.qq.com",
            'Accept-Encoding': "gzip, deflate, br",
            'Accept-Language': "zh-CN,zh;q=0.9",
            'cache-control': "no-cache",
        }

    #通过json接口搜索音乐
    def qq_music(self,keyword,num = 2,page = 1,file_path = None):
        url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=62240638881390953&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p='+str(page)+'&n='+str(num)+'&w='+str(keyword)+'&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0'
        response= requests.get(url, headers=self.header)
        music_data = response.text
        json_music_data = json.loads(music_data)
        music_list = json_music_data['data']['song']['list']
        song_MediaMids = []
        song_mids = []
        song_titles = []
        song_singers = []
        song_albumns = []
        song_id = []
        music_url = []
        num = 0
        if not file_path:
            file_path = os.path.dirname(os.path.abspath(__file__)) + '\\'
            if not os.path.isdir(file_path + 'mp3'):
                os.mkdir(file_path + 'mp3')
            file_path = os.path.dirname(os.path.abspath(__file__)) + '\\mp3\\'
        for data in music_list:
            try:
                song_MediaMids.append(data['file']['strMediaMid'])
                song_mids.append(data['mid'])
                song_titles.append(data['title'])
                song_singers.append(data['singer'][0]['name'])
                song_albumns.append(data['album']['name'])
                song_id.append(data['id'])
                music_url.append(self.get_play_url(data['mid'],data['file']['strMediaMid']))
                print('正在下载:', data['title'], '......')
                url = self.get_play_url(data['mid'], data['file']['strMediaMid'])
                if os.path.isfile(file_path + data['title']+'-'+ data['singer'][0]['name'] + '.m4a'):
                    num += 1
                    path = file_path + data['title'] + '-' + data['singer'][0]['name'] + str(num) + '.m4a'
                else:
                    path = file_path + data['title'] + '-' + data['singer'][0]['name'] + '.m4a'
                try:
                    urllib.request.urlretrieve(url,path,reporthook=self._progress)
                    print('下载' + data['title'] + '成功')
                except Exception:
                    print('下载' +data['title'] + '失败')
                    print(Exception)
            except:
                print('wrong')
        print("下载完成")

    #获取播放地址
    def get_play_url(self,songid,strMediaMid):
        url = 'https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?&jsonpCallback=MusicJsonCallback&cid=205361747&songmid=' +\
               songid+ '&filename=C400' +strMediaMid+ '.m4a&guid=6612300644'
        # 获取返回文件并解析得到vkey
        response = requests.get(url)
        json_data = json.loads(response.text)
        vkey = json_data['data']['items'][0]['vkey']
        real_url = 'http://isure.stream.qqmusic.qq.com/C400' + strMediaMid + '.m4a?vkey=' + vkey + '&guid=6612300644&uin=0&fromtag=66'
        #print(real_url)
        return real_url

    #显示下载进度
    def _progress(self,block_num, block_size, total_size):
        '''回调函数
           @block_num: 已经下载的数据块
           @block_size: 数据块的大小
           @total_size: 远程文件的大小
        '''
        sys.stdout.write('\r>> 已下载: %.1f%%' % (float(block_num * block_size) / float(total_size) * 100.0))
        sys.stdout.flush()
if __name__ == '__main__':
    qq_music = Music_tx()
    qq_music.qq_music('没那么简单')









 

上一篇:网易云音乐


下一篇:MPlayer音乐播放器项目讲解