python批量下載網易雲音樂文件到本地

現在聽歌大多數只支持在線聽,下載要錢,沒網絡就白搭了。好吧,用技術手段解決免費、下載、批量等一些列問題

整個腳本的邏輯和流程是,把歌曲地址都存在一個txt中,然後循環每次取一條鏈接,分析鏈接對應歌曲的id和歌曲名,然後下載該歌曲,同時已歌曲名命名下載後的文件

 

 

 

網易雲音樂客戶端複製音樂地址,比如上面那首《踏山河》:https://music.163.com/song?id=1804320463&userid=502092978

歌曲地址內有可以看到id=1804320463,需要把這串數字分離出來,後面下載會用到,用正則分離出來

url=“https://music.163.com/song?id=1804320463&userid=502092978“”
song_id=re.findall('id=(.+?)&userid',url)[0]

 

然後根據地址獲取歌曲名稱,這裏使用的是xpath爬蟲抓取數據

song_url=“https://music.163.com/song?id=1804320463&userid=502092978“”
response = requests.get(song_url,headers)
wb_data = response.text # 將頁面轉換成文檔樹
html = etree.HTML(wb_data)
music_name = html.xpath('//em[@class = "f-ff2"]/text()')[0]

 

再就是下載歌曲,下載歌曲需要用到網易雲的專屬下載接口,http://music.163.com/song/media/outer/url?id=,id=後面即填入上面步驟分離出來的歌曲id

response = requests.get("http://music.163.com/song/media/outer/url?id="+song_id+".mp3")
        content = response.content
        with open(music_name+'.mp3', mode="wb") as f:
            f.write(content)
        print("下載"+"   "+music_name+"  "+"完成")

 

然後在腳本目錄下創建一個txt文件,把歌曲地址複製到文本內(每行一條地址)

 

 

 爲了方便觀察每一步獲取的數據,再每一步操作後面加入把數據打印出來,執行腳本

 

 

 

 

 

以上即是本案例的主要步驟和對應的腳本,至於讀取txt文件等,就參考後面附上的所有腳本內容

同時,已經把腳本打包成exe文件,沒有安裝python的電腦環境也可以執行(加微信xiaobeishuwu發文件)

 

特別強調,不要下的太過分,僅僅是技術交流,商業牟利自負責任

 

 

 附全部腳本

import requests   #倒入requests庫
from lxml import etree  #倒入lxml 庫(沒有這個庫,pip install lxml安裝)
import re

headers = {
    'authority': 'music.163.com',
    'pragma': 'no-cache',
    'cache-control': 'no-cache',
    'upgrade-insecure-requests': '1',
    'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
    'sec-fetch-site': 'same-origin',
    'sec-fetch-mode': 'nested-navigate',
    'referer': 'https://music.163.com/',
    'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'zh-CN,zh;q=0.9',
    'cookie': '_iuqxldmzr_=32; _ntes_nuid=01c796eee1899b3e988043381c5fe3ed; WM_TID=bClwjpRRyMhFBRRUVVZ8eNGfcwSRUP4D; vjuids=91172de86.167ba393a03.0.751a7745c4db9; vjlast=1545017572.1572947033.22; mail_psc_fingerprint=73ad847ab9b5c4a03a9db849350e6c87; _ntes_nnid=01c796eee1899b3e988043381c5fe3ed,1606698119460; NMTID=00OIwuy7su1M7DopUdapOO9k7XQi98AAAF2Fqu0fA; _ga=GA1.2.1259495320.1607509476; [email protected]|1607662298|0|mailyeah|00&99|hun&1606470131&mailyeah#hun&430100#10#0#0|&0|mailyeah|[email protected]; ntes_kaola_ad=1; __guid=94650624.2334178747771955700.1621191366476.4607; WEVNSM=1.0.0; vinfo_n_f_l_n3=3d881b79189ff41c.1.12.1547520183001.1614838367331.1621988944652; WNMCID=ejsics.1623379617606.01.0; WM_NI=mdEEc6iEFx0kqT58oiR1ru7%2FkLYUA1PyRK6%2BTHLghGMimil%2BS5tVG%2FwgVucIvSbr8YLaHYx37EAxuzxT1dsFJEhDfawZAmKXmaade%2FrrEDFjQu3pQNMcaiAKD5mlJQ26TGI%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eeb2ea6a8a889cd1cc49ed9a8fb6d85b879b8f84f862baaaa5acd669b49f99b9eb2af0fea7c3b92aafbc8ba6e23eab9b8a99b361b38cfbd9ee6392efbe96b625a99497b6c43b94a79eacb52198988488eb4d8fb7a38aef2191ebbcb7c625b5b99a96e243b68dae93bb5390bf88bafb39f59b8f99f872bc8cff85f24e8a9ba8a5e56bb5868f8eca54afbfaf85e825b2ae8ba5c56293abfd91d4468fbdaf8ac44188eba38dc95bf2ea9ca8cc37e2a3; playerid=78983598; JSESSIONID-WYYY=%2FRnux48Q%2FpfVFCwSG6v2vRBRWVgCV%2B6Sq6AI4NdRfU527Dz%2FaA74w3xExYMzsWMrMCOh4w6fvc%5CM3inN2WkZQ3gtAUt%5CHwj4rtxKYCdj6OaYHu%2FxAthJgtmzw%2BaHzKUSz36Vo45aOsuf1Hq2NTx0N5qs7p%5CPc%2B6KB6ZvkhG5HvzS62pi%3A1629883157132; monitor_count=7',
}

soure = open('address.txt', 'r')
value = soure.readlines()
soure.close()

def download_music(value,headers):
    #讀取歌曲地址
    for url in value:
        url=url[:-1]#去掉換行符,然後url後面會帶個空格,訪問不了鏈接

    #解析地址,獲取歌曲名稱和id
        song_id=re.findall('id=(.+?)&userid',url)[0]
        print("歌曲id:"+song_id)
        song_url = "https://music.163.com/song?id="+song_id
        response = requests.get(song_url,headers)
        wb_data = response.text # 將頁面轉換成文檔樹
        html = etree.HTML(wb_data)
        music_name = html.xpath('//em[@class = "f-ff2"]/text()')[0]
        print("歌曲名稱:"+music_name)
    #將歌曲名稱和id傳入,下載歌曲
        response = requests.get("http://music.163.com/song/media/outer/url?id="+song_id+".mp3")
        content = response.content
        with open(music_name+'.mp3', mode="wb") as f:
            f.write(content)
        print("下載"+"   "+music_name+"  "+"完成")
download_music(value,headers)

 

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