潘粵明的《龍嶺迷窟》到底怎麼樣?我用 Python 得出了一些結論!


對於天下霸唱的鬼吹燈,相信很多小夥伴都知道,它可謂是國內盜墓尋寶系列小說的巔峰之作,最近得知該系列小說的《龍嶺迷窟》部分被製作成了網劇,已經於 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小二 或掃描下方二維碼,後台回復 龍嶺迷窟 即可。