潘粵明的《龍嶺迷窟》到底怎麼樣?我用 Python 得出了一些結論!
- 2020 年 4 月 4 日
- 筆記
對於天下霸唱的鬼吹燈,相信很多小夥伴都知道,它可謂是國內盜墓尋寶系列小說的巔峰之作,最近得知該系列小說的《龍嶺迷窟》部分被製作成了網劇,已經於 4 月 1 日開播了,主要演員潘粵明、姜超、張雨綺等都是一些大家比較熟悉的面孔,網劇質量、劇情還原度等到底怎麼樣呢?我們通過本文來簡單了解一下。
我們都知道要了解一件事情是需要用數據說話的,本文數據來源我們還是選擇豆瓣的評論區數據吧,先打開該劇豆瓣地址:https://movie.douban.com/subject/30488569/
看一下:
我們發現目前已經有兩萬七千多人參與了評分且打 4 星和 5 星的人數居多,總體評分 8.3,算是一個比較優秀的分數了。
接着我們將網頁向下拉到短評位置,如下所示:
目前有六千多人寫了短評,但我們知道豆瓣最多只能查看 500 條短評數據,我們的數據來源就取 500 條短評數據。
獲取數據
首先,我們通過 Python 爬取《龍嶺迷窟》500 條豆瓣短評數據,爬取的具體細節這裡就不說了,如果不了解的話,可以看一下:豆瓣爬取細節參考。
我們爬取的數據項包括:評論用戶、評論時間、評論星級、評論內容,爬取的數據我們存儲到 csv 文件中,實現代碼如下:
def spider(): url = 'https://accounts.douban.com/j/mobile/login/basic' headers = {"User-Agent": 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)'} # 龍嶺迷窟網址,為了動態翻頁,start 後加了格式化數字,短評頁面有 20 條數據,每頁增加 20 條 url_comment = 'https://movie.douban.com/subject/30488569/comments?start=%d&limit=20&sort=new_score&status=P' data = { 'ck': '', 'name': '自己的用戶名', 'password': '自己的密碼', 'remember': 'false', 'ticket': '' } session = requests.session() session.post(url=url, headers=headers, data=data) # 初始化 4 個 list 分別存用戶名、評星、時間、評論文字 users = [] stars = [] times = [] content = [] # 抓取 500 條,每頁 20 條,這也是豆瓣給的上限 for i in range(0, 500, 20): # 獲取 HTML data = session.get(url_comment % i, headers=headers) # 狀態碼 200 表是成功 print('第', i, '頁', '狀態碼:',data.status_code) # 暫停 0-1 秒時間,防止IP被封 time.sleep(random.random()) # 解析 HTML selector = etree.HTML(data.text) # 用 xpath 獲取單頁所有評論 comments = selector.xpath('//div[@class="comment"]') # 遍歷所有評論,獲取詳細信息 for comment in comments: # 獲取用戶名 user = comment.xpath('.//h3/span[2]/a/text()')[0] # 獲取評星 star = comment.xpath('.//h3/span[2]/span[2]/@class')[0][7:8] # 獲取時間 date_time = comment.xpath('.//h3/span[2]/span[3]/@title') # 有的時間為空,需要判斷下 if len(date_time) != 0: date_time = date_time[0] date_time = date_time[:10] else: date_time = None # 獲取評論文字 comment_text = comment.xpath('.//p/span/text()')[0].strip() # 添加所有信息到列表 users.append(user) stars.append(star) times.append(date_time) content.append(comment_text) # 用字典包裝 comment_dic = {'user': users, 'star': stars, 'time': times, 'comments': content} # 轉換成 DataFrame 格式 comment_df = pd.DataFrame(comment_dic) # 保存數據 comment_df.to_csv('data.csv') # 將評論單獨再保存下來 comment_df['comments'].to_csv('comment.csv', index=False)
分析數據
數據我們已經取到了,接下來我們開始對所獲取的數據進行分析。
評論數量
首先,我們來看一下不同時間用戶的評論數量,實現代碼如下:
csv_data = pd.read_csv('data.csv') df = pd.DataFrame(csv_data) df_gp = df.groupby(['time']).size() values = df_gp.values.tolist() index = df_gp.index.tolist() # 設置畫布大小 plt.figure(figsize=(8, 5)) # 數據 plt.plot(index, values, label='評論數') # 設置數字標籤 for a, b in zip(index, values): plt.text(a, b, b, ha='center', va='bottom', fontsize=13, color='black') plt.title('評論數量隨時間變化折線圖') plt.tick_params(labelsize=10) plt.ylim(0, 300) plt.legend(loc='upper right') plt.show()
看一下效果圖:
儘管該劇截止目前只有 4 天的評論數據,我們從圖中也不難發現一些規律:我們可以看出 4 月 1 日和 2 日兩天的評論數量較多,其中 4 月 1 日為首播日,評論數量多合乎情理,而 4 月 2 日評論數量多於 4 月 1 日,我們可以推測是因為該劇播出之後迅速傳播的結果,也就是讓更多的人知道了該劇,之後隨着時間的推移熱度會有所下降,評論數量呈遞減的趨勢,評論數量變化的趨勢也側面反映了該劇熱度變化的大致趨勢。
人物角色
接着,我們來看所獲取的評論數據中,劇中主要角色被提及的次數,實現代碼如下:
csv_data = pd.read_csv('data.csv') roles = {'胡八一':0, '王胖子':0, '雪莉楊':0, '鷓鴣哨':0, '大金牙':0, '陳瞎子':0} names = list(roles.keys()) for name in names: jieba.add_word(name) for row in csv_data['comments']: row = str(row) for name in names: count = row.count(name) roles[name] += count plt.figure(figsize=(8, 5)) # 數據 plt.bar(list(roles.keys()), list(roles.values()), width=0.5, label='提及次數', color=['r', 'dodgerblue', 'c', 'm', 'y', 'g']) # 設置數字標籤 for a, b in zip(list(roles.keys()), list(roles.values())): plt.text(a, b, b, ha='center', va='bottom', fontsize=13, color='black') plt.title('角色被提及次數柱狀圖') plt.xticks(rotation=270) plt.tick_params(labelsize=10) plt.ylim(0, 200) plt.legend(loc='upper right') plt.show()
看一下效果圖:
從圖中我們可以看出被提及角色數量的前三甲為:胡八一、王胖子、大金牙,通過角色被提及的次數,我們也可以大致推測齣劇中角色的受歡迎程度,角色被提及的次數越多說明其受歡迎的程度應該越高。
評論星級
再接着,我們看一下該劇每天用戶的評論星級,星級最高為 5 星,一天中如果有多條評論星級數據,我們則取其平均值,代碼實現如下:
csv_data = pd.read_csv('data.csv') df_time = csv_data.groupby(['time']).size() df_star = csv_data.groupby(['star']).size() index = df_time.index.tolist() value = [0] * len(index) # 生成字典 dic = dict(zip(index, value)) for k, v in dic.items(): stars = csv_data.loc[csv_data['time'] == str(k), 'star'] # 平均值 avg = np.mean(list(map(int, stars.values.tolist()))) dic[k] = round(avg ,2) # 設置畫布大小 plt.figure(figsize=(8, 5)) # 數據 plt.plot(list(dic.keys()), list(dic.values()), label='星級', color='red', marker='o') plt.title('評論星級隨時間變化折線圖') plt.tick_params(labelsize=10) plt.ylim(0, 5) plt.legend(loc='upper right') plt.show()
看一下效果圖:
我們從圖中可以看出該劇評論星級大致維持在 4 星以上,說明大部分用戶對於該劇的質量是比較認可的,評論星級也基本反映出了用戶對於該劇的滿意度。
詞雲展示
最後,我們對評論內容進行詞雲展示,看一下哪些詞彙才是評論區的熱門詞彙,代碼實現如下:
def jieba_(): # 打開評論數據文件 content = open('comment.csv', 'rb').read() # jieba 分詞 word_list = jieba.cut(content) words = [] # 過濾掉的詞 remove_words = ['以及', '不會', '一些', '那個', '只有', '不過', '東西', '這個', '所有', '這麼', '但是', '全片', '一點', '一部', '一個', '什麼', '雖然', '一切', '樣子', '一樣', '只能', '不是', '一種', '這個', '為了'] for word in word_list: if word not in remove_words: words.append(word) global word_cloud # 用逗號隔開詞語 word_cloud = ','.join(words) def cloud(): # 打開詞雲背景圖 cloud_mask = np.array(Image.open('bg.jpg')) # 定義詞雲的一些屬性 wc = WordCloud( # 背景圖分割顏色為白色 background_color='white', # 背景圖樣 mask=cloud_mask, # 顯示最大詞數 max_words=100, # 顯示中文 font_path='./fonts/simhei.ttf', # 最大尺寸 max_font_size=80 ) global word_cloud # 詞雲函數 x = wc.generate(word_cloud) # 生成詞雲圖片 image = x.to_image() # 展示詞雲圖片 image.show() # 保存詞雲圖片 wc.to_file('anjia.png')
看一下效果圖:
如果需要完整代碼,可以微信搜索公眾號 Python小二 或掃描下方二維碼,後台回復 龍嶺迷窟 即可。