1. 程式人生 > 實用技巧 >Python爬取10000條“爆款劇”——《三十而已》熱評,並做視覺化

Python爬取10000條“爆款劇”——《三十而已》熱評,並做視覺化

前言

繼《隱祕的角落》後,又一部“爆款劇”——《三十而已》獲得了口碑收視雙豐收,王漫妮、顧佳、鍾曉芹三個女主角的故事線頻頻登上微博熱搜。該劇於2020年7月17日在東方衛視首播,並在騰訊視訊同步播出。為了瞭解吃瓜群眾們對這部劇的看法,我爬了爬騰訊視訊關於這部劇的評論,並做了簡單文字視覺化分析。

PS:如有需要Python學習資料的小夥伴可以加下方的群去找免費管理員領取

可以免費領取原始碼、專案實戰視訊、PDF檔案等

一、資料獲取

1.分析評論頁面

騰訊視訊評論要點選檢視更多評論才能載入更多資料,很明顯是一個動態網頁,評論內容使用了Ajax動態載入技術。因此,我們需要找到真實URL,然後再請求資料。

找到真實URL其實不難,按照以下步驟即可找到。當然,你也可以使用抓包工具fiddler,同樣可以輕鬆找到。

2.尋找引數規律

我們多重新整理幾次,找幾個真實的URL看看這些引數有什麼變化。下圖是我重新整理了3次得到的真實的URL:

第1次重新整理:
https://video.coral.qq.com/varticle/5572751505/comment/v2?callback=_varticle5572751505commentv2&orinum=10&oriorder=o&pageflag=1&cursor=6689895369036463828&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=132&_=1595994099261

第2次重新整理:
https:
//video.coral.qq.com/varticle/5572751505/comment/v2?callback=_varticle5572751505commentv2&orinum=10&oriorder=o&pageflag=1&cursor=6689950633282796870&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=132&_=1595994099262 第3次重新整理: https://video.coral.qq.com/varticle/5572751505/comment/v2?callback=_varticle5572751505commentv2&orinum=10&oriorder=o&pageflag=1&cursor=6690046095919619518&scorecursor=0&orirepnum=2&reporder=o&reppageflag=1&source=132&_=1595994099263

很顯然,只有cursor=?和_=?有變化,_=?為公差為1的等差數列,而cursor=?貌似沒有什麼規律。根據以往經驗,這類引數有可能藏在上一個真實URL中。我們嘗試將第1個URL在瀏覽器中開啟,然後搜尋第2個真實URL的中的cursor值。

還真有!一般情況下,我們還要多試幾次,對我們的猜想進行驗證。既然規律已經找到,接下來就很簡單了。限於篇幅,以下給出部分程式碼:

def main():
    #初始頁面的_=?
    page=1595991084333
    #初始待重新整理頁面的cursor=?
    lastId="0"
    for i in range(1,1000):
        time.sleep(1)
        html = get_content(page,lastId)
        #獲取評論資料
        commentlist=get_comment(html)
        print("------第"+str(i)+"輪頁面評論------")
        k = 0
        for j in range(1,len(commentlist)):
            comment = commentlist[j]
            k += 1
            print('第%s條評論:%s'%(k,comment))
        #獲取下一輪重新整理頁ID
        lastId=get_lastId(html)
        page += 1

if __name__ == '__main__':
    main()

二、資料處理

1.匯入相關包

#基礎資料分析庫
import numpy as np
import pandas as pd
#分詞庫
import jieba
import re
#繪相簿
import matplotlib.pyplot as plt
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.globals import ThemeType
import stylecloud
from IPython.display import Image

2.匯入評論資料

df = pd.read_csv('/Users/我是J哥/Documents/技術公號/公號專案/2.spider/騰訊/comment.csv',names=['評論內容'])
df.sample(5)

3.資料型別轉換

df.info()
df['評論內容'] = df['評論內容'].astype('str')

4.刪除重複評論

df = df.drop_duplicates()

5.增加評論型別

cut = lambda x : '短評' if len(x) <= 20 else ('中評' if len(x) <=50 else '長評')
df['評論型別'] = df['評論內容'].map(cut)

6.提取演員關鍵詞

result = []
for i in df['評論內容']:
    result.append(re.split('[::,,.。!!~·`\;;……、]',i))
    
def actor_comment(df,result):
    actors = pd.DataFrame(np.zeros(6 * len(df)).reshape(len(df),6),
                      columns = ['王漫妮','顧佳','鍾曉芹','江疏影','童瑤','毛曉彤'])
    for i in range(len(result)):
        words = result[i]
        for word in words:
            if '王漫妮' in word or '王曼妮' in word:
                actors.iloc[i]['王漫妮'] = 1 
            if '顧佳' in word:
                actors.iloc[i]['顧佳'] = 1
            if '鍾曉芹' in word:
                actors.iloc[i]['鍾曉芹'] = 1 
            if '江疏影' in word:
                actors.iloc[i]['江疏影'] = 1 
            if '童瑤' in word or '童謠' in word:
                actors.iloc[i]['童瑤'] = 1
            if '毛曉彤' in word:
                actors.iloc[i]['毛曉彤'] = 1 
    final_result = pd.concat([df,actors],axis = 1)
    return final_result
df1 = actor_comment(df,result)
df1.head(10)

三、資料視覺化

1.整體評論情況

df2 = df1.groupby('評論型別')['評論內容'].count()
df2 = df2.sort_values(ascending=False)
regions = df2.index.to_list()
values = df2.to_list()
c = (
        Pie(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
        .add("", zip(regions,values),radius=["40%", "70%"])
        .set_global_opts(title_opts=opts.TitleOpts(title="評論型別佔比",subtitle="資料來源:騰訊視訊",pos_top="2%",pos_left = 'center'))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%",font_size=18))
    )
c.render_notebook()

通過對一萬多條熱評內容繪製詞雲圖,我們很容易看出大家對《三十而已》的喜歡,以及對主要角色和演員的關注。家庭與工作如何兼得?婚姻與愛情如何共處?這些問題都被廣大觀眾所熱議。

2.評論型別分佈

df2 = df1.groupby('評論型別')['評論內容'].count()
df2 = df2.sort_values(ascending=False)
regions = df2.index.to_list()
values = df2.to_list()
c = (
        Pie(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
        .add("", zip(regions,values),radius=["40%", "70%"])
        .set_global_opts(title_opts=opts.TitleOpts(title="評論型別佔比",subtitle="資料來源:騰訊視訊",pos_top="2%",pos_left = 'center'))
        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%",font_size=18))
    )
c.render_notebook()

從評論型別來看,以短評居多,佔比72.52%。另外,有4.15%的評論者給出了50字以上的評論,表達出自己對《三十而已》的獨到見解。

3.演員角色提及

df3 = df1.iloc[:,2:].sum().reset_index().sort_values(0,ascending = True)
df3.columns = ['角色','次數']
df3['佔比'] = df3['次數'] / df3['次數'].sum()

c = (
    Bar(init_opts=opts.InitOpts(theme=ThemeType.CHALK))
    .add_xaxis(df3['角色'].to_list())
    .add_yaxis("",df3['次數'].to_list()).reversal_axis() #X軸與y軸調換順序
    .set_global_opts(title_opts=opts.TitleOpts(title="主演及其飾演的角色被提及次數",subtitle="資料來源:騰訊視訊",pos_top="2%",pos_left = 'center'),
                       xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改橫座標字型大小
                       yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改縱座標字型大小
                       )
    .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right'))
    )
c.render_notebook()

童瑤及其飾演的顧佳被評論者提及的次數最多,都超過500次。江疏影,人氣也較高,獲得了300多次的評論。王漫妮和鍾曉芹提及次數相對少一些,隨著劇情的推進應該會有所提升。

4.對王漫妮的評論

王漫妮是眾人眼中的標準都市女性,大家普遍認為她長得好看又努力上進,甚至有人覺得她是完美的存在。身為櫃姐的她對顧客進行極致化服務,卻遭到現實的嘲諷。感情上,想要好好過日子的她卻遇到不該遇到的男人。

5.對顧佳的評論

顧佳作為一名全職太太,在觀眾看來是個優秀的居家女人。雙商線上能力強,將自己的孩子和丈夫的公司都打理得井井有條。與此同時,幸福的生活出現了入侵者,顧佳沒有被現實打倒,勇敢應戰。另外,顧佳因為長得像章子怡,也被眾多觀眾所提及。

6.對鍾曉芹的評論

鍾曉芹被認為是標準化的大多數,嫁給事業單位鐵飯碗的男人,安心做一個平凡妻子,過一個普通生活。卻因寫作愛好偶然賣出高價版權,家庭情況變得複雜,鍾曉芹面臨艱難抉擇。

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理。

以上文章來源於菜J學Python ,作者:J哥