很久沒有更新博客了,今天我就來寫一個爬蟲吧。若是你是那種喜歡緩存歌,喜歡聽歌的人,你必定遇到過這種狀況,
因爲版權緣由沒法播放(緩存)此歌曲
,或者是請使用客戶端下載
(emmm,有些下載客戶端也不能下載)。因此,爲了世界的幸福感,爲了守護世界的和平,貫徹愛與真實的邪惡,可愛又迷人的反派角色,emmm,對不起跑題了,今天我就寫一個,突破這種限制的小小小音樂爬蟲,So Just have fun again…web
就拿杰倫的這首稻香,當你點擊播放的時候,就顯示下面這個界面,沒法播放json
因此有了這篇博客的由來。api
先拿一首能播放的音樂,就拿這首薛之謙的《剛恰好》來分析,進入這個頁面右鍵
檢查
,或者按F12
進入開發者調試界面,再選中Network
,你應該就能看到下面這個界面(若是不能,你就刷新頁面)緩存
上面那個歌曲連接,若是你直接去訪問應該是就直接下載了,可是這樣對稻香這種歌,根本不能播放,就不會去接受數據播放音樂,也就是說不會有這個url連接svg
可是,莫慌,慢慢來jsonp
咱們先來看看它是如何接受這首歌的地址,咱們先你前面選中的
Media
換成All
,而後刷新頁面,這個時候你確定看到亂七八糟的’東西’,以下url
這個時候不能腦袋疼,這些只是你刷新頁面後接受的數據,咱們要的東西必定就是在這裏面,因此,咱們就要進行篩選,這裏我就簡單說一種,你點擊
size
,讓它從大到小排序。。。這個時候,你應該就更能看清了,調試
第一個數據那麼大,你點擊進去發現,就是前面咱們找到的歌曲url,顯然不是咱們如今要的數據。因此,咱們接着往下找,一個個點擊進去,並點
Preview
(這樣看更加直觀),分別是一個個圖片,直到點到這個rest
點
Preview
,咱們就能更加確定是咱們要找的數據包code
把前面的URL地址複製下來直接去訪問看看,發現就是咱們要的數據((。-_-。),總算找到了)
找到了之後,此次的博客咱們就能夠寫代碼了
思路已經講清,就簡單展現下咱們的code。由於每一個人的寫代碼思路不一樣就不詳述了
""" author:lightfish time:2018.12.19 note:千千音樂的批量下載 """ import requests import re import json def get_music_resource(songid): """ :param songid: 歌曲的id :return: 由於咱們爬取的數據並非規範的json格式數據,因此咱們就得進行適當的處理,讓他變成 規範的json格式數據,這裏,我用的是正則方法 """ search_url = 'http://musicapi.taihe.com/v1/restserver/ting?method=baidu.ting.song.playAAC&format=jsonp&callback=jQuery172047648654448286276_1545221906467&songid={}'.format( songid) response = requests.get(search_url).text res = re.findall(r'\((.*)\)', response)[0] res_json = json.loads(res) return res_json def get_music_info(jsondata): songinfo = jsondata['songinfo'] music_title = songinfo['title'] print('歌名: ' + music_title) music_compose = songinfo['compose'] print('做者: ' + music_compose) album_title = songinfo['album_title'] print('專輯: ' + album_title) avatar = songinfo['artist_list'][0]['avatar_s300'] if songinfo['artist_list'][0]['avatar_s300'] else '' print('頭像: ' + avatar) music_language = songinfo['language'] if songinfo['language'] else '' print('語種: ' + music_language) music_country = songinfo['country'] if songinfo['country'] else '' print('國家: ' + music_country) music_url = jsondata['bitrate']['file_link'] print(music_url) return music_title, music_url def music_download(filename, url): with open(filename + '.mp3', 'wb') as f: f.write(requests.get(url).content) if __name__ == '__main__': songid = input('請輸入歌曲的id: ') data = get_music_resource(songid) music_title, music_url = get_music_info(data) is_download = input('是否下載(y/n): ') if is_download.lower() == 'y': music_download(music_title, music_url) print('下載完成,Just for fun...') elif is_download.lower() == 'n': print('Just for fun...') else: print('emmm ,exiting...')
emmm,突然發現都快忘了咱們周董的《稻香》了,實際上是同樣的,也有着songid,你去訪問也是能得到你想要的連接地址。anywhere,Just for fun…
以上就是此次博客的一點小小內容了,你能夠進行設當的擴展,如只須要輸入歌手的名稱就下載所有該歌手的音樂(emmm,原本想寫的,乏了,這種重任就交給大家了),能夠給一點思路,獲取頁面,找到全部的歌曲id,搜索就更簡單了,構造url 例如薛之謙的搜索界面是這樣的 click me,是否是很簡單So,Just have fun…