通过网易云歌单链接下载网易云歌曲
通過網易云歌單鏈接下載網易云歌曲
系統開發環境
操作系統:windows 10Python版本:Python3.x開發工具:pycharm 2019.2所需模塊:os,requests, lxml(請確認pycharm上是否有安裝否則導入會報錯)難度系數:??
一、先上圖(最終效果)
說明:可見即可爬,暫時只能爬取已經顯示的歌曲列表,后面知道怎么爬取全部歌曲有時間會更新或者另寫一篇。
二、需要理解的知識點
通過F12或者右鍵檢查調出開發者工具,查看Network找到播放列表請求鏈接,找到播放列表鏈接和歌單鏈接之間的規律
如圖可以看到他們之間的規律為https://music.163.com/playlist?id=歌單鏈接最后的id,即"https://music.163.com/playlist?id=%s" % 歌單id
代碼:
import requests from lxml import etree# 歌單地址和播放列表地址不一樣,所以需要一些處理 str = input(r"請輸入要下載的歌單鏈接:") print() # 獲取歌單最后面的id id = str.split("=")[-1] # playlist中的請求地址 url = "https://music.163.com/playlist?id=%s" % id # 偽裝頭部信息爬取當前網頁全部內容 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"}獲取網易云歌曲鏈接和歌曲名
查看url
查看歌曲id
復制id到編譯工具查找對應的標簽
查找對應的標簽方便提取(這里應該是在Pycharm上查看比較好,content中能打印出來的就能解析出來,有的網站做了反爬會根據你的Hearders和ip決定給你展示多少內容,有些內容并不會給你展示而你是根據網頁中的Elements解析的內容,你就獲取不到你解析中想要的內容)
根據標簽提取name和url
代碼:
獲取網易云歌曲外鏈
這里用的是第二個
查看音樂id
復制到網易外鏈轉換查找
分析規律
代碼:
讀取音樂文件并寫入
這個可能會報異常,因為如果歌曲名中有\ / : * ? " < > | 是不符合windows命名規范的,已用正則做處理(更)
導入re庫,用sub替換非法字符
import re
new_name = re.sub(r’[/:?*"<>|]+’, ‘_’, file_name)
代碼:
with open(file_path, "wb") as mu:try:req = requests.get(music_base, headers=headers)mu.write(req.content)print("下載 %s.mp3 成功" % file_name)print()except Exception as e:print("讀取 %s.mp3 失敗" % file_name)passcontinueget_content(url)三、運行
復制歌單鏈接
粘貼到編輯器
因為直接粘貼并Enter會打開網頁跳轉到網頁界面,所以鏈接后面加個空格再按Enter鍵
好了,你可以看到音樂開始下載了
查看音樂
Ctrl+Alt+F12打開音樂文件目錄或者右鍵后再點擊Directory Path打開
參考
四、項目全部代碼(2020.9.29更)
import os import reimport requests from lxml import etree# 歌單地址和播放列表地址不一樣,所以需要一些處理 str = input(r"請輸入要下載的歌單鏈接:") print() # 獲取歌單最后面的id id = str.split("=")[-1] # playlist中的請求地址 url = "https://music.163.com/playlist?id={}".format(id) # 偽裝頭部信息爬取當前網頁全部內容 headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"}def get_content(url):# 1.請求要抓取的網站--獲取網站返回的數據html = requests.get(url, headers=headers).content.decode("utf-8")# 2.加載htmltree = etree.HTML(html)# print(html)"""// : 根目錄[] :謂語-條件/ : 單個元素@ :提取這個元素"""url_music = tree.xpath('//ul[@class="f-hide"]/li/a/@href')name = tree.xpath('//ul[@class="f-hide"]/li/a/text()')# print(url_music, name)for index, item in enumerate(url_music):url_id = item.split("=")[-1]file_name = name[index]# 將不符合windows文件命名規范的文件名用 _ 替換new_name = re.sub(r'[/\:?*"<>|]+', '_', file_name)# print(url_id, file_name)print("正在讀取 {}.mp3".format(file_name))# 網易云外鏈 http://music.163.com/song/media/outer/url?id=music_base = "http://music.163.com/song/media/outer/url?id={}".format(url_id)print(music_base)# 加r防止字符轉義file_dir = "E:\PyCharm\Project\Module_09\網易云歌曲"file_path = r"{}/{}.mp3".format(file_dir, new_name)# 判斷文件目錄是否存在,如果不存在,新建一個文件夾if not os.path.exists(file_dir):os.makedirs(file_dir)with open(file_path, "wb") as mu:try:req = requests.get(music_base, headers=headers)mu.write(req.content)print("下載 {}.mp3 成功".format(new_name))print()except Exception as e:p = print("讀取 {}.mp3 失敗".format(new_name))continueif __name__ == '__main__':get_content(url)如果覺得對你們有幫助可以點個贊或者關注一波哦~
祝你們聽的愉快~
總結
以上是生活随笔為你收集整理的通过网易云歌单链接下载网易云歌曲的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Arch系统软件列表
- 下一篇: Ubuntu 20.04美化及QQ、微信