日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python爬取付费音乐包_python爬虫如何下载QQ音乐付费歌曲2020最新版

發布時間:2023/12/20 python 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python爬取付费音乐包_python爬虫如何下载QQ音乐付费歌曲2020最新版 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近想寫一個QQ音樂的API接口,為了省事先到網上查了資料,發現很多都是不能用的,估計官方進行了升級,算了,還是自己來吧。

1. 如何下載付費歌曲

打開QQ音樂,任意搜索一首歌曲,發現歌曲需要收費:但我們可是優秀的爬蟲工程師,要看底層的東西。

打開網頁版QQ音樂,搜索該歌曲會顯示如下頁面:點擊第一首:這樣就來到了播放頁面,然后打開開發者選項,在network選項卡中按ctrl+R展示所有的交互文件。然后第一步當然是檢查網頁源代碼啦,因為歌曲URL通常會包含在源代碼中,如圖所示在源代碼中查找URL可能比較繁瑣,但只要細心就能發現一些蛛絲馬跡,如圖:

這個節點中包含了一串m4a文件的URL,實際上QQ音樂下載的文件大多數是m4a格式的,當我們打開這個URL之后,果然就是歌曲文件:那么我們只要得到任意歌曲的URL就能通過請求庫直接下載了。但是在那之前我們需要取得播放頁面的URL,因為歌曲URL是包含在播放頁面的源代碼中的,我們可以看到播放頁面URL為:

https://i.y.qq.com/v8/playsong.html?ADTAG=newyqq.song&songmid=001OyHbk2MSIi4

其中ADTAG是固定參數,需要注意的是songmid,它指定每首歌曲的唯一id,如果要尋找songmid,我們可能要前往搜索頁面,因為這個參數很可能包含在我們按下搜索鍵后服務器的返回值中。

但遺憾的是,我們并沒有在搜索頁面源代碼中發現任何歌曲信息,這說明歌曲信息很可能是以XHR格式傳輸的,這也很符合網站設計的規范。

終于在一個XHR文檔中我們發現了搜索結果:list中的每個值都是一個搜索結果,展開之后就能看到歌曲的mid:然后再看看頁面的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=64979681270102176&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w=%E5%8D%81%E5%B9%B4&g_tk_new_20200303=5381&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0

其中有很多參數,但是我經過多次驗證發現,只有w參數是必須的,如圖:這其實給我們提供了很多方便。

那么我們先梳理一下流程,我們需要傳遞一個w歌曲名參數到搜索頁面中,在搜索結果中找到歌曲mid,獲得歌曲頁面源代碼,在源碼的audio節點中找到歌曲URL,最后下載保存到文件中。

import requests

from urllib.parse import unquote, quote

from pyquery import PyQuery as pq

class Music():

def __init__(self):

self.headers = {

'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Mobile Safari/537.36'

}

def download_music(self, sone_name):

'''定義下載文件方法'''

self.get_sonmid(sone_name)

def get_sonmid(self, sone_name):

'''獲取文件ID'''

url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=10&w={0}&g_tk_new_20200303=5381&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0'.format(quote(sone_name))

#搜索頁面URL

resp = requests.get(url, headers=self.headers)

#返回搜索列表

resp_dic = resp.json()

self.get_songloc(resp_dic['data']['song']['list'][0]['mid'])

#獲得結果中第一首歌曲ID

def get_songloc(self, mid):

'''獲得歌曲文件鏈接并下載'''

url = 'https://i.y.qq.com/v8/playsong.html?ADTAG=newyqq.song&songmid={0}'.format(mid)

#通過mid構建播放頁面URL

resp = requests.get(url, headers=self.headers)

#返回HRML文檔樹

doc = pq(resp.text)

audio = doc('audio')

#獲得audio節點

medio_url = audio.attr('src')

#獲得歌曲文件URL

print(medio_url)

resp = requests.get(medio_url, headers=self.headers)

with open('music.m4a', 'wb+') as f:

f.write(resp.content)#保存二進制文件

if __name__ == '__main__':

music = Music()

song_name = input('請輸入歌曲名:')

music.download_music(song_name)

運行以上代碼后,在控制臺輸入“十年”,我們可以看到控制臺成功輸出了歌曲文件的URL:

http://aqqmusic.tc.qq.com/amobile.music.tc.qq.com/C400002AIxAT3HZwiA.m4a?guid=7223831426&vkey=B2EF54EF4C8F2FA2B6544984A54B071B623702999E1DAE7DD355884D595CAACC79D4C54C4AA8890CB3BE98760092825D9E46CEF4139DDFB6&uin=0&fromtag=38

同時在本目錄下將歌曲保存了下來:

用QQ音樂播放器打開后:成功播放!

但是該方法只能下載大部分的付費歌曲和免費歌曲,還有少部分的試聽歌曲會解析失敗,因為官方重構了這部分歌曲的播放頁面,需要登陸并且傳遞用戶信息。在此記錄一下,解決個問題之后再重新發張帖子。

如果你覺得文章對你有幫助,可以關注微信公眾號“機器圖騰”,里面有免費的網絡爬蟲教程以及python學習資源,每周不定時更新一些有趣的python小項目。

總結

以上是生活随笔為你收集整理的python爬取付费音乐包_python爬虫如何下载QQ音乐付费歌曲2020最新版的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。