當前位置:
首頁 > 科技 > 如何用 Python 爬取網易雲音樂的 10w+評論?附詳細代碼解讀

如何用 Python 爬取網易雲音樂的 10w+評論?附詳細代碼解讀

在簡單學習了Python爬蟲之後,我的下一個目標就是網易雲音樂。因為本人平時就是用它聽的歌,也喜歡看歌里的評論,所以本文就來爬一爬網易雲音樂的評論吧!

正式進入主題

首先是找到目標網頁並分析網頁結構,具體如下:

上面的三個箭頭就是要找的數據,分別是評論用戶、評論和點贊數,都可以用正則表達式找到。接下來用開發者工具繼續找下一頁的數據,這時候會遇到一個問題,點擊下一頁的時候網頁URL沒有變,即說明該網頁是動態載入,所以就不能在當前網頁找數據了,而應該在XHR文件里找,所以點入Network,再點擊下一頁,果然有我們想要的。

看到這裡,就可以興奮地去敲代碼了。

點擊運行,卻沒有得到任何返還結果,這是為何?它的狀態碼是200,明顯請求已成功,卻沒有東西返回。再去Network仔細看看這個網頁,可以看到它是個Post請求,也看到了需要Post兩個參數params和ensSecKey。

很明顯,這個密密麻麻的數字和字母應該是被加密了,不過可以複製下來看看有沒有用。接下來看下它的Response,因為是Json而不是Html結構的,所以現在需要用到Json庫來進行解析。

現在開始敲代碼吧,先把上面的兩個參數複製過來看看:

現在把每條評論的評論用戶、點贊數和評論獲取出來:

可以看到,利用json.loads()方法把數據轉成Python格式里的字典後就可以把想要的數據取出來了。但是,下一頁怎樣取?總不能每次都複製粘貼那兩個參數吧?那唯一的方法就是不爬了?

所以想要繼續的話,就只能破解這兩個參數了。那下面繼續看Network,因為加密肯定要用JS進行加密的。

看到剛才那個網站的發起者是core.js,把它的文件下載下來慢慢研究。

可以看到window.asrsea()方法有四個參數。先不去管這個函數,先看看它的四個參數是什麼(這裡沒必要去研究那四個參數是怎樣來的,只需要知道它們分別是什麼)。那麼可以加點代碼讓它顯示出來,從而利用fiddler調試。

加入的代碼如下:

可以分別獲取上面的每一個參數,也把那個params獲取看看,然後在fiddler上操作如下:

完成上面的設置後刷新網頁就可以在console上面找到參數信息,如果沒有的話這是因為你之前瀏覽該網頁的時候它被緩存了下來,所以要清除緩存文件(在清除瀏覽器記錄裡面有)。

那個rid有本歌曲的id,明顯是與評論有關的。我試著連翻幾頁後,發現offset就是評論偏移數,offset就是(頁數-1)*20,total在第一頁是true,在其他頁是false。

到第二個參數為:010001。第三個參數為:00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7。第四個參數為:0CoJUm6Qyw8W8jud。

找到操作方法

接下來就要看window.asrsea()方法是什麼操作的了,通過查找JS文件可以看到這個:

通過研究i是隨機獲取的十六個字元,而b函數是AES加密,其中偏移量為0102030405060708,模式為CBC。看回d函數,其中params連續兩次加密,第一次加密時,文本為第一個參數,密鑰為第四個參數;第二次加密時文本為第一次加密的值,密鑰為隨機數a。而encSeckey是一個RSA加密,它的公鑰是第二個參數,模式是第三個參數,文本為那個隨機字元串a。

開始敲代碼

終於分析完了,下面開始敲代碼。先來個獲取第一頁評論的代碼,這是獲取兩個參數的類:

這是解析網易雲音樂和獲取評論的類:

但是一點擊運行,直接給我報了個錯:TypeError: can"t concat str to bytes。

原來是因為在第二次加密的時候,那個params是個byte類型,所以把它轉成字元串類型就可以了:

再次點擊運行,結果還是報錯了:json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)。

這個報錯是因為我的Json解析錯了,回頭調試一看,網頁返回的東西是空的,但它的狀態碼還是200。這是什麼鬼?

接著我再試了把那兩個參數的值直接複製和前面一樣看看,結果運行成功,這就說明是我的加密過程錯了。然後我就回去看了幾遍,仍沒有看出什麼錯誤,後來我上網百度找到了這個知乎文章https://zhuanlan.zhihu.com/p/32069543,我把她的代碼複製過來運行下,結果是可以的。我就繼續看看我和她的區別,原來我在用那個16個隨機字元的時候用錯了,對兩個參數給了兩個不同的,但其實是需要給同一個的。看到這裡,我就直接回去改了下,果然運行成功。效果如下:

獲取每一頁的評論

接著是獲取每一頁的評論。每一頁與第一個參數的offset有關,其中的公式為offse=(頁數-1)*20,total在第一頁是true,在其他頁是false。

而寫入資料庫我用的是我在這篇文章中寫到過的操作。由於篇幅過長,就不貼出來了,感興趣的可以去看看。

接下來點運行就可以了,但是運行到第八頁的時候出現了這個異常:

原因是這條評論有個識別不了的表情。之後參考其他文章,修改了資料庫的編碼方式,注意還要自己修改下創建資料庫時的編碼方式才可以!

這是首頁資料庫效果:

獲取完成(家駒的歌評論這麼少嗎?不解):

作者:sergiojune,一個熱愛折騰Python的學者。本文為作者投稿,首發於作者個人公眾號日常學python,版權歸對方所有。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

程序員:我們都在為錯誤買單!
年薪 700 萬也換不來區塊鏈開發者的一次回眸

TAG:CSDN |