在簡單學習了python爬蟲後,又想繼續折騰,進而找到了這個網易雲音樂,由於本人平時就是用它聽的歌,也喜歡看歌裏的評論,因此就爬網易雲音樂評論吧,那麼開始吧!css
正式進入主題html
首先仍是去找目標網頁並開始分析網頁結構,以下python
上面的三個箭頭都是所要找的數據,分別是評論用戶,評論和點贊數,均可以用正則表達式找出來,接下來繼續找怎樣找到下一頁的數據,仍是用開發者工具,可是當點擊下一頁的時候,網頁的url沒有變,說明網頁是動態加載,因此就不能在當前網頁找數據了,應該在他的xhr文件裏找,因此點入network看看,而後也點擊下一頁一看,果真有想要的mysql
看到這裏,就興奮地去敲代碼了git
一點擊運行,結果什麼東西都沒有,可是他的狀態碼是200,明顯請求成功啊,卻沒有東西返回,再去network仔細看看這個網頁,看到他是個post請求,也看到了須要post兩個參數params和ensSecKeygithub
一看到這個,密密麻麻的數字和字母,就猜應該是被加密了,不過能夠複製下來看看有沒有用。接下來看下他的Response,咦,這是個json,不是html結構的,因此須要用到Json庫來進行解析正則表達式
如今開始敲代碼吧,先把上面的兩個參數複製過來看看。sql
如今把每條評論的評論用戶和點贊數和評論獲取出來數據庫
能夠看到,利用json.loads()方法把數據轉成python格式裏的字典後就能夠把想要的數據取出來了,可是,下一頁怎樣取?總不能每次都複製粘貼那兩個參數吧?那惟一的方法就是不爬了。。怎麼可能?個人繼續,那我就要進行破解這兩個參數了,那好繼續看network,由於要加密,確定要用js進行加密的json
看到剛纔那個網站的發起者core.js,,而後把它文件下載下來慢慢研究
保存後在通過美化,而後進行查找那個encSecKey參數(ps:JSj'e'tong'yang'de美化網址爲www.css88.com/tool/js_bea…
看到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
而寫入數據庫我用的是我這篇文章的操做
,因爲篇幅過長,就不貼出來了,感興趣的能夠去看看
接下來點運行就能夠了,可是運行到第八頁的時候出現了這個異常
raise errorclass(errno, errval)
pymysql.err.InternalError: (1366, "Incorrect string value: '\xF0\x9F\x92\x94' for column 'content' at row 1")
緣由是這條評論有個識別不了的表情,以後百度參考這篇文章blog.csdn.net/HHTNAN/arti…
這是首頁數據庫效果
獲取完成(家駒的歌評論這麼少嗎?不解)
終於完成了,雖然辛苦,可是值得,在這個過程當中也學會了不少東西,在寫這篇文章時參考了兩篇文章,一個是知乎首個回答www.zhihu.com/question/36…
文章首發於公衆號[平常學python],歡迎掃取下方二維碼關注我觀看更多精彩文章