午飯過后準(zhǔn)備看看書,寫寫詩(這么說是不是顯得太裝逼米碰。谷丸。堡掏。)
打開網(wǎng)易云音樂(這不是做廣告,網(wǎng)易沒有給我錢)刨疼,被推薦了一首《Nothing's Gonna Change My Love For You》泉唁,對(duì),你沒看錯(cuò)揩慕,就是這首很經(jīng)典的歌亭畜。作為曾經(jīng)向小伙伴們安利過網(wǎng)易云的我怎么能不看歌曲評(píng)論(又在裝逼)。
被感動(dòng)的稀里嘩啦迎卤,欲語淚流 拴鸵。。。想起了自己的那段故事劲藐,此情此景再也抑制不住內(nèi)心的那股洪流八堡,于是靜靜的敲起那些深藏在腦海深處的記憶(賤人就是矯情)
不知道你有沒有發(fā)現(xiàn)聘芜,我還是很有才華的(其實(shí)是憋了好久才寫出來的)秕重。
就這樣,拖著腮厉膀,靜靜地發(fā)呆(別問我靜靜是誰),二拐,服鹅,沉寂在這首音樂里,永遠(yuǎn)都不想醒來百新。企软。。
額 額 額饭望。仗哨。。好像扯遠(yuǎn)了铅辞,背景鋪墊完畢厌漂,開始進(jìn)入主題。
網(wǎng)易云音樂每首歌都會(huì)有唯一的ID號(hào)斟珊,在網(wǎng)頁端的網(wǎng)易云音樂里搜索一首歌可以看到瀏覽器地址欄是這樣的
這首歌id號(hào)27955655 對(duì)應(yīng)的是薛之謙的 《我想起你了》 苇倡。頁面往下拉可以看到評(píng)論,分為精彩評(píng)論和最新評(píng)論兩部分囤踩。
我們想抓取用戶評(píng)論的信息除了要知道歌曲ID號(hào)還要知道評(píng)論信息的api地址旨椒。這時(shí)候就要看瀏覽器后臺(tái)了,我用的是Chrome瀏覽器堵漱,F(xiàn)12進(jìn)入后臺(tái)(其他瀏覽器進(jìn)入后臺(tái)的方式你自己找)综慎。點(diǎn)擊Network并重新刷新瀏覽器。這時(shí)會(huì)看到一堆網(wǎng)絡(luò)請(qǐng)求勤庐,經(jīng)過分析示惊,可以發(fā)現(xiàn)下面這個(gè)就是請(qǐng)求用戶評(píng)論的url
我們點(diǎn)擊它就會(huì)看到瀏覽器解析出的具體數(shù)據(jù),如下圖
看到那個(gè)hotComments和comments了嗎埃元? 哈哈涝涤,這正是我們所需要的數(shù)據(jù)。
現(xiàn)在我們把上面的url地址直接復(fù)制出來放入瀏覽器的地址導(dǎo)航欄中然后回車岛杀。理論上這時(shí)候用戶的評(píng)論信息應(yīng)該會(huì)顯示出來阔拳,但是卻是什么都沒有,心都涼了。
不要?dú)怵H糊肠,繼續(xù)分析辨宠。
我們發(fā)現(xiàn)上面那個(gè)url請(qǐng)求的請(qǐng)求頭是這樣的。
它采用的是post的方式货裹,而且里面還有一堆數(shù)據(jù)嗤形,而我們直接把這個(gè)url放到地址欄中請(qǐng)求是get方式,且不說方式不對(duì)弧圆,就是請(qǐng)求頭里面一堆數(shù)據(jù)你沒有赋兵,人家網(wǎng)易的服務(wù)器也不認(rèn)識(shí)你呀。于是我們只能通過代碼的方式去驗(yàn)證了搔预。
我們把正確的請(qǐng)求頭拷貝出來放到我們自己定義的對(duì)象中霹期。然后程序發(fā)請(qǐng)求時(shí)把這個(gè)對(duì)象傳進(jìn)去不就行了嗎??
然后我們把http模塊導(dǎo)入進(jìn)來之后就可以寫請(qǐng)求函數(shù)然后發(fā)請(qǐng)求了拯田,但是历造,但是, 但是船庇。重要的事情說三遍吭产,數(shù)據(jù)并沒有回來,就這樣糾結(jié)了好久鸭轮,后來發(fā)現(xiàn)網(wǎng)易把數(shù)據(jù)加密了臣淤,這樣我們就需要解密。這時(shí)發(fā)現(xiàn)正確的請(qǐng)求頭下面有兩個(gè)參數(shù)
對(duì)窃爷,你沒有看錯(cuò)荒典,就是這個(gè)坑,他就是秘鑰吞鸭。
有了秘鑰我們就可以用它來解密了寺董,我們把它拷貝到我們自己定義的對(duì)象中并格式化成url參數(shù)形式,然后傳入請(qǐng)求函數(shù)就好了
下面開始寫請(qǐng)求函數(shù)了刻剥,我們這里傳入三個(gè)參數(shù)遮咖,第一個(gè)是歌曲的ID(songID),第二個(gè)是我們上面定義的請(qǐng)求頭(option)造虏,第三個(gè)是我們上面定義的秘鑰(postData)御吞。
其中的printInfo是向控制臺(tái)輸出相關(guān)信息漓藕。writeFile是將數(shù)據(jù)寫入我們本地的文件中陶珠。
然后我們執(zhí)行這個(gè)函數(shù) ,就可以在控制臺(tái)看到數(shù)據(jù)了享钞,程序執(zhí)行結(jié)束后會(huì)看到生成了一個(gè)data.json文件揍诽,這里面存儲(chǔ)的就是我們請(qǐng)求回來的數(shù)據(jù)。
但是只抓取一首歌曲怎么夠,最后我們?cè)賹懸粋€(gè)循環(huán)暑脆,用來獲取其他歌曲的評(píng)論信息渠啤。
這里我們從ID號(hào)為2080326開始,循環(huán)請(qǐng)求了100個(gè)ID號(hào)添吗,也就是說我們想抓取100首歌的評(píng)論信息沥曹。但是結(jié)果是這樣的。
可以看到碟联,只抓到了21首歌曲的信息妓美,我們明明循環(huán)了100次啊,這是怎么回事鲤孵?經(jīng)過分析部脚,原因有2種。
? ? 1.我們?cè)谏厦娴拇a中寫道if(resData.total == 0) return;這樣的話那些沒有評(píng)論的歌曲就被我們忽略了裤纹。
? ? 2.歌曲的ID號(hào)并不是連續(xù)的,也就是說這100個(gè)ID里有很多是空的丧没,并沒對(duì)應(yīng)到任何歌曲鹰椒。我們隨便找一個(gè)該區(qū)間內(nèi)沒有打印出來的ID號(hào)試一下(我試的是http://music.163.com/#/song?id=2080412),結(jié)果真的沒有相應(yīng)歌曲呕童。但是歌曲到底是怎么分配ID號(hào)的漆际,我是真不知道,估計(jì)只有網(wǎng)易云的人才知道吧夺饲。
我們?cè)倏纯瓷傻膁ata.json文件里的內(nèi)容對(duì)不對(duì)奸汇,打開之后先格式化然后直接拉到最后,如下圖:
可以看到也是21首往声,并且ID號(hào)也是相同的擂找。
至此大功告成。
注意:?
1. 網(wǎng)易云音樂的歌曲ID并不是連續(xù)的浩销,具體ID號(hào)是怎么的排列我也不知道贯涎。大家不要太貪心,玩玩就好慢洋,不要使勁得抓人家的數(shù)據(jù)塘雳,否則網(wǎng)易把你的號(hào)給封了就尷尬了。
2. 我用的node環(huán)境是6.10.0版普筹,建議用最新的穩(wěn)定版本败明。也可以和我保持同步。win平臺(tái)上安裝:官方下載后直接傻瓜式“下一步”就好了太防。如果你裝了nvm的話可以在線安裝不同版本妻顶,nvm可以很方便在各個(gè)版本中切換,具體怎么安裝、使用nvm可以在網(wǎng)上找資料盈包,也可以找我探討沸呐。
3. 代碼中用到了部分ES6的語法,只是用到了幾個(gè)基礎(chǔ)的node 自帶包呢燥。其他的我也不會(huì)崭添。
4. 代碼托管到github。https://github.com/havenxie/webcrawler-neteast-music ?請(qǐng)不要用來干壞事叛氨。
5. 使用方式見github