首頁 >後端開發 >Python教學 >超簡單的Python爬蟲之網易雲音樂的下載

超簡單的Python爬蟲之網易雲音樂的下載

不言
不言原創
2018-08-29 11:57:054586瀏覽

這篇文章帶給大家的內容是關於超簡單的Python爬蟲之網易雲音樂的下載,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

目標

偶然的一次機會聽到了房東的貓的《雲煙成雨》,瞬間迷上了這慵懶的嗓音和學生氣的歌詞,然後一直去循環聽她們的歌。然後還特意去刷了動漫《我是江小白》,好期待第二季...

我多想在見你,哪怕匆匆一眼就別離...

好了,不說廢話了。這次的目標主要是根據網易雲中歌手的ID,下載該歌手的熱門音樂的歌詞和音頻,並保存到本地的資料夾中。

設定基礎

  • Python

  • #Selenium(設定方法參考:Selenium設定)

  • #Chrome瀏覽器(其它的也可以,需要進行相應的修改)

#分析

如果爬取過網易雲的網站的小伙伴都應該知道網易雲是有反爬取機制的,POST時需要對一些資訊的參數進行加密函數的模擬。但這裡為了簡便,小白也能理解。直接使用了Selenium來模擬登錄,然後使用介面來直接下載音樂和歌詞。

實驗步驟

  1. 根據歌手ID取得該歌手的熱門歌曲列表,歌曲名稱和鏈接,並保存到csv檔案中;

  2. 讀取csv文件,根據歌曲鏈接,提取歌曲ID,然後利用相應的接口,下載音樂和歌詞;

  3. ##將音樂和歌詞保存到本地。

超簡單的Python爬蟲之網易雲音樂的下載

Python實作

該部分將對幾個關鍵的函數進行介紹...

取得歌手資訊

利用Selenium我們就不需要看對網頁的請求了,直接可以從網頁原始碼中提取對應的資訊。查看歌手頁面原始碼可以發現,我們需要的資訊在iframe框架內,所以我們先需要切換到iframe:

browser.switch_to.frame('contentFrame')
繼續往下看,發現我們需要的歌曲名字和連結是在

id ="hotsong-list"的標籤中,然後每一行對應的是一個tr標籤。所以先取得所有的tr內容,然後遍歷單一tr

data = browser.find_element_by_id("hotsong-list").find_elements_by_tag_name("tr")
注意:前一個是

find_element,後一個是find_elements,後者回傳一個清單。

接下來就是解析單一

tr標籤的內容,取得歌曲名字和鏈接,可以發現兩者在class="txt"標籤中,而且連結是href屬性,名字是title屬性,可以直接透過get_attribute()函數取得。

超簡單的Python爬蟲之網易雲音樂的下載

for i in range(len(data)):
    content = data[i].find_element_by_class_name("txt")
    href = content.find_element_by_tag_name("a").get_attribute("href")
    title = content.find_element_by_tag_name("b").get_attribute("title")
    song_info.append((title, href))
下載歌詞

#網易云有個獲取歌詞的接口,連結為:http://music.163. com/api/song...

連結中的數字就是歌曲的id,所以我們擁有歌曲id後,可以直接從該連結下載歌詞,歌詞檔案是

json格式,所以我們需要用到json套件。

超簡單的Python爬蟲之網易雲音樂的下載

而且直接取得的歌詞中,每行都有時間軸,需要用正規表示式來剔除,完整程式碼如下:

def get_lyric(self):
    url = 'http://music.163.com/api/song/lyric?' + 'id=' + str(self.song_id) + '&lv=1&kv=1&tv=-1'
    r = requests.get(url)
    json_obj = r.text
    j = json.loads(json_obj)
    lyric = j['lrc']['lyric']
    # 利用正则表达式去除时间轴
    regex = re.compile(r'\[.*\]')
    final_lyric = re.sub(regex, '', lyric)
    return final_lyric
下載音訊

網易雲也提供了音訊檔案的接口,連結為:http://music.163.com/song/med...

連結中的數字為歌曲的id,可以直接根據歌曲的id來下載音檔。完整程式碼如下:

def get_mp3(self):
    url = 'http://music.163.com/song/media/outer/url?id=' + str(self.song_id)+'.mp3'
    try:
        print("正在下载:{0}".format(self.song_name))
        urllib.request.urlretrieve(url, '{0}/{1}.mp3'.format(self.path, self.song_name))
        print("Finish...")
    except:
        print("Fail...")
相關推薦:

如何利用Python爬取網易雲音樂熱門評論

##Python爬取qq音樂的過程實例

以上是超簡單的Python爬蟲之網易雲音樂的下載的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn