文的文字及圖片來源於網絡,僅供學習、交流使用,不具備任何商業用途,版權歸原做者全部,若有問題請及時聯繫咱們以做處理。html
PS:若有須要Python學習資料的小夥伴能夠加點擊下方連接自行獲取python
http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef
音樂是生活的調劑品,目前不少的音樂只能播放不能下載。生爲技術員的咱們,怎麼甘心呢? web
知識點:正則表達式
requestsjson
正則表達式api
開發環境:網絡
版 本:anaconda5.2.0(python3.6.5)編輯器
編輯器:pycharm工具
第三方庫:學習
requests
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 就能夠發現,?
後面的from
參數與_
即便不存在也不影響數據的請求。
而且後面的參數中的songid
其實就是歌曲的惟一id
,from
參數其實就是代表從哪一個平臺過來的
因此等一下咱們下載音樂時,只要批量獲取到歌曲的songid
就能將全部的歌曲給所有下載下來了。
使用開發者工具,查看網頁源碼就能查看到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)