《狄仁杰之四大天王》影评分析(爬虫+词云+热力图)

大数据 数据分析
作为徐老怪的忠实影迷,《狄仁杰之四大天王》肯定是要去看的,看豆瓣评分和前两部相差不多,但其实胡萝卜酱并不是很喜欢前两部,所以在犹豫要不要去看,受到糖甜甜甜的《我不是药神》推送影响,于是也简单去分析了一下《狄仁杰》的影评。

作为徐老怪的忠实影迷,《狄仁杰之四大天王》肯定是要去看的,看豆瓣评分和前两部相差不多,但其实胡萝卜酱并不是很喜欢前两部,所以在犹豫要不要去看,受到糖甜甜甜的《我不是药神》推送影响,于是也简单去分析了一下《狄仁杰》的影评。

[[238686]]

01 数据爬取

本来小编是打算爬取豆瓣的全部影评,但是很不幸,数据爬取到一半,我的账号被封了(建议大家改为动态IP进行爬取,代码可用,可加QQ群获取),于是转战于猫眼。猫眼的短评不能直接通过源码获得,需要寻找他的数据接口,如下:

http://m.maoyan.com/mmdb/comments/movie/341516.json?_v_=yes&offset=1

其中341516属于电影的专属id,offset代表页数且只展示1000页的内容,同时仅限于当日的评论。此文只为做影评分析演示,所以小编只爬取了今日的评论,去重后仅为几百条,建议大家多爬取今天的数据,在做分析。

代码如下:

  1. import requests 
  2. import json 
  3. import time 
  4. import random 
  5.  
  6. #下载一页数据 
  7. def get_one_page(url): 
  8.     headers = { 
  9.     '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' 
  10.     } 
  11.     response = requests.get(url,headers=headers) 
  12.     if response.status_code == 200:  #页面正常响应 
  13.         return response.text # 返回页面源代码 
  14.     return None 
  15.  
  16. #解析一页数据 
  17. def parse_ono_page(html): 
  18.     data = json.loads(html)['cmts'] #评论以json形式存储,故以json形式截取 
  19.     for item in data: 
  20.         yield{ #该方法返回一个字典 
  21.             'comment':item['content'], 
  22.             'date':item['time'].split(' ')[0], 
  23.             'rate':item['score'], 
  24.             'city':item['cityName'], 
  25.             'nickname':item['nickName'
  26.         } 
  27.  
  28. #保存数据到文本文档 
  29. def save_to_txt(): 
  30.     for i in range(1, 1001): 
  31.         url='http://m.maoyan.com/mmdb/comments/movie/341516.json?_v_=yes&offset=' + str(i) 
  32.         html = get_one_page(url) 
  33.         print('正在保存第%d页.'% i) 
  34.         for item in parse_ono_page(html): 
  35.             with open('狄仁杰.txt','a',encoding='utf-8'as f: 
  36.                 f.write(item['date'] + ',' + item['nickname'] + ',' + item['city'] + ',' +str(item['rate'])+','+item['comment']+'\n'
  37.         #反爬 
  38.         time.sleep(5 + float(random.randint(1,100)) /20)  
  39.  
  40. # 获取的评论可能有重复,为了最终统计的真实性,需做去重处理 
  41. def delete_repeat(old,new): 
  42.     oldfile = open(old,'r',encoding='UTF-8'
  43.     newfile = open(new,'w',encoding='UTF-8'
  44.     content_list = oldfile.readlines() #读取的数据集 
  45.     content_alreadly_ditinct = [] #存储不重复的评论数据 
  46.     for line in content_list: 
  47.         if line not in content_alreadly_ditinct: #评论不重复 
  48.             newfile.write(line+'\n'
  49.             content_alreadly_ditinct.append(line) 
  50.  
  51. if __name__ =='__main__'
  52.     save_to_txt() 
  53.     delete_repeat(r'狄仁杰.txt', r'狄仁杰_new.txt'

爬取数据如下:

《狄仁杰之四大天王》影评分析(爬虫+词云+热力图)

02 数据分析

直观来看,有用的数据仅为城市,评分和评论。我们分别采用热力图,柱状图和云图来进行可视化分析。

观影者分布热力图

根据观影者的城市,我们画出了观影者分布情况,如下图:

《狄仁杰之四大天王》影评分析(爬虫+词云+热力图)

 

可明显发现东部地区,尤其是北京、上海、广东,成都等城市更为突出,当然,这和经济发展有着重要的联系,也符合我们的常规想法。

代码如下:

  1. from wordcloud import WordCloud, STOPWORDS 
  2. import pandas as pd 
  3. import jieba 
  4. import matplotlib.pyplot as plt 
  5. import seaborn as sns 
  6. from pyecharts import Geo 
  7.  
  8. f = open('狄仁杰_new.txt',encoding='UTF-8'
  9. data = pd.read_csv(f,sep=',',header=None,encoding='UTF-8',names=['date','nickname','city','rate','comment']) 
  10.  
  11. city = data.groupby(['city']) 
  12. rate_group = city['rate'
  13. city_com = city['city'].agg(['count']) 
  14. city_com.reset_index(inplace=True
  15. data_map = [(city_com['city'][i],city_com['count'][i]) for i in range(0,city_com.shape[0])] 
  16. geo = Geo("狄仁杰",title_color="#fff",title_pos="center",width=1200, 
  17.           height=600,background_color="#404a59"
  18.  
  19. while True:  
  20.     try: 
  21.         attr, val = geo.cast(data_map) 
  22.         geo.add("", attr, val, visual_range=[0, 50], visual_text_color="#fff", is_geo_effect_show=False
  23.                 is_piecewise=True, visual_split_number=6, symbol_size=15, is_visualmap=True
  24.  
  25.     except ValueError as e: 
  26.         e = str(e) 
  27.         e = e.split("No coordinate is specified for ")[1]  # 获取不支持的城市名称 
  28.         for i in range(0,len(data_map)): 
  29.             if e in data_map[i]: 
  30.                 data_map.pop(i) 
  31.                 break 
  32.     else
  33.         break 
  34. geo.render('狄仁杰.html'

评分柱状图

相较于豆瓣的评分机制,在猫眼的评分机制允许给出半星的评价,于是通过简单的柱状图来大概看一下评分情况。

《狄仁杰之四大天王》影评分析(爬虫+词云+热力图)

 

大部分的评分都高于3分,尤其是给出满分的最多,只有少数的观影者给出了低分,看来徐克这部电影的口碑还行,至少在及格线以上。那大家观完影,最直观的感受是什么呢,接下来就通过短评分析来看看。

代码如下:

  1. #评分分析 
  2. rate = data['rate'].value_counts() 
  3.  
  4. sns.set_style("darkgrid"
  5. bar_plot = sns.barplot(x=rate.index,y=(rate.values/sum(rate)),palette="muted"
  6. plt.xticks(rotation=90) 
  7. plt.show() 

短评词云图

为了分析短评,我们采用jieba对短评进行了分词,然后做出词云图。

背景图:

[[238688]]

 

词云图:

 

[[238689]]

和前两部一样,最突出的是特效,剧情和徐老怪,看来在这部电影里面,徐克肯定也将特效做的很棒,个人风格也肯定展示的***。同时,也能发现好看,不错,推荐也是观影者的主要感受,看来还是蛮值得去看的。

代码如下:

  1. #分词 
  2. comment = jieba.cut(str(data["comment"]),cut_all=False
  3. wl_space_split= " ".join(comment) 
  4. #导入背景图 
  5. backgroud_Image = plt.imread('xuke.jpg'
  6. stopwords = STOPWORDS.copy() 
  7. print(" STOPWORDS.copy()",help(STOPWORDS.copy())) 
  8. #可以自行加多个屏蔽词,也可直接下载停用词表格 
  9. stopwords.add("电影"
  10. stopwords.add("一部"
  11. stopwords.add("一个"
  12. stopwords.add("没有"
  13. stopwords.add("什么"
  14. stopwords.add("有点"
  15. stopwords.add("这部"
  16. stopwords.add("这个"
  17. stopwords.add("不是"
  18. stopwords.add("真的"
  19. stopwords.add("感觉"
  20. stopwords.add("觉得"
  21. stopwords.add("还是"
  22. stopwords.add("特别"
  23. stopwords.add("非常"
  24. stopwords.add("可以"
  25. stopwords.add("因为"
  26. stopwords.add("为了"
  27. stopwords.add("比较"
  28. print (stopwords) 
  29. #设置词云参数 
  30. #参数分别是指定字体/背景颜色/***的词的大小,使用给定图作为背景形状 
  31. wc =WordCloud(width=1024,height=768,background_color='white'
  32.               mask = backgroud_Image,font_path='C:/Windows/Fonts/simkai.ttf'
  33.               stopwords=stopwords,max_font_size=400, 
  34.               random_state=50) 
  35. #将分词后数据传入云图 
  36. wc.generate_from_text(wl_space_split) 
  37. plt.imshow(wc) 
  38. plt.axis('off')#不显示坐标轴 
  39. plt.show() 
  40. #保存结果到本地 
  41. wc.to_file(r'xuke_wordcloud.jpg'

03 结语

本文只是做了简单的数据爬取和分析,主要是用以学习如何进行分词,词云和热力图,建议大家可以基于此进行练习。(胡萝卜酱要抽空去看狄仁杰了,开熏)

责任编辑:未丽燕 来源: 经管人学数据分析
相关推荐

2010-07-19 10:05:07

jQuery

2018-03-20 14:40:58

Python爬虫豆瓣影评

2014-03-27 15:57:45

Android组件Activity

2012-05-10 18:10:35

2012-02-08 13:52:30

云计算

2019-03-01 09:10:59

数据保护备份数据管理

2023-08-07 07:16:33

AMDNavi 31Navi 31 XL

2019-06-14 16:25:14

关键词SAP Concur企业

2011-10-21 13:59:48

Java云计算

2012-07-19 09:15:43

CloudStackEucalyptusvCloud Dire

2016-03-30 11:51:55

2016-12-09 09:23:50

android组件Service

2012-03-26 21:52:07

平台

2023-05-15 12:41:26

2016-03-17 17:35:15

云容器虚拟化管理Docker

2021-03-08 08:21:19

词云数据可视化大数据

2011-06-10 09:44:15

iCloud苹果

2021-01-27 17:36:54

数据库数据库厂商数据库服务

2015-07-17 09:50:16

Carthage优劣比较

2016-07-08 14:02:29

云计算
点赞
收藏

51CTO技术栈公众号