源碼 | Python爬蟲之網易雲音樂下載
源 /
網路
整理
/
頂級程序員
查看完成代碼
點擊文末閱讀原文
目標
偶然的一次機會聽到了房東的貓的《雲煙成雨》,瞬間迷上了這慵懶的嗓音和學生氣的歌詞,然後一直去循環聽她們的歌。然後還特意去刷了動漫《我是江小白》,好期待第二季…
我多想在見你,哪怕匆匆一眼就別離…
好了,不說廢話了。這次的目標主要是根據網易雲中歌手的ID,下載該歌手的熱門音樂的歌詞和音頻,並保存到本地的文件夾中。
配置基礎
Python
Selenium(配置方法參照:Selenium配置)
Chrome瀏覽器(其它的也可以,需要進行相應的修改)
分析
如果爬取過網易雲的網站的小夥伴都應該知道網易雲是有反爬取機制的,POST時需要對一些信息的參數進行加密函數的模擬。但是這裡為了簡便,小白也能理解。直接使用了Selenium來模擬登錄,然後使用介面來直接下載音樂和歌詞。
實驗步驟:
根據歌手ID獲取該歌手的熱門歌曲列表,歌曲名稱和鏈接,並保存到csv文件中;
讀取csv文件,根據歌曲鏈接,提取歌曲ID,然後利用相應的介面,下載音樂和歌詞;
將音樂和歌詞保存到本地。
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()函數獲取。
for
iin
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包。
而且直接獲取的歌詞中,每行有一個時間軸,需要用正則表達式來剔除,完整代碼如下:
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..."
)Reference
python 根據網易雲歌曲的ID 直接下載歌曲 https://blog.csdn.net/qq_38282706/article/details/80300546
Windows上安裝Selenium爬取網易雲歌曲 https://zhuanlan.zhihu.com/p/42078956
源碼地址
Github:https://github.com/blueberryc/web_crawler/blob/master/code/WYmusic.zip
今日推薦
《精通Python爬蟲框架Scrapy》
作者擁有15年開發經驗
本書適合軟體開發人員、數據科學家,以及對自然語言處理和機器學習感興趣的人閱讀。