教你如何用Python批量下載本身喜歡聽得音樂

前言

文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。html

PS:若有須要Python學習資料的小夥伴能夠加點擊下方連接自行獲取python

http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef

音樂是生活的調劑品,目前不少的音樂只能播放不能下載。生爲技術員的咱們,怎麼甘心呢? web

知識點:正則表達式

  1. requestsjson

  2. 正則表達式api

 

開發環境:網絡

  1. 版 本:anaconda5.2.0(python3.6.5)編輯器

  2. 編輯器:pycharm工具

 

第三方庫:學習

  1. requests

  2. parsel

網頁分析

目標站點:http://music.taihe.com/search?key=%E9%99%88%E7%B2%92

分析音樂的真實地址

選擇一首歌 以陳粒的走馬爲例

在這裏插入圖片描述

打開開發者工具,選擇network -> media -> 刷新網頁就能獲取到音樂的真實地址

可是獲得的地址在查看源碼中是讀取不到的,確定是百度音樂對其進行了隱藏。這種時候通常會有兩種狀況。第一種是使用了 JavaScript 對請求鏈接進行了拼接或加密,第二種是數據被隱藏了。因爲咱們不清楚是出現了那種狀況。因此咱們只能慢慢的去分析請求的數據。 在這裏插入圖片描述 在這裏插入圖片描述 通過分析咱們能夠看到真實的音樂地址是存在於這個API裏面http://musicapi.taihe.com/v1/restserver/ting?method=baidu.ting.song.playAAC&format=jsonp&callback=jQuery17206453751179783578_1544942124991&songid=243093242&from=web&_=1544942128336

而且咱們請求這個 API 返回的是一個 json 數據(也就是python的字典數據類型)。只要咱們使用字典的規則就能將咱們的全部數據給提取到。

url拼接 獲取全部數據

前面咱們獲得了音樂的真實地址,接下來咱們就是分析真實地址的 url ,以期待獲得下載全部音樂的訣竅。 在這裏插入圖片描述 在這裏插入圖片描述 仔細分析一下 url 就能夠發現,?後面的from參數與_即便不存在也不影響數據的請求。

而且後面的參數中的songid其實就是歌曲的惟一idfrom參數其實就是代表從哪一個平臺過來的

因此等一下咱們下載音樂時,只要批量獲取到歌曲的songid就能將全部的歌曲給所有下載下來了。

 

批量獲取singid

在這裏插入圖片描述 使用開發者工具,查看網頁源碼就能查看到songid的位置,若是咱們分析一個歌手頁面的url你會發現一樣能夠構造。

到此,整個網頁分析就結束了。

實現效果

在這裏插入圖片描述 在這裏插入圖片描述

完整代碼

 1 import re
 2 import requests
 3  4  5 def get_songid():
 6     """獲取音樂的songid"""
 7     url = 'http://music.taihe.com/artist/2517'
 8     response = requests.get(url=url)
 9     html = response.text
10     sids = re.findall(r'href="/song/(\d+)"', html)
11     return sids
12 13 14 def get_music_url(songid):
15     """獲取下載連接"""
16     api_url = f'http://musicapi.taihe.com/v1/restserver/ting?method=baidu.ting.song.playAAC&format=jsonp&songid={songid}&from=web'
17     response = requests.get(api_url.format(songid=songid))
18     data = response.json()
19     print(data)
20     try:
21         music_name = data['songinfo']['title']
22         music_url = data['bitrate']['file_link']
23         return music_name, music_url
24     except Exception as e:
25         print(e)
26 27 28 def download_music(music_name, music_url):
29     """下載音樂"""
30     response = requests.get(music_url)
31     content = response.content
32     save_file(music_name+'.mp3', content)
33 34 35 def save_file(filename, content):
36     """保存音樂"""
37     with open(file=filename, mode="wb") as f:
38         f.write(content)
39 40 41 if __name__ == "__main__":
42     for song_id in get_songid():
43         music_name, music_url = get_music_url(song_id)
44         download_music(music_name, music_url)

 


相關文章
相關標籤/搜索