1. 程式人生 > 實用技巧 >python爬蟲教程:爬取酷狗音樂,零基礎小白也能爬取哦

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)

最後控制檯輸出結果