python3.x爬取網易云音樂評論

在簡單學習了python爬蟲后,又想繼續折騰,進而找到了這個網易云音樂,因為本人平時就是用它聽的歌,也喜歡看歌里的評論,所以就爬網易云音樂評論吧,那么開始吧!

正式進入主題

首先還是去找目標網頁并開始分析網頁結構,如下

上面的三個箭頭都是所要找的數據,分別是評論用戶,評論和點贊數,都可以用正則表達式找出來,接下來繼續找怎樣找到下一頁的數據,還是用開發者工具,但是當點擊下一頁的時候,網頁的url沒有變,說明網頁是動態加載,所以就不能在當前網頁找數據了,應該在他的xhr文件里找,所以點入network看看,然后也點擊下一頁一看,果然有想要的

看到這里,就興奮地去敲代碼了

一點擊運行,結果什么東西都沒有,但是他的狀態碼是200,明顯請求成功啊,卻沒有東西返回,再去network仔細看看這個網頁,看到他是個post請求,也看到了需要post兩個參數params和ensSecKey

一看到這個,密密麻麻的數字和字母,就猜應該是被加密了,不過可以復制下來看看有沒有用。接下來看下他的Response,咦,這是個json,不是html結構的,所以需要用到Json庫來進行解析

現在開始敲代碼吧,先把上面的兩個參數復制過來看看。

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

可以看到,利用json.loads()方法把數據轉成python格式里的字典后就可以把想要的數據取出來了,但是,下一頁怎樣取?總不能每次都復制粘貼那兩個參數吧?那唯一的方法就是不爬了。。怎么可能?我的繼續,那我就要進行破解這兩個參數了,那好繼續看network,因為要加密,肯定要用js進行加密的

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

保存后在經過美化,然后進行查找那個encSecKey參數(ps:JSj'e'tong'yang'de美化網址為http://www.css88.com/tool/js_beautify/),然后找到這個

看到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

而寫入數據庫我用的是我這篇文章的操作

http://mp.weixin.qq.com/s/6sQ_ER39P2NtXaPOnGdQNA

,由于篇幅過長,就不貼出來了,感興趣的可以去看看

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

raise errorclass(errno, errval)

pymysql.err.InternalError: (1366, "Incorrect string value: '\\xF0\\x9F\\x92\\x94' for column 'content' at row 1")

原因是這條評論有個識別不了的表情,之后百度參考這篇文章http://blog.csdn.net/HHTNAN/article/details/76769264?locationNum=9&fps=1修改了數據庫的編碼方式,注意還要自己修改下創建數據庫時的編碼方式才可!

這是首頁數據庫效果

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

終于完成了,雖然辛苦,但是值得,在這個過程中也學會了很多東西,在寫這篇文章時參考了兩篇文章,一個是知乎首個回答https://www.zhihu.com/question/36081767/answer/140287795,另一個就是解密過程https://github.com/cosven/cosven.github.io/issues/30

大家有什么問題的話歡迎去我的公眾號日常學python的后臺那里問我,我知道的我都一一為你解答,最后,若你也在這篇文章學到了,可以幫我點個贊,轉發下嗎?謝謝支持哈!

ps:若需要完整代碼可以在我的公眾號日常學python后臺回復評論即可獲取,還有其他福利以后會一一分析


日常學python
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,284評論 25 708
  • 用過很多播放器,之前一直是酷我,偶爾QQ。但是網易云音樂出來后毅然變成了他的忠實用戶。精確推薦和樂評都很贊!安利了...
    聽城閱讀 2,463評論 1 5
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,923評論 18 139
  • 草舍清溪閱讀 315評論 0 0
  • 原料:韭黃,雞蛋;生抽,鹽,料酒。 1.先單炒雞蛋,事先在打好的雞蛋里放點料酒; 2.油里放鹽,放韭黃炒; 3.加...
    WendyLoveGod閱讀 130評論 0 0