前一段時(shí)間剛剛?cè)腴Tpython爬蟲,有大概半個(gè)月時(shí)間沒(méi)有寫python了,都快遺忘了。于是準(zhǔn)備寫個(gè)簡(jiǎn)單的爬蟲練練手,我覺(jué)得網(wǎng)易云音樂(lè)最優(yōu)特色的就是其精準(zhǔn)的歌曲推薦和獨(dú)具特色的用戶評(píng)論,于是寫了這個(gè)抓取網(wǎng)易云音樂(lè)熱歌榜里的熱評(píng)的爬蟲。我也是剛剛?cè)腴T爬蟲,有什么意見(jiàn)和問(wèn)題歡迎提出,大家一起共同進(jìn)步。
廢話就不多說(shuō)了~
我們的目標(biāo)是爬取網(wǎng)易云中的熱歌排行榜中所有歌曲的熱門評(píng)論。
這樣既可以減少我們需要爬取的工作量,又可以保存到高質(zhì)量的評(píng)論。
首先,我們打開網(wǎng)易云網(wǎng)頁(yè)版,如圖:
點(diǎn)擊排行榜,然后點(diǎn)擊左側(cè)云音樂(lè)熱歌榜,如圖:
我們先隨便打開一個(gè)歌曲,找到如何抓取指定的歌曲的熱門歌評(píng)的方法,如圖,我選了一個(gè)最近我比較喜歡的歌曲為例:
進(jìn)去后我們會(huì)看到歌評(píng)就在這個(gè)頁(yè)面的下面,接下來(lái)我們就要想辦法獲取這些評(píng)論。
接下來(lái)打開web控制臺(tái)(chrom的話打開開發(fā)者工具,如果是其他瀏覽器應(yīng)該也是類似),chrom下按F12,如圖:
選則Network,然后我們按F5刷新一下,刷新之后得到的數(shù)據(jù)如下圖所示:
可以看到瀏覽器發(fā)送了非常多的信息,那么哪一個(gè)才是我們想要的呢?這里我們可以通過(guò)狀態(tài)碼做一個(gè)初步的判斷,status code(狀態(tài)碼)標(biāo)志了服務(wù)器請(qǐng)求的狀態(tài),這里狀態(tài)碼為200即表示請(qǐng)求正常,而304則表示不正常(狀態(tài)碼種類非常多,如果要想詳細(xì)了解可以自行搜索,這里不說(shuō)304具體的含義了)。所以我們一般只用看狀態(tài)碼為200的請(qǐng)求就可以了,還有就是,我們可以通過(guò)右邊欄的預(yù)覽來(lái)粗略觀察服務(wù)器返回了什么信息(或者查看響應(yīng))。通過(guò)這兩種方法結(jié)合一般我們就可以快速找到我們想要分析的請(qǐng)求。通過(guò)反復(fù)的查找,終于找到了含有歌評(píng)的請(qǐng)求,如圖:
可能截圖在CSDN上不是很清楚,我們?cè)谝粋€(gè)Name為R_SO_4_489998494?csrf_token=的POST請(qǐng)求中找到了包含這首歌的歌評(píng)。我們把這個(gè)分塊截圖發(fā)出來(lái),這樣可以看的清楚一些:
請(qǐng)求基本信息:
請(qǐng)求頭部:
請(qǐng)求中的表單數(shù)據(jù):
我們可以看到,包含這首歌歌評(píng)的請(qǐng)求url為http://music.163.com/weapi/v1/resource/comments/R_SO_4_489998494?csrf_token=,我們換了幾首歌后發(fā)現(xiàn),這個(gè)請(qǐng)求的前部分都是一樣的,只是R_SO_4_后面緊跟的一串?dāng)?shù)字不一樣。我們可以推測(cè)出,每一首歌都有一個(gè)指定的id,R_SO_4_后面緊跟的就是這首歌的id。
我們?cè)倏匆幌绿峤坏谋韱螖?shù)據(jù),我們會(huì)發(fā)現(xiàn)表單中需要填兩個(gè)數(shù)據(jù),名稱為params和encSecKey。后面緊跟的是一大串字符,換幾首歌會(huì)發(fā)現(xiàn),每首歌的params和encSecKey都是不一樣的,因此,這兩個(gè)數(shù)據(jù)可能經(jīng)過(guò)一個(gè)特定的算法進(jìn)行加密過(guò)的。
服務(wù)器返回的和評(píng)論相關(guān)的數(shù)據(jù)為json格式的,里面含有非常豐富的信息(比如有關(guān)評(píng)論者的信息,評(píng)論日期,點(diǎn)贊數(shù),評(píng)論內(nèi)容等等),其中hotComments就是我們要找的熱門評(píng)論,總共15條,如圖所示:
至此,我們已經(jīng)確定了方向了,即只需要確定params和encSecKey這兩個(gè)參數(shù)值即可。但是這兩個(gè)參數(shù)是經(jīng)過(guò)特定的算法進(jìn)行加密的,怎么辦呢?我發(fā)現(xiàn)了一個(gè)規(guī)律,http://music.163.com/weapi/v1/resource/comments/R_SO_4_489998494?csrf_token=中 R_SO_4_后面的數(shù)字就是這首歌的id值,而對(duì)于不同的歌曲的param和encSecKey值,如果把一首歌比如A的這兩個(gè)參數(shù)值傳給B這首歌,那么對(duì)于相同的頁(yè)數(shù),這種參數(shù)是通用的,即A的第一頁(yè)的兩個(gè)參數(shù)值傳給其他任何一首歌的兩個(gè)參數(shù),都可以獲得相應(yīng)歌曲的第一頁(yè)的評(píng)論,對(duì)于第二頁(yè),第三頁(yè)等也是類似。
而我們其實(shí)只需要獲取第一頁(yè)的15條熱門評(píng)論,所以我們只需要隨便找一首歌,將這首歌第一頁(yè)中的該請(qǐng)求中的params和encSecKey這兩個(gè)參數(shù)值復(fù)制下來(lái),就可以使用了。
關(guān)于這兩個(gè)參數(shù)如何解密,強(qiáng)大的知乎上其實(shí)已經(jīng)有答案的了,感興趣的朋友可以進(jìn)去看一下(https://www.zhihu.com/question/36081767),我們?cè)谶@里就只需要用我們這種偷懶的辦法就可以完成需求了,xixi。
到此為止,我們?nèi)绾巫ト【W(wǎng)易云音樂(lè)的熱門評(píng)論已經(jīng)分析完了,我們?cè)俜治鲆幌氯绾潍@取云音樂(lè)熱歌榜中所有歌曲的信息。
我們需要獲取云音樂(lè)熱歌榜中的所有歌曲的歌曲名和對(duì)應(yīng)的id值。
跟上面的分析步驟類似,我們先進(jìn)入熱歌榜的網(wǎng)址,如圖:
按F12,進(jìn)入WEB工作臺(tái),如圖:
我們?cè)谝粋€(gè)名為toplist?id=3778678的GET請(qǐng)求中,找到了該榜單的所有歌曲信息。
請(qǐng)求對(duì)應(yīng)的信息如圖:
我們預(yù)覽一下該請(qǐng)求返回的結(jié)果,如圖:
我們?cè)诖a的第524行我們找到了包含歌曲信息的代碼,如圖:
因此,我們只需要將該請(qǐng)求的代碼中,將包含信息的代碼篩選出來(lái)。
我們?cè)谶@里使用正則表達(dá)式進(jìn)行數(shù)據(jù)篩選。
通過(guò)觀察特點(diǎn),我們可以通過(guò)兩次正則表達(dá)式的篩選,將我們需要的歌曲信息提取出來(lái)。
第一次正則表達(dá)式我們將該請(qǐng)求返回的所有代碼中,提取出第525行代碼。
第一次正則表達(dá)式如下:
第二次正則表達(dá)式我們將該第524行中我們需要的歌曲信息提取出來(lái),我們需要歌曲的歌名和id,對(duì)應(yīng)的正則表達(dá)式如下:
獲取歌名:
獲取歌曲的id:
到此,我們整個(gè)過(guò)程已經(jīng)分析完了,上代碼看具體細(xì)節(jié)~~
代碼如下:
代碼運(yùn)行結(jié)果如下:
對(duì)比一下網(wǎng)頁(yè)上《如果我愛(ài)你》這首歌的歌評(píng)和我們保存下的歌評(píng):
-
python
+關(guān)注
關(guān)注
56文章
4792瀏覽量
84627 -
爬蟲
+關(guān)注
關(guān)注
0文章
82瀏覽量
6867
原文標(biāo)題:Python3爬蟲抓取網(wǎng)易云音樂(lè)熱評(píng)實(shí)戰(zhàn)
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論