我分析了10萬條陳奕迅新歌《我們》的熱門評論,竟發現這么一個秘密
最近有一部“懷舊”題材的電影,未播先火,那就是劉若英的處女作——《后來的我們》。
青春,愛情,夢想,一直是“懷舊”題材的核心要素,雖然電影現在還未上映,但先行發布的主題曲《我們》,已經虐哭了不少人。在 MV 里,歌聲清清淺淺,訴說著那些年關于愛情里的遺憾。
“我最大的遺憾,就是你的遺憾,與我有關”,下面就一起來感受一下吧。
這首歌是《后來的我們》中的主題曲,網易云音樂上線當天便席卷千萬+播放量,現如今光是網易云上面的評論就馬上突破了 10 萬條。
網易云音樂一直是我們向往的“神壇“,聽音樂看到走心的評論的那一刻,高山流水遇知音。
于是本文作者抓取了這首歌曲的熱門評論,并做成圖表、詞云來展示,看看相對于這首歌最讓人有感受的評論內容是什么。
抓數據
要想做成詞云圖表,首先得有數據才行,這里需要一點點的爬蟲技巧。
基本思路為:
- 抓包分析
- 加密信息處理
- 抓取熱門評論信息
抓包分析
我們首先用瀏覽器打開網易云音樂的網頁版,進入陳奕迅《我們》歌曲頁面,可以看到下面有評論。接著 F12 進入開發者控制臺(審查元素)。
下面要做的是,找到歌曲評論對應的 url,并分析驗證其數據跟網頁現實的數據是否吻合,步驟如下圖:
通過歌曲 id 輕松找到評論所在的鏈接
查看 hreaders 的信息,發現瀏覽器使用的是 POST 的方式進行的請求
具體字段如上圖,會發現表單中需要填兩個數據,名稱為 params 和 encSecKey。
后面緊跟的是一大串字符,換幾首歌會發現,每首歌的 params 和 encSecKey 都是不一樣的。因此,這兩個數據可能是經過一個特定的算法進行加密過的。
服務器返回的和評論相關的數據為 json 格式,里面含有非常豐富的信息(比如有關評論者的信息,評論日期,點贊數,評論內容等等),其中 hotComments 就是我們要找的熱門評論,總共 15 條。
那我們的思路就很清晰了,只需要分析這個 api 并模擬發送請求,獲取 json 進行解析就好了。
加密信息處理
經過我的測試,直接把瀏覽器上這倆數據拿過來就可以。但是要想真正的解決這個加密處理,還需要有點加解密的只是存儲。
關于這兩個參數如何解密,強大的知乎上其實已經有了答案的,感興趣的朋友可以進去看一下:《如何爬網易云音樂的評論數?》https://www.zhihu.com/question/36081767
我們在這里就只需要用我們這種偷懶的辦法就可以完成需求了。這里我就使用這么個臨時的方法好了,而且對于不同的歌曲是可以重用的,待會我們可以驗證一下。
抓取熱門評論信息
代碼塊如下:
- import requests
- import json
- url = 'http://music.163.com/weapi/v1/resource/comments/R_SO_4_551816010?csrf_token=568cec564ccadb5f1b29311ece2288f1'
- headers = {
- 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36',
- 'Referer':'http://music.163.com/song?id=551816010',
- 'Origin':'http://music.163.com',
- 'Host':'music.163.com'
- }
- #加密數據,直接拿過來用
- user_data = {
- 'params': 'vRlMDmFsdQgApSPW3Fuh93jGTi/ZN2hZ2MhdqMB503TZaIWYWujKWM4hAJnKoPdV7vMXi5GZX6iOa1aljfQwxnKsNT+5/uJKuxosmdhdBQxvX/uwXSOVdT+0RFcnSPtv',
- 'encSecKey': '46fddcef9ca665289ff5a8888aa2d3b0490e94ccffe48332eca2d2a775ee932624afea7e95f321d8565fd9101a8fbc5a9cadbe07daa61a27d18e4eb214ff83ad301255722b154f3c1dd1364570c60e3f003e15515de7c6ede0ca6ca255e8e39788c2f72877f64bc68d29fac51d33103c181cad6b0a297fe13cd55aa67333e3e5'
- }
- response = requests.post(url,headers=headers,data=user_data)
- data = json.loads(response.text)
- hotcomments = []
- for hotcommment in data['hotComments']:
- item = {
- 'nickname':hotcommment['user']['nickname'],
- 'content':hotcommment['content'],
- 'likedCount':hotcommment['likedCount']
- }
- hotcomments.append(item)
- #獲取評論用戶名,內容,以及對應的獲贊數
- content_list = [content['content'] for content in hotcomments]
- nickname = [content['nickname'] for content in hotcomments]
- liked_count = [content['likedCount'] for content in hotcomments]
數據可視化
在獲得相關評論數據后,我們將其做成圖表與詞云圖,將讓人看起來更直觀。
接下來需要在自己電腦上安裝需要的安裝包: pyecharts(圖表包)、matplotlib(繪圖功能包)、 WordCloud(詞云包)。其中,pyecharts 是一個用于生成 Echarts 圖表的類庫。
Echarts 是百度開源的一個數據可視化 JS 庫,主要用于數據可視化,同時 pyecharts 兼容 Python2 和 Python3。
安裝非常簡單,只需:
- pip install pyecharts
關于 WordCloud(詞云包)安裝過程中會出現的一些問題,我這里總結了一下分享給大家。
看到別人使用 WordCloud 可以方便地生成云詞圖,在數據可視化的方面會給我們帶來很多便利。然而實際操作起來才發現,初學者還是容易遇到很多坑。
說明:已安裝(Python 3.6.1)、系統為Windows 7
安裝文件的獲取
首先,按 win+r,輸入 cmd,如下圖:
然后,輸入如下代碼:
- pip install wordcloud
結果呢?會報錯的,會有文件缺失的問題。這一點不少人都有類似反饋。
于是在官網,看到這么一張圖,靈機一動:
解決方案:在 Github 下載 WordCloud 的包,解壓縮后,在對應目錄下用 python setup.py install 安裝。
操作如下圖,進入剛才解壓后的文件夾中,同時按住 shift+ 鼠標右鍵,啟動 cmd。
安裝 WordCloud 時出現報錯信息:error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build Tools”: http://landinghub.visualstudio.com/visual-cpp-build-tools
這種情況下,直接跟著提示內容進行就好。
解決方案:打開報錯提示中的鏈接,下載并安裝 Visual C++ 2015 Build Tools。
安裝完 WordCloud 后,接下來就是代碼的實現,利用之前獲得評論用戶名和對應的點贊數,將其制作成圖表圖:
- from pyecharts import Bar
- bar = Bar("熱評中點贊數示例圖")
- bar.add( "點贊數",nickname, liked_count, is_stack=True,mark_line=["min", "max"],mark_point=["average"])
- bar.render()
由此可以看出,獲得最高贊數(95056)評論的是:
@魚大叔Uncle:后來的我,離開了他,永遠的離開了他,十年的感情不過寥寥幾句話。后來的我,嫁給了一個很普通的人,沒有他的浪漫,卻有不一樣的溫暖。
大多數贊數為 20000-30000 之間,最低都達到 7000+,(基本與網頁里評論中數據吻合)。
最后,我們將所有的熱門評論內容,制作成詞云圖展示出來,代碼塊如下:
- from wordcloud import WordCloud
- import matplotlib.pyplot as plt
- content_text = " ".join(content_list)
- wordcloud = WordCloud(font_path=r"C:\simhei.ttf",max_words=200).generate(content_text)
- plt.figure()
- plt.imshow(wordcloud,interpolation='bilinear')
- plt.axis('off')
- plt.show()
詞云分析結果圖如下:
從圖中可以看出,很多人感慨,后來只有你我,再無我們。(注明:所有數據,是屬于當時所爬取的數據)
后記
曾記得,郭敬明在書里寫,“我們太年輕,以致于都不知道以后的時光,竟然那么長,長得足夠讓我忘記你,足夠讓我重新喜歡一個人,就像當初喜歡你那樣。”
我們這一生,總是遇到太多的后來。從不懂愛到懂愛,從擁有到珍惜。
所幸是到了最后,無論過了多少年。后來的我們,都在對方身上,學會了如何去愛。
就像陳奕迅在歌里唱的,“有過執著,放下執著”。有些人啊,光是遇見就已經值得了。
我們確實沒有了后來。
就讓后來的我們,慢慢走,別回頭。
不談虧欠,感謝遇見。
只是在下一次遇見愛的時候,我們都要學會更懂得珍惜。
這才是愛的意義,也是我們為什么去愛。