qq音樂爬蟲

沒事爬點歌來聽聽,不管收費免費大小通吃,直接上代碼,爬取思路在源碼註釋中

import requests
import random
import json
import time

starturl = 'https://c.y.qq.com/splcloud/fcgi-bin/fcg_get_diss_by_tag.fcg?picmid=1&rnd={0}&g_tk=5381&jsonpCallback=getPlaylist&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0&categoryId=10000000&sortId=5&sin={1}&ein={2}'
rnd = random.random()
sin = 0
ein = 29


'''
   一.請求歌單首頁,獲取所有歌單信息  dissid
'''
while True:
    headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36'
        }
    headers['referer'] = 'https://y.qq.com/portal/playlist.html'
    disslist = requests.get(starturl.format(rnd, sin, ein),headers = headers).text
    disslist = json.loads(disslist.strip('getPlaylist()'))
    # print(disslist)



    for i in disslist['data']['list']:
        dissid = i['dissid']
        dissName = i['dissname']
    # print(dissidlist)

        '''
             二.通過dissid獲取  songmid strMediaMid
        '''
        dissurl = 'https://c.y.qq.com/qzone/fcg-bin/fcg_ucc_getcdinfo_byids_cp.fcg?type=1&json=1&utf8=1&onlysong=0&disstid={0}&format=jsonp&g_tk=5381&jsonpCallback=playlistinfoCallback&loginUin=0&hostUin=0&format=jsonp&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0'
        headers['referer'] = 'https://y.qq.com/n/yqq/playsquare/{0}.html'.format(dissid)
        song = requests.get(dissurl.format(dissid), headers = headers).text
        song = json.loads(song.strip('playlistinfoCallback()'))



        num = 1
        for s in song['cdlist'][0]['songlist']:
            # 獲取songmid
            songmid = s['songmid']
            # 獲取歌曲名
            songName = s['songname']
            # 獲取strMediaMid
            strMediaMid = s['strMediaMid']
            #filename
            filename = 'C400' + str(s['strMediaMid']) + '.m4a'

            '''
                三.獲取vkey
            '''
            vkeyurl = 'https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg?g_tk=5381&jsonpCallback=MusicJsonCallback&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq&needNewCode=0&cid=205361747&callback=MusicJsonCallback&uin=0&songmid={0}&filename={1}&guid=7670101313'
            #發送請求
            headers['referer'] = 'https://y.qq.com/portal/player.html'
            responses = requests.get(vkeyurl.format(songmid, filename), headers= headers).text
            responses = json.loads(responses.strip('MusicJsonCallback()'))
            # print(responses)
            # 提取vkey
            for vk in responses['data']['items']:
                vkey = vk['vkey']

                '''
                四.通過vkey爬取音樂
                '''
                musicurl = 'http://dl.stream.qqmusic.qq.com/{0}?vkey={1}&guid=7670101313&uin=0&fromtag=66'
                del headers['referer']
                result = requests.get(musicurl.format(filename, vkey),headers = headers, stream = True).raw.read()
                with open('music/'+songName+'.mp3', 'wb') as file:
                    file.write(result)
                # time.sleep(0.1)
            print('{0}歌單的第{1}歌-歌曲名稱:{2}'.format(dissName, num, songName))
            num += 1
    if sin < disslist['data']['sum']:
        sin+=30
        ein+=30
        rnd = random.random()
        time.sleep(1)
    else:
        break

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章