Python系列模擬登入之網易雲個人歌單下載器
前言
今天來寫個網易雲音樂個人歌單下載器唄,讓我們愉快地開始吧~
開發工具
Python版本:3.6.4
相關模組:
DecryptLogin模組;
argparse模組;
prettytable模組;
click模組;
以及一些python自帶的模組。
環境搭建
安裝Python並新增到環境變數,pip安裝需要的相關模組即可。
DecryptLogin安裝方式參見(因為經常更新,已經安裝過的小夥伴麻煩記得更新一下,否則可能會在新的案例中報錯)
原理簡介
既然是模擬登入系列,首先自然是先模擬登入網易雲音樂啦,這個利用我們開源的DecrpytLogin庫可以輕鬆地實現:
'''利用DecryptLogin實現模擬登入'''
@staticmethod
def login(username, password):
lg = login.Login()
infos_return, session = lg.music163(username, password)
return infos_return.get('userid'), session
複製程式碼
接著就是獲取登入使用者建立/收藏的歌單列表(注意,因為只是一個小例子,所以僅支援下載登入使用者自己建立/收藏的歌單,當然這程式碼應該很容易可以擴充套件到下載任意歌單T_T),透過抓包分析(其實網上很多地方可以找到別人分析完後公開的網易雲音樂api,需要的可以去知乎或者Github之類的網站上搜尋一下對應關鍵字)我們可以發現登入使用者所有歌單的列表可以透過請求以下API獲取:
複製程式碼
其中csrf_token的值在使用者登入後的session的cookies中可以找到,由此我們可以獲得我們需要的歌單相關的資訊,程式碼實現如下:
'''獲得所有歌單'''
def getPlayLists(self):
playlist_url = ''
playlists = []
offset = 0
while True:
data = {
"offset": offset,
"uid": self.userid,
"limit": 50,
"csrf_token": self.csrf
}
res = self.session.post(playlist_url+self.csrf, headers=self.headers, data=self.cracker.get(data))
playlists += res.json()['playlist']
offset += 1
if not res.json()['more'] == 'false':
break
all_playlists = {}
for item in playlists:
name = item.get('name')
track_count = item.get('trackCount')
play_count = item.get('playCount')
play_id = item.get('id')
if item.get('creator').get('userId') == self.userid:
attr = '我建立的歌單'
else:
attr = '我收藏的歌單'
all_playlists[str(play_id)] = [name, track_count, play_count, attr]
return all_playlists
複製程式碼
接著,使用者將選擇想要下載的歌單id,根據歌單id,我們將利用以下api來獲得該歌單的詳細資訊:
複製程式碼
具體而言,程式碼實現如下:
def getPlayListSongs(self, playlist_id, num_songs):
detail_url = ''
offset = 0
song_infos = {}
while True:
data = {
'id': playlist_id,
'offset': offset,
'total': True,
'limit': 1000,
'n': 1000,
'csrf_token': self.csrf
}
res = self.session.post(detail_url+self.csrf, headers=self.headers, data=self.cracker.get(data))
tracks = res.json()['playlist']['tracks']
for track in tracks:
name = track.get('name')
songid = track.get('id')
artists = ','.join([i.get('name') for i in track.get('ar')])
brs = [track.get('h')] + [track.get('m')] + [track.get('l')]
song_infos[songid] = [name, artists, brs]
offset += 1
if len(list(song_infos.keys())) >= num_songs:
break
return song_infos
複製程式碼
其中返回的資訊中br(其實就是歌曲位元率)和歌曲id在後續的歌曲下載中是必須要的,其他資訊的提取主要是為了使用者互動的需要。接著,當使用者確定是下載該歌單中的所有歌曲時,程式就開始下載所有歌曲啦。而某首歌曲下載的程式碼在之前的音樂下載器裡分享過,copy過來稍微改下大概就是這個這樣了:
'''下載某首歌曲'''
def downloadSong(self, songid, songname, brs, savepath='.'):
play_url = ''
print('正在下載 ——> %s' % songname)
for br in brs:
data = {
'ids': [songid],
'br': br.get('br'),
'csrf_token': self.csrf
}
res = self.session.post(play_url+self.csrf, headers=self.headers, data=self.cracker.get(data))
if res.json()['code'] == 200:
download_url = res.json()['data'][0].get('url', '')
if download_url:
break
with closing(self.session.get(download_url, headers=self.headers, stream=True, verify=False)) as res:
total_size = int(res.headers['content-length'])
if res.status_code == 200:
label = '[FileSize]:%0.2f MB' % (total_size/(1024*1024))
with click.progressbar(length=total_size, label=label) as progressbar:
with open(os.path.join(savepath, songname+'.'+download_url.split('.')[-1]), "wb") as f:
for chunk in res.iter_content(chunk_size=1024):
if chunk:
f.write(chunk)
progressbar.update(1024)
作者:戴沐白
連結:
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3402/viewspace-2807273/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Python爬取網易雲音樂歌單歌曲Python
- Python-模擬登入Python
- Python資料視覺化:網易雲音樂歌單Python視覺化
- 15行Python程式碼搞定網易雲熱門歌單Python
- 利用Python模擬GitHub登入PythonGithub
- Python爬蟲實戰之(五)| 模擬登入wechatPython爬蟲
- 模擬登入之web監控Web
- Python爬蟲實戰之(四)| 模擬登入京東商城Python爬蟲
- golang 模擬瀏覽器登入操作Golang瀏覽器
- 利用Python網路爬蟲抓取網易雲音樂歌詞Python爬蟲
- Python 爬蟲模擬登入方法彙總Python爬蟲
- 網易雲歌詞爬取(java)Java
- Python 爬蟲獲取網易雲音樂歌手歌詞Python爬蟲
- Python模擬登陸某網教師教育網Python
- Python+Selenium+phantomjs實現網頁模擬登入和截圖PythonJS網頁
- selenium模擬登入12306
- 實戰模擬│單點登入 SSO 的實現
- 手把手教你寫網路爬蟲(1):網易雲音樂歌單爬蟲
- 實戰:Mailivery 模擬登入AI
- 【Java】——模擬登入實現Java
- Python 大作業 網易雲歌單資料分析及視覺化(參考多位博主文章)Python視覺化
- Python下載網易雲歌曲(版許可權制的怎麼播放和下載呢?)Python
- ES6系列之模組載入方案
- ES6 系列之模組載入方案
- 虛擬機器系列 | JVM類載入機制虛擬機JVM
- Python培訓分享:python如何用cookie實現自動模擬登入?PythonCookie
- 2019年最新 Python 模擬登入知乎 支援驗證碼Python
- MetingJS 是如何配合 Aplayer 載入歌單的?JS
- Mac電腦:Android Studio 連線 MUMU 網易模擬器MacAndroid
- 實戰模擬│JWT 登入認證JWT
- QQ模擬登入實現後篇
- 使用 mock 模擬登入介面資料Mock
- python下載模組Python
- selenium與python自動化測試模擬登入百度Python
- 網易雲簡單案例
- 爬蟲之普通的模擬登陸爬蟲
- 【Android初級】如何實現一個“模擬後臺下載”的載入效果(附原始碼)Android原始碼
- 用Python程式碼來下載任意指定網易雲歌曲(超詳細版)Python