python爬蟲教程:爬取酷狗音樂,零基礎小白也能爬取哦
本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理
以下文章來源於騰訊雲 作者:python學習教程
( 想要學習Python?Python學習交流群:1039649593,滿足你的需求,資料都已經上傳群檔案流,可以自行下載!還有海量最新2020python學習資料。 )
在常見的幾個音樂網站裡,酷狗可以說是最好爬取的啦,什麼彎都沒有,也沒加密啥的,所以最適合小白入門爬蟲
本篇針對爬蟲零基礎的小白,所以每一步驟我都截圖並詳細解釋了,其實我自己看著都囉嗦,歸根到底就是兩個步驟的請求,還請大佬繞路勿噴。
1.開啟酷狗官網,可以看到搜尋框,我們要爬取的資料就是搜尋歌曲後,酷狗後臺返回的歌曲列表以及每首歌的歌曲資訊(歌詞、作者、url等)
敲F12鍵進入開發者模式,選擇Network - All (這裡就是酷狗前後臺互動的所有請求列表)
搜尋框中輸入搜尋內容,然後右側就可以看到會出現很多列表,搜尋的列表資料其實就在這裡面一條,我已經紅色框標註了(找出這個可以根據那個名字song_search,實在不行點開一個個看是不是所要找的內容)
點開這行,上面切換到Preview發現就是搜尋結果的json資料,lists就是資料列表
點開一條歌曲,裡面就包含歌曲名字,作者,AlbumID,FileHash等歌曲資訊
然後我們上面切換到Headers,可以看到RequestURL(就是請求網址),下面箭頭可以看到是GET請求
往下滑,可以看到Requset Headers(這個後端會驗證heades,一般請求時user-agent都需要寫上,有些還驗證更偏的,需要看情況處理,酷狗倒是沒有驗證,不寫headers請求也可以)和請求引數(這就是請求的引數,搜尋關鍵詞、請求數目等資訊)
話不多說,我們直接用python的requests庫(這個直接百度裝一下就行)構造請求,我的環境是python2.7,python3的注意一下版本差異
#coding=utf-8import requests search = '喜歡你' #搜尋內容pagesize = '10' #請求數目url = 'https://songsearch.kugou.com/song_search_v2?callback=jQuery11240251602301830425_1548735800928&keyword=%s&page=1&pagesize=%s&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1548735800930' % (search,pagesize)res = requests.get(url) #requests發起get請求print res.text #輸出響應內容輸出結果就是這樣,可以看到返回json內容全部列印了出來,這就是和剛才在瀏覽器開發者工具看到的資訊一樣
接著我們拿到列表後,再轉回瀏覽器,拿到列表每一條歌曲的具體資訊,左側選擇第一條點選進入詳情頁
可以看到跳轉到了播放頁面,重新整理一下頁面,重新載入一遍
可以看到右側紅色框圈起來的就是歌曲資訊(你可能問我怎麼知道哪個才是包含歌曲資訊的,當然是觀察法了,寫多了就有經驗了,實在不會一個個點進去看)
我用箭頭標註的都是一般需要爬取的有用資訊,可以看到作者,歌曲名,歌詞,專輯圖片,id,play_url都在裡面,不信你把play_url複製到位址列回車播放的肯定是這個歌曲,拿到這個url我們就可以直接下載歌曲了
接著我們再從上方從Preview切換到Headers,可以看到和請求歌曲列表差不多,還是GET請求
這裡的query同樣還是GET請求的引數,其中hash和album_id就是一首歌曲的資訊,我們只需要請求不同歌曲時改這兩個引數就行了(第一步請求搜尋列表每一行單曲資料包含這個引數了)
直接剛才根據開發者模式裡面的RequestURL,構造get請求,請求每首歌曲時換上每首歌對應的id和hash值就行
#coding=utf-8import requests #在這裡,為了分步演示,直接用剛才第一步搜尋時開發者模式獲取到的搜尋列表第一條的id和hash#文章最後有整個連貫的程式碼 id = '557512' #單曲idhash = '41C2E4AB5660EAE04021C5893E055F50' #單曲hash值url = 'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery19107465224671418371_1555932632517&hash=%s&album_id=%s&_=1555932632518' % (hash,id) res = requests.get(url) print res.text
可以看到控制檯列印了單曲資訊,因為是json資料沒有轉換,直接輸出列印現在看起來有點亂
注意,酷狗返回資料並不直接就是json格式,兩端有一些無用字串,需用正則表示式去除,只保留大括號{}裡面(包括大括號)內容,19步驟程式碼裡有說明
我們已經熟悉了上面的兩步,最後進行彙總寫一個完整的python爬蟲,輸入搜尋歌曲,拿到搜尋列表幷包括單曲資訊
# coding=utf-8import requestsimport jsonimport re # 請求搜尋列表資料search = raw_input('音樂名:') # 控制檯輸入搜尋關鍵詞pagesize = "10" # 請求數目url = 'https://songsearch.kugou.com/song_search_v2?callback=jQuery11240251602301830425_1548735800928&keyword=%s&page=1&pagesize=%s&userid=-1&clientver=&platform=WebFilter&tag=em&filter=2&iscorrection=1&privilege_filter=0&_=1548735800930' % (search, pagesize)res = requests.get(url) # 進行get請求 # 需要注意一點,返回的資料並不是真正的json格式,前後有那個多餘字串需要用正則表示式去掉,只要大括號{}包著的內容# json.loads就是將json資料轉為python字典的函式res = json.loads(re.match(".*?({.*}).*", res.text, re.S).group(1)) list = res['data']['lists'] # 這個就是歌曲列表 #建立List存放歌曲列表資訊,將這個歌曲列表輸出,別的程式就可以直接呼叫musicList = [] #for迴圈遍歷列表得到每首單曲的資訊for item in list: #將列表每項的item['FileHash'],item['AlnbumID']拼接請求url2 url2 = 'https://wwwapi.kugou.com/yy/index.php?r=play/getdata&callback=jQuery191010559973368921649_1548736071852&hash=%s&album_id=%s&_=1548736071853' % ( item['FileHash'], item['AlbumID']) res2 = requests.get(url2) res2 = json.loads(re.match(".*?({.*}).*", res2.text).group(1))['data']#同樣需要用正則處理一下才為json格式,再轉為字典 #列印一下 print res2['song_name']+' - '+res2['author_name'] print res2['play_url'] print '' #將單曲資訊存在一個字典裡 dict = { 'author': res2['author_name'], 'title': res2['song_name'], 'id': str(res2['album_id']), 'type': 'kugou', 'pic': res2['img'], 'url': res2['play_url'], 'lrc': res2['lyrics'] } #將字典新增到歌曲列表 musicList.append(dict)
最後控制檯輸出結果