python3.x爬取網(wǎng)易云音樂(lè)評(píng)論

在簡(jiǎn)單學(xué)習(xí)了python爬蟲后,又想繼續(xù)折騰,進(jìn)而找到了這個(gè)網(wǎng)易云音樂(lè),因?yàn)楸救似綍r(shí)就是用它聽(tīng)的歌,也喜歡看歌里的評(píng)論,所以就爬網(wǎng)易云音樂(lè)評(píng)論吧,那么開(kāi)始吧!

正式進(jìn)入主題

首先還是去找目標(biāo)網(wǎng)頁(yè)并開(kāi)始分析網(wǎng)頁(yè)結(jié)構(gòu),如下

上面的三個(gè)箭頭都是所要找的數(shù)據(jù),分別是評(píng)論用戶,評(píng)論和點(diǎn)贊數(shù),都可以用正則表達(dá)式找出來(lái),接下來(lái)繼續(xù)找怎樣找到下一頁(yè)的數(shù)據(jù),還是用開(kāi)發(fā)者工具,但是當(dāng)點(diǎn)擊下一頁(yè)的時(shí)候,網(wǎng)頁(yè)的url沒(méi)有變,說(shuō)明網(wǎng)頁(yè)是動(dòng)態(tài)加載,所以就不能在當(dāng)前網(wǎng)頁(yè)找數(shù)據(jù)了,應(yīng)該在他的xhr文件里找,所以點(diǎn)入network看看,然后也點(diǎn)擊下一頁(yè)一看,果然有想要的

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

一點(diǎn)擊運(yùn)行,結(jié)果什么東西都沒(méi)有,但是他的狀態(tài)碼是200,明顯請(qǐng)求成功啊,卻沒(méi)有東西返回,再去network仔細(xì)看看這個(gè)網(wǎng)頁(yè),看到他是個(gè)post請(qǐng)求,也看到了需要post兩個(gè)參數(shù)params和ensSecKey

一看到這個(gè),密密麻麻的數(shù)字和字母,就猜應(yīng)該是被加密了,不過(guò)可以復(fù)制下來(lái)看看有沒(méi)有用。接下來(lái)看下他的Response,咦,這是個(gè)json,不是html結(jié)構(gòu)的,所以需要用到Json庫(kù)來(lái)進(jìn)行解析

現(xiàn)在開(kāi)始敲代碼吧,先把上面的兩個(gè)參數(shù)復(fù)制過(guò)來(lái)看看。

現(xiàn)在把每條評(píng)論的評(píng)論用戶和點(diǎn)贊數(shù)和評(píng)論獲取出來(lái)

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

看到剛才那個(gè)網(wǎng)站的發(fā)起者core.js,,然后把它文件下載下來(lái)慢慢研究

保存后在經(jīng)過(guò)美化,然后進(jìn)行查找那個(gè)encSecKey參數(shù)(ps:JSj'e'tong'yang'de美化網(wǎng)址為http://www.css88.com/tool/js_beautify/),然后找到這個(gè)

看到window.asrsea()方法有四個(gè)參數(shù),先不去管這個(gè)函數(shù),先看看他的四個(gè)參數(shù)是什什,這里沒(méi)必要去研究那四個(gè)參數(shù)怎樣來(lái)的,只需要知道他是什么,那么我們可以加點(diǎn)代碼上去讓他顯示出來(lái),從而利用fiddler來(lái)進(jìn)行調(diào)試

加入代碼如下

可以分別獲取上面的每一個(gè)參數(shù),也把那個(gè)params獲取看看,然后在fiddler上操作如下

完成上面的設(shè)置后刷新網(wǎng)頁(yè)就可以在console上面找到參數(shù)信息,如果沒(méi)有的話這是因?yàn)槟阒盀g覽該網(wǎng)頁(yè)的時(shí)候它被緩存了下來(lái),所以要清除緩存文件(在清除瀏覽器記錄里面有)

那個(gè)rid有本歌曲的id,明顯是與評(píng)論有關(guān)的,我試著連翻幾頁(yè)后,發(fā)現(xiàn)那個(gè)offset就是評(píng)論偏移數(shù),offset就是(頁(yè)數(shù)-1)*20,total在第一頁(yè)是true,在其他頁(yè)是false

同樣的方法也得到第二個(gè)參數(shù)為:010001

第三個(gè)參數(shù)為:00e0b509f6259df8642dbc35662901477df22677ec152b5ff68ace615bb7b725152b3ab17a876aea8a5aa76d2e417629ec4ee341f56135fccf695280104e0312ecbda92557c93870114af6c9d05c4f7f0c3685b7a46bee255932575cce10b424d813cfe4875d3e82047b97ddef52741d546b8e289dc6935b3ece0462db0a22b8e7

第四個(gè)參數(shù)為:0CoJUm6Qyw8W8jud

接下來(lái)就要看window.asrsea()方法是什么操作的了,還是通過(guò)查找js文件可以看到這個(gè)

通過(guò)研究i是隨機(jī)獲取十六個(gè)字符而b函數(shù)是AES加密,其中偏移量為0102030405060708,模式為CBC,看回d函數(shù),其中params連續(xù)兩次加密,第一次加密時(shí),文本為第一個(gè)參數(shù)。密鑰為第四個(gè)參數(shù),第二次加密時(shí)文本為第一次加密的值,密鑰為隨機(jī)數(shù)a。而encSeckey是一個(gè)RSA加密,他的公鑰是第二個(gè)參數(shù),模式是第三個(gè)參數(shù),文本為那個(gè)隨機(jī)字符串a(chǎn)

終于分析完了,接著開(kāi)始敲代碼

先來(lái)個(gè)獲取第一頁(yè)評(píng)論的代碼

這是獲取兩個(gè)參數(shù)的類

這是解析網(wǎng)易云音樂(lè)和獲取評(píng)論的類

然而一點(diǎn)擊運(yùn)行,直接給我報(bào)了個(gè)錯(cuò):TypeError: can't concat str to bytes

原來(lái)是因?yàn)樵诘诙渭用艿臅r(shí)候,那個(gè)params是個(gè)byte類型,所以把他轉(zhuǎn)成字符串類型就可以了

再次點(diǎn)擊運(yùn)行,結(jié)果還是報(bào)錯(cuò)了:json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

這個(gè)報(bào)錯(cuò)因?yàn)槲业膉son解析錯(cuò)了,回頭調(diào)試一看,網(wǎng)頁(yè)返回的東西是空的,但他的狀態(tài)碼是200,這是什么鬼?接著我再試了把那兩個(gè)參數(shù)的值直接復(fù)制和前面一樣看看,結(jié)果運(yùn)行成功,這就說(shuō)明我的是加密過(guò)程錯(cuò)了,然后我就回去看了幾篇,看不出什么錯(cuò)誤,上網(wǎng)百度找到了這個(gè)知乎文章https://zhuanlan.zhihu.com/p/32069543,我把她的代碼復(fù)制過(guò)來(lái)運(yùn)行下,結(jié)果是可以的,我就繼續(xù)看看我和她的區(qū)別,原來(lái)我在用那個(gè)16個(gè)隨機(jī)字符的時(shí)候用錯(cuò)了,我在兩個(gè)參數(shù)給了兩個(gè)不同的,而是需要給共同一個(gè)的,看到這里,我就直接回去改了下,果然運(yùn)行成功,代碼我就不貼出來(lái)了,效果如下

接著是獲取每一頁(yè)的評(píng)論,而每一頁(yè)與第一個(gè)參數(shù)的offset有關(guān),其中的公式為offse=(頁(yè)數(shù)-1)*20,total在第一頁(yè)是true,在其他頁(yè)是false

而寫入數(shù)據(jù)庫(kù)我用的是我這篇文章的操作

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

,由于篇幅過(guò)長(zhǎng),就不貼出來(lái)了,感興趣的可以去看看

接下來(lái)點(diǎn)運(yùn)行就可以了,但是運(yùn)行到第八頁(yè)的時(shí)候出現(xiàn)了這個(gè)異常

raise errorclass(errno, errval)

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

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

這是首頁(yè)數(shù)據(jù)庫(kù)效果

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

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

大家有什么問(wèn)題的話歡迎去我的公眾號(hào)日常學(xué)python的后臺(tái)那里問(wèn)我,我知道的我都一一為你解答,最后,若你也在這篇文章學(xué)到了,可以幫我點(diǎn)個(gè)贊,轉(zhuǎn)發(fā)下嗎?謝謝支持哈!

ps:若需要完整代碼可以在我的公眾號(hào)日常學(xué)python后臺(tái)回復(fù)評(píng)論即可獲取,還有其他福利以后會(huì)一一分析


日常學(xué)python
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,825評(píng)論 25 709
  • 用過(guò)很多播放器,之前一直是酷我,偶爾QQ。但是網(wǎng)易云音樂(lè)出來(lái)后毅然變成了他的忠實(shí)用戶。精確推薦和樂(lè)評(píng)都很贊!安利了...
    聽(tīng)城閱讀 2,598評(píng)論 1 5
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,511評(píng)論 19 139
  • 草舍清溪閱讀 348評(píng)論 0 0
  • 原料:韭黃,雞蛋;生抽,鹽,料酒。 1.先單炒雞蛋,事先在打好的雞蛋里放點(diǎn)料酒; 2.油里放鹽,放韭黃炒; 3.加...
    WendyLoveGod閱讀 144評(píng)論 0 0

友情鏈接更多精彩內(nèi)容