简单的QQ音乐爬取
爬蟲功能是一點一點實現的,我們想要爬取qq音樂,首先要從爬取其中一首歌來實現。
我們打開qq音樂的官網,隨便找到一首歌進入播放頁面,隨后按F12進入檢測界面。
?如果沒有數據出現的話,進行刷新頁面即可。隨后我們在這里找到大小為一首歌的文件,這里就是這個3.1MB的文件了,點擊查看它的URL,很顯然,這就是正在播放的這首歌的地址了。
?
?我們可以打開這個網址檢測一下是否是我們的所需要的那首歌的地址。
很明顯,這就是我們所需要的地址。那么,我們怎么用爬蟲來獲取這個地址呢?
我們對多首不同的歌曲地址進行對比可以得出,C400到guid前這段和vkey到uin這段才是我們所需要的獲取的,其他的部分都是不變的。
?那么我們繼續找這個網址是怎么生成的,這個我沒什么辦法,只能一個個的去翻,我們找到這個文件后,可以看到它的purl就是我們所需要的。
我們來看一下這個請求需要什么參數。
?Form Data里面是不是一長串看著都頭痛的參數?不急,我們分析一下哪些是需要傳進去的參數來看看。
?songmid里的參數是不是有些眼熟,我們檢查一下就可以發現這就是那些歌的標識,也就是我們將所需要聽的歌的songmid傳進這個網址,我們就可以得到我們所需要的url了。
那么我們可以來嘗試一下,我們將req_2前面的參數傳入。
data={"comm":{"cv":4747474,"ct":24,"format":"json","inCharset":"utf-8","outCharset":"utf-8","notice":0,"platform":"yqq.json","needNewCode":1,"uin":1248959521,"g_tk_new_20200303":1832066374,"g_tk":1832066374},"req_1":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"6846657260","songmid":["0041N9NS36K7Hi","000T550z1xUU83","003Is7hE3aTDYm","000wVxhI2nFwoq","002BngOt1PzNGZ","004XmWlq2n1SnX","002LZ8Iv2bBWfu","003tqTBf17F7ed","002s34bV1k1W7M","004Vd5CG1YlRUU","002LNOds0rYvpK"],"songtype":[0,0,0,0,0,0,0,0,0,0,0],"uin":"1248959521","loginflag":1,"platform":"20"}}}?很好,直接就成功了,那么我們所需要的只有purl,我們用json模塊來更方便的獲取purl。
這樣我們就獲取到我們所需要的purl,最后進行一下拼接,看看能不能正常下載。
下載成功了,那么下載一首歌的思路我們已經理順了,只需要獲取歌曲songmid就能進行下載了,那么我們接下來要做的就是獲取songmid。
那么songmid在哪?我打開歌曲的頁面便發現了歌曲的網址后面那串就是songmid。
那么這個網址怎么來呢?那當然是在qq音樂的搜索頁面獲取。
讓我們來看看qq音樂的搜索界面。
?
現在思路就很明顯了 ,我們只需要在搜索頁面,用同樣的思路獲取所需要的歌曲的songmid就能進行下載了。
那么我將代碼簡單優化如下:
import requests import json from bs4 import BeautifulSoup import urllib.requestheader = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36', } def get_purl(mid):url = 'https://u.y.qq.com/cgi-bin/musicu.fcg?'middata = 'data={"comm":{"cv":4747474,"ct":24,"format":"json","inCharset":"utf-8","outCharset":"utf-8","notice":0,"platform":"yqq.json","needNewCode":1,"uin":1248959521,"g_tk_new_20200303":1832066374,"g_tk":1832066374},"req_1":{"module":"vkey.GetVkeyServer","method":"CgiGetVkey","param":{"guid":"6846657260","songmid":["%s"],"songtype":[0],"uin":"1248959521","loginflag":1,"platform":"20"}}}' % (mid)try:r = requests.get(url+middata, headers=header)r.encoding = 'utf-8'purl_json = json.loads(r.text).get('req_1').get('data').get('midurlinfo')[0].get('purl')return purl_jsonexcept:print('獲取purl失敗')def get_mid(w):url = "https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.top&searchid=58540219608212637&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=%s&_=1626671326366&cv=4747474&ct=24&format=json&inCharset=utf-8&outCharset=utf-8¬ice=0&platform=yqq.json&needNewCode=0&uin=1248959763&g_tk_new_20200303=1832066374&g_tk=1832066374&hostUin=0&loginUin=0" % (urllib.request.quote(w))r = requests.get(url, headers=header)r.encoding = 'utf-8'mid_json = json.loads(r.text).get('data').get('song').get('list')[0].get('mid')return mid_jsonif __name__ == '__main__':music_url = "https://dl.stream.qqmusic.qq.com/"w = input('請輸入歌曲的名稱:')mid = get_mid(w)purl = get_purl(mid)music = requests.get(music_url+purl).contentwith open(f'music/{w}.mp3', 'wb') as f:f.write(music)print(f'{w}下載完成')總結
- 上一篇: 水滴IP教你如何查询QQ好友的IP地址
- 下一篇: ARP网关欺骗程序的实现(vs2008