python爬虫qq音乐_python3 爬去QQ音乐

1 importrequests2 importre3 importjson4 importos5

6

7

8 defget_name(singer):9 url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'

10 params ={11 'catZhida': '1',12 'w': singer,13 }14 headers ={15 'referer': 'https://y.qq.com/portal/search.html',16 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'

17 }18 html = requests.get(url,headers=headers,params=params).text19 content = re.compile('callback\((.*)\)').findall(html)[0]20 content =json.loads(content)21 data = content.get('data')22 song = data.get('song')23 lists = song.get('list')24 name =[]25 for list inlists:26 singer = list.get('singer')[0].get('mid')27 name.append(singer)28 name =name[0]29 returnname30

31 defget_html(name,singer):32 url = 'https://c.y.qq.com/v8/fcg-bin/fcg_v8_singer_track_cp.fcg'

33 params ={34 'singermid': name,35 'order': 'listen',36 'begin': '0',37 'num': '30',38 }39 headers ={40 'referer': 'https://y.qq.com/n/yqq/singer/003aQYLo2x8izP.html',41 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'

42 }43 html = requests.get(url,headers=headers,params=params).text44 returnhtml45

46

47 defget_music(vkey,songname,filename,singer):48 if vkey andsongname:49 url3 = 'http://dl.stream.qqmusic.qq.com/' + filename + '?vkey=' + vkey + '&guid=7133372870&uin=0&fromtag=66'

50

51 headers ={52 'referer': 'https://y.qq.com/n/yqq/singer/003aQYLo2x8izP.html',53 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'

54 }55 music = requests.get(url3,headers=headers).content56 dir =singer57 if notos.path.exists(dir):58 os.mkdir(dir)59 with open(dir+'/'+songname+'.m4a','wb') as f:60 f.write(music)61 print(songname,'__',singer)62

63 defget_vkey(strMediaMid,songmid,songname,singer):64 if strMediaMid and songmid andsongname :65 url2 = 'https://c.y.qq.com/base/fcgi-bin/fcg_music_express_mobile3.fcg'

66 params ={67 'g_tk': '5381',68 'jsonpCallback': 'MusicJsonCallback8571665793949388',69 'loginUin': '0',70 'hostUin': '0',71 'format': 'json',72 'inCharset': 'utf8',73 'outCharset': 'utf-8',74 'notice': '0',75 'platform': 'yqq',76 'needNewCode': '0',77 'cid': '205361747',78 'callback': 'MusicJsonCallback8571665793949388',79 'uin': '0',80 'songmid': songmid,81 'filename': 'C400'+ strMediaMid + '.m4a',82 'guid': '7133372870'

83 }84 headers ={85 'referer': 'https://y.qq.com/portal/player.html',86 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36'

87 }88 detail_html = requests.get(url2,headers=headers,params=params).text89 vkey_disc = re.compile('MusicJsonCallback8571665793949388\((.*?)\)').findall(detail_html)[0]90 vkey_disc =json.loads(vkey_disc)91

92 data = vkey_disc['data']93 items = data.get('items')[0]94 vkey = items.get('vkey')95 get_music(vkey,songname,'C400'+ strMediaMid + '.m4a',singer)96

97

98 defget_list(detail_html,singer):99 ifdetail_html:100 lists = re.compile('data\":{\"list\":(.*?),\"singer_id',re.S).findall(detail_html)[0]101 datas =json.loads(lists)102 for data indatas:103 musicData = data.get('musicData')104 strMediaMid = musicData.get('strMediaMid')105 songmid = musicData.get('songmid')106 songname = musicData.get('songname')107 get_vkey(strMediaMid,songmid,songname,singer)108

109

110

111 defmain():112 singer = input('请输入您想要下载的歌手:')113 name =get_name(singer)114 detail_html =get_html(name,singer)115 get_list(detail_html,singer)116

117 if __name__ == '__main__':118 main()

有些地方代码有些冗余,还可以再改进 但是费了些功夫终于爬出的效果 确实想要快点编辑出来 按耐不住小激动 这应该就是敲代码的乐趣

1377853-20180516195825338-946357793.png

当播放一个音乐的时候 在Elements中 可以看到音乐的链接 当然是通过js 和 css 加载过的 但是 可以用逆向思维进行参数的找寻

http://dl.stream.qqmusic.qq.com/C4000032qfIn1Tzdbq.m4a?vkey=80525033DD719DAB87C0CEC7B4F9F40D8755982D3A495E3BA0810E50A89668A2AFD61C4C19876FD0FB68932DED89B340AE9F4F464D82DC15&guid=7133372870&uin=0&fromtag=66

发现 vkey 是一个很重要的参数 所以就先去翻一翻网页查一下vkey在哪

1377853-20180516200420288-1460646430.png

经发现 在同播放页面的JS中 但是如果想获得vkey 就需要访问这个对应的URL 也要找到相应的参数

1377853-20180516200712846-1805300115.png

标红箭头的是一直在变化而且没有不行的参数

所以将继续往里使劲挖!

1377853-20180516195527693-792961274.png

目前处于列表页 发现参数已经浮现

但发现第一个红箭头是歌手的意思 被不知道用了什么样的格式换了一种形式 因为后续还想通过段小乱码找到每个歌手所对应的歌曲 所以 还是找到每个歌手所对应的小乱码比较好

1377853-20180516201341211-1304703853.png

找到了!!!

但是 写代码的话 要用正向思维来写 Year!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值