python爬蟲下載網易雲收費歌曲

多年前,在一檔電視節目中,歌手韓紅斥責中國盜版太多,吐槽中國對版權的不重視、說實話,作爲一名付不起VIP的良好中國公民來說,聽到這話挺無奈的,心想要是中國也和美國那樣知識版權意識太好,那以後誰還聽歌了。然而。我們做過的發展超乎了世界的想想,對版權意識的增加也完全超出了我的想想,不知何時起,網易云爲代表的一批音樂運營商發動所有資源終於對音樂這塊下手了。有一句話說的好:“既然你要發動江湖勢力,那就讓你看看這究竟是誰的江湖”,

網易雲收費歌曲下載

打開網易雲音樂的熱歌榜,以熱歌榜爲例

鍵盤按F12鍵或鼠標右鍵點擊檢查,彈出開發者工具,然後點擊其中一首歌,點擊播放,我們就可以看到下面彈出了很多條目,這都是我們向服務器發送請求後返回的文件,我們的任務就是在衆多文件中尋找到我們正在收聽的歌曲文件(即MP3文件)
開發者工具
點擊紅色邊框內的Media,在這裏我們可以看到服務器響應返回的多媒體文件,綠色箭頭所指就是歌曲文件了。
開發者工具
既然找到了我們所要的文件,該怎麼下載呢???不用擔心,右鍵點擊該文件。
將鼠標地方在該文件上,我們就可以看到該文件的連接了,既然知道音頻的鏈接地址,我們有知道音頻在網上都是以二進制文件存儲傳輸的,那麼使用python就可以很容易的下載了,若是有小夥伴還不知道如何使用python下載二進制文件可參考博文:python下載二進制文件
當然還有一種方法並不需要編寫代碼就可以下載,那就是鼠標右鍵點擊綠色箭頭所指文件,選擇彈出的選項卡中的第一項“Open in new tab”會彈出一個新的頁面
歌曲
在新彈出的頁面中我們點擊播放就可以播放該歌曲了,至於要下載,點擊最右邊的省略號,會有如下選項卡,點擊下載,歌曲便會成功下載了
在這裏插入圖片描述

人窮購買不起VIP,唯有此法,只能說人在江湖,身不由己

當然這種方式屬於純手工操作,我們也可以代碼下載:

找到綠色箭頭所指的文件的話,我們有很多途徑可以獲得該歌曲文件的絕對路徑:
1、右鍵點擊該文件,點擊Open in new tab在新打開的網頁瀏覽器地址欄有該文件的絕對路徑鏈接地址
2、右鍵點擊該文件,點擊Copy>copy link address就可以獲取該音樂文件的連接地址
以歌曲《可不可以》爲例,我們獲取的鏈接地址爲可不可以》mp3
既然知道了鏈接地址,下載的話就好說,左鍵點擊綠色箭頭所指的文件,我們會看到右側出現很多信息,如下所示:
在這裏插入圖片描述
通過觀察分析,我們看到該mp3文件是以get方式請求的,看到這裏,我們就可以寫代碼下載該音樂了

代碼

import requests

r = requests.get('http://m10.music.126.net/20181121151228/f0ff54de823b6dad38c3ca5883732c66/ymusic/341e/9cc2/7c4f/b13ac6e62d3625524dde95fd1b1628bf.mp3')

with open('可不可以.mp3','wb') as f:
    f.write(r.content)

運行結果

在這裏插入圖片描述
那到這裏,是不就是可以通過代碼下載歌曲了呢。

當然作爲程序員,這麼點代碼兩肯定是不夠的,爬蟲作爲一種爬取數據的手段,其目的是要實現自動化爬取,很明顯前面人工的操作太多了。下面我們讓整個項目更加自動化一點。

隨意選取一首音樂,我們還是以《可不可以》爲例
在這裏插入圖片描述
在網易雲音樂中我們知道每首歌曲都有專門的歌曲id。《可不可以》id爲553755659,
所以我們可以看到《可不可以》所在的網頁鏈接爲

https://music.163.com/#/song?id=553755659
由此也就推測所有歌曲的網頁鏈接爲https://music.163.com/#/song?id=後面跟上他的id號。不信多打開幾首歌查看試試。

那麼知道這個有什麼用呢?
我們知道一個歌曲會有很多信息,就如網頁上顯示的一樣,有歌曲名、歌詞、歌手等,這些都是從服務器請求得來的,一般服務器會將這些信息組成一個數據快傳送過來。
刷新界面(按F5)
將紅色方框中選爲XHR,我們打開綠色箭頭所指的文件,然後點擊priview,我們可以看到很多關於此歌曲的信息。
在這裏插入圖片描述
其中有一項是歌曲的URL
在這裏插入圖片描述
經過比對,這和我們之前得到的鏈接是一樣的,所以我們有理由相信,這就是《可不可以》的正確文件地址。
所以說我們是需要型服務器請求這一個文件就可,接下來咱們看一下他的響應頭
在這裏插入圖片描述

在這裏插入圖片描述
我們可以看到,響應方式爲post,並且傳入了params、encSecKey兩個參數,顯然是加密過的,但是咱們不深究這是如何加密解密,咱們可以直接複製這兩個參數使用就行
話不多說,上代碼

import requests
import re
import json

'''
    Author: Face_to_sun
    modify: 2018-11-21
'''

def download_MP3(url):
    '''下載歌曲'''
    r = requests.get(url)
    with open('Music\\可不可以.mp3','wb') as f:
        f.write(r.content)

def getUrl():
    '''獲得歌曲URL'''
    r = requests.post(url, headers=headers, data=data)
    response_data = json.loads(r.text)
    print(response_data['data'][0]['url'])
    download_url = response_data['data'][0]['url']
    return download_url

if __name__ == "__main__":
    url = 'https://music.163.com/weapi/song/enhance/player/url?csrf_token='
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36',
        'Host': 'music.163.com',
        'referer': 'https://music.163.com/',
        'Origin': 'https://music.163.com'
    }

    data = {
        'params': 'u6SEfpt2WTDENzie0aJs1c3dzjB1cQjGVERXnkRLnHnsiFSaAdUfeBwu9jeoC6axZjvKyidX7r9S7aoPiyxJ2qJ2X+mygkjnYZM4qYvgyBZAdvqtY7OfVnuMUaAnAG4U',
        'encSecKey': 'c02c3b63f5b129b1891f516ace6e8343e848d9bd15d5494e3be9f116c2b76bc2f430837de91e9fd4eec7aa257763f1a6b6f8f6861364fb8ca77c9dbc376db203ea92ed8a8f2c225e031b581e154b8d85f409b380cf982475abe9b32d5a5d2111e69c6d3599e186fe29afa5183f7b37645395e964e656cc3e8611f559f664ee69'
    }
    url = getUrl()
    download_MP3(url)

在這裏插入圖片描述
閒來發現,在響應回來的文件中還有歌詞文件,我們也可以從中下載歌曲的歌詞,不妨試試。

更多有關python爬蟲的內容,請關注博主的專欄python3爬蟲謝謝支持~~

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