NO IMAGE
非原創作品,轉載自:http://blog.csdn.net/marksinoberg/article/details/70809830

鎮樓圖(剛好遇見你--詞雲)

前言

網易雲音樂一直是我向往的“神壇“,聽音樂看到走心的評論的那一刻,高山流水。於是今天來抓取一下歌曲的熱門評論。並做成詞雲來展示,看看相對於這首歌最讓人有感受的評論內容是什麼。

做成詞雲的好處就是直觀以及美觀, 其他的我也想不出來有什麼了。

抓資料

要想做成詞雲,首先得有資料才行。於是需要一點點的爬蟲技巧。

  • 抓包分析
  • 加密資訊處理
  • 抓取熱門評論內容

抓包分析

使用Chrome控制檯。我們可以輕鬆的找到評論所在的連結。如下圖: 
抓包分析

現在URL算是找到了,下一步就是進行資料抓取了。但是簡單嘗試了一下,發現並不能獲取到詳細的資訊,而是返回了空空的字串。 
再次檢視hreaders的資訊,發現瀏覽器使用的是POST的方式進行的請求。具體欄位如下圖: 
具體POST欄位內容

加密資訊處理

然後經過我的測試,直接把瀏覽器上這倆資料拿過來就可以。但是要想真正的解決這個加密處理,還需要有點加解密的只是儲存。GitHub上有大牛分析了網易雲音樂的欄位加密的詳情。有興趣的可以參照下面的連結。

網易雲音樂新登入API分析

這裡我就使用這麼個臨時的方法好了,而且對於不同的歌曲是可以重用的。待會我們可以驗證一下。

抓取熱門評論內容

從第一步拿到了介面,而返回的資料就是一個JSON字串,獲取一下稍作處理即可使用。

# coding: utf8
# @Author: 郭 璞
# @File: 網易雲音樂歌曲熱門評論.py                                                                 
# @Time: 2017/4/26                                   
# @Contact: [email protected]
# @blog: http://blog.csdn.net/marksinoberg
# @Description: 熱門評論獲取
import requests
import json
def getcomments(musicid):
url = 'http://music.163.com/weapi/v1/resource/comments/R_SO_4_{}?csrf_token=5594eaee83614ea8ca9017d85cd9d1b3'.format(musicid)
payload = {
'params': '4hmFbT9ZucQPTM8ly/UA60NYH1tpyzhHOx04qzjEh3hU1597xh7pBOjRILfbjNZHqzzGby5ExblBpOdDLJxOAk4hBVy5/XNwobA JTFPiumSmVYBRFpizkWHgCGO OWiuaNPVlmr9m8UI7tJv0 NJoLUy0D6jd DnIgcVJlIQDmkvfHbQr/i9Sy SNSt6Ltq',
'encSecKey': 'a2c2e57baee7ca16598c9d027494f40fbd228f0288d48b304feec0c52497511e191f42dfc3e9040b9bb40a9857fa3f963c6a410b8a2a24eea02e66f3133fcb8dbfcb1d9a5d7ff1680c310a32f05db83ec920e64692a7803b2b5d7f99b14abf33cfa7edc3e57b1379648d25b3e4a9cab62c1b3a68a4d015abedcd1bb7e868b676'
}
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36',
'Referer': 'http://music.163.com/song?id={}'.format(musicid),
'Host': 'music.163.com',
'Origin': 'http://music.163.com'
}
response = requests.post(url=url, headers=headers, data=payload)
data = json.loads(response.text)
hotcomments = []
for hotcomment in data['hotComments']:
item = {
'nickname': hotcomment['user']['nickname'],
'content': hotcomment['content']
}
hotcomments.append(item)
# 返回熱門評論
return [content['content'] for content in hotcomments]
if __name__ == '__main__':
hot = getcomments(439915614)
print(hot)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

看下執行的結果吧。

['初戀很單純,跟她好了快一年了,終於帶她回家見家長。席間老媽不停的給她夾菜,“閨女,來,吃完了待會讓他送你回去”。女友可能是誤會我媽的意思了,立馬放下碗筷,一臉委屈“叔叔阿姨你們別趕我走,我是真心喜歡他的,我以後少吃點”。聽到女友說這句話,心瞬間化了。', '李玉剛合唱團已上線,女高音李玉剛、女低音李玉剛、男高音李玉剛、男低音李玉剛[大笑][大笑][大笑]', '2012年,那年大一,軍訓,我們相識。異鄉的冬天凍傷了她的初戀,我卻沒有理由給她一個安慰的擁抱。此後的日子我們依然是朋友,偶爾碰面寒暄,而後走散在洶湧的人潮。她又有了一個他,繼而凋謝。2015年,大三。我們一起散步,夜色的掩護下我向她表白了,她牽起我的手,哭著說:你終究說出來了。', '大學畢業後我去了北京,而她留在了老家,剛開始每天一個電話,後來越來越少,甚至斷了聯絡,直到兩年後的一次我坐火車回家,出了站之後看見她一個人站在外面,頭髮被風吹得很凌亂,看到我之後也沒有動,我放下行李過去把她抱住,她立馬大哭對我說我還以為你不要我了。那一刻起我就知道這輩子就是你。', '「剛」好「玉」見「李」', '96年離開家奔波闖蕩,06年星光大道讓全國觀眾認識了你,16年出道整十週年,你用十年時間向世界證明你不是當初那個初登央視舞臺稚嫩的李玉剛,你是歷經十年歲月積澱的玉先生,你是傳播傳統文化的先行者,你是擺脫桎梏追求藝術突破的追夢人  世界之大欣喜相逢 我們17日十週年演唱會見[親親]', '副歌有毒…畫室今天放了三遍[大哭]第一次聽這唱的什麼鬼…第二次感覺還不錯…第三次就開始中毒了拿起手機聽歌識曲,單曲迴圈走起[大哭]', '曾經和一個女人躺在同一個床上一整夜,不是戀人。什麼都沒幹,天南海北純侃純聊天。那天晚上我清唱了這首歌給她聽。早上起來後,感覺雙方之間親密指數成幾何增長到以前的n次方。現在,她是我的女人。再過幾個月就結婚了。初戀,感謝剛好遇見你', '高一遇見他,考試的時候一見鍾情,考試結束我去看了他桌子上的考號,他叫穆佳明,我喜歡他的名字,他去打球,不管多遠我都會跑過去,他生病,我跑去買藥,他運動會跑步,我去給他送水,用肚子暖好,我打針的時候知道他在附近打球,就跑過去,結果感冒加重,全世界都知道我很愛他,全世界都知道他不愛我', '相識7年,在一起卻才8個月,怪我當初沒有足夠的勇氣,沒想到你會為我堅持那麼久。感謝上天讓我剛好遇見你,是你的堅持讓我們最後能走在一起,希望你能在我的一生中留下漫長的回憶,我會珍惜這場來之不易的相遇。在今後的日子裡,讓我來給你走下去的勇氣,給我機會保護你、呵護你,劉小瘦我愛你。。。', '大一異地,我放假早回來坐在網咖打魔獸,這首歌被點播了N遍,腦袋裡有了簡單的旋律:因為我剛好遇見你。   晚上抱著手機互說晚安,夢裡夢到她了,現在剛醒,找到這首歌無限迴圈。  祝福所有異地戀終成眷屬。[愛心]', '我們哭了,我們笑著。[大哭]開口就已經淚流滿面,好懷念那段時光', '我用網易雲音樂,當初的信任給她買的手機,給她安裝了網易雲登入了我的帳號,可她不怎麼用,16年12月22號她送走了我,至今雖然不再聯絡就在昨天我突然發現我喜歡的音樂列表內多了一首歌就是這首《剛好遇見你》。', '因為我剛好遇見你 距離高考還有一百四十多天 和你成為同學大概一年多了 沒想到你居然偷偷喜歡了我很久 這次我們省模擬考總分一模一樣 要填模擬志願 你說大學的事就交給我了 你說我們可以去北方看雪吃火鍋 你說我喜歡的專業都不錯 你說我們很有緣 可是啊 最重要的那一句 你怎麼不說呢', '那年你18,我20。我去酒店實習,下班,剛好遇見你……我不相信一見鍾情,可你是例外。現在,我25,你23。感謝你,來我的世界,就不曾離開。明年,我們要結婚了']
  • 1
  • 1

詞雲

詞雲我使用的一個第三方庫Wordcloud,可以使用pip進行安裝。官網上有非常詳細而且清晰的案例可供參考,這裡就不重複的描述了。有興趣的參考下面的連結。 
https://amueller.github.io/word_cloud/auto_examples/index.html

下面就直接上程式碼好了。

但是官網也好,其他地方也罷,都沒有說對於中文的處理。然後我找啊找啊的,終於找到了解決辦法,那就是在WordCloud的構造方法上指定字型檔案的路徑。這樣就可以解決中文亂碼的問題了。具體設定如下:

WordCloud(random_state=1, font_path = r’C:/Users/Windows/fonts/simkai.ttf’)

# coding: utf8
# @Author: 郭 璞
# @File: 詞雲測試.py                                                                 
# @Time: 2017/4/26                                   
# @Contact: [email protected]
# @blog: http://blog.csdn.net/marksinoberg
# @Description: 詞雲測試
from wordcloud import WordCloud
from temp import 網易雲音樂歌曲熱門評論 as hot
text = " ".join(hot.getcomments(439915614))
wordcloud = WordCloud(random_state=1, font_path = r'C:/Users/Windows/fonts/simkai.ttf').generate(text)
import matplotlib.pyplot as plt
plt.figure()
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

詞雲執行效果

最後來對比一下執行的效果。 
網易雲歌曲熱門評論詞雲

總結

最後來回顧一下,文章針對網易雲音樂的熱門評論做了爬取,並通過詞雲生成器製作出了相對應的詞雲。

可以拓展的地方:

  • 詞雲mask,支援特定背景的詞雲生成
  • 熱門評論批量爬取,只需要獲取對應歌曲的ID即可。
  • 封裝起來,提取介面,對外界提供熱評服務,或者詞雲生成服務。
  • … …