经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
Python分析春节档七部电影的口碑和票房数据,并可视化显示
来源:cnblogs  作者:松鼠爱吃饼干  时间:2021/2/22 9:10:24  对本文有异议

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

以下文章来源于Python爬虫数据分析挖掘 ,作者李运辰

Python爬虫、数据分析、网站开发等案例教程视频免费在线观看

  1. https://space.bilibili.com/523606542

前言

今年给大家爬取『大年初一』上映的几部热门数据(评分、时长、类型)以及相关网友评论等数据

对评分、时长、类型进行图表可视化

采用不同词云图案对七部电影『评论』词云秀!!!!

 

数据获取

1.评分数据

网页分析

 

查看网页源代码,可以见到目标数据在标签<ul class="lists">,通过xpath解析就可以获取。下面直接上代码!

 

编程实现

  1. headers = {
  2. 'Host':'movie.douban.com',
  3. 'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36',
  4. 'cookie':'bid=uVCOdCZRTrM; douban-fav-remind=1; __utmz=30149280.1603808051.2.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); __gads=ID=7ca757265e2366c5-22ded2176ac40059:T=1603808052:RT=1603808052:S=ALNI_MYZsGZJ8XXb1oU4zxzpMzGdK61LFA; dbcl2="165593539:LvLaPIrgug0"; push_doumail_num=0; push_noty_num=0; __utmv=30149280.16559; ll="118288"; __yadk_uid=DnUc7ftXIqYlQ8RY6pYmLuNPqYp5SFzc; _vwo_uuid_v2=D7ED984782737D7813CC0049180E68C43|1b36a9232bbbe34ac958167d5bdb9a27; ct=y; ck=ZbYm; __utmc=30149280; __utmc=223695111; __utma=30149280.1867171825.1603588354.1613363321.1613372112.11; __utmt=1; __utmb=30149280.2.10.1613372112; ap_v=0,6.0; _pk_ref.100001.4cf6=%5B%22%22%2C%22%22%2C1613372123%2C%22https%3A%2F%2Fwww.douban.com%2Fmisc%2Fsorry%3Foriginal-url%3Dhttps%253A%252F%252Fmovie.douban.com%252Fsubject%252F34841067%252F%253Ffrom%253Dplaying_poster%22%5D; _pk_ses.100001.4cf6=*; __utma=223695111.788421403.1612839506.1613363340.1613372123.9; __utmb=223695111.0.10.1613372123; __utmz=223695111.1613372123.9.4.utmcsr=douban.com|utmccn=(referral)|utmcmd=referral|utmcct=/misc/sorry; _pk_id.100001.4cf6=e2e8bde436a03ad7.1612839506.9.1613372127.1613363387.',
  5. }
  6. url="https://movie.douban.com/cinema/nowplaying/zhanjiang/"
  7. r = requests.get(url,headers=headers)
  8. r.encoding = 'utf8'
  9. s = (r.content)
  10. selector = etree.HTML(s)
  11. li_list = selector.xpath('//*[@id="nowplaying"]/div[2]/ul/li')
  12. dict = {}
  13. for item in li_list:
  14. name = item.xpath('.//*[@class="stitle"]/a/@title')[0].replace(" ","").replace("\n","")
  15. rate = item.xpath('.//*[@class="subject-rate"]/text()')[0].replace(" ", "").replace("\n", "")
  16. dict[name] = float(rate)
  17. print("电影="+name)
  18. print("评分="+rate)
  19. print("-------")

 

 

 

电影名和评分数据已经爬取下来,并且降序排序,后面会进行可视化。

2.时长和电影类型

网页分析

 

在页面源码中,电影时长的网页标签是roperty="v:runtime",电影类型的网页标签对应是property="v:genre"

编程实现

  1. ###时长
  2. def getmovietime():
  3. url = "https://movie.douban.com/cinema/nowplaying/zhanjiang/"
  4. r = requests.get(url, headers=headers)
  5. r.encoding = 'utf8'
  6. s = (r.content)
  7. selector = etree.HTML(s)
  8. li_list = selector.xpath('//*[@id="nowplaying"]/div[2]/ul/li')
  9. for item in li_list:
  10. title = item.xpath('.//*[@class="stitle"]/a/@title')[0].replace(" ", "").replace("\n", "")
  11. href = item.xpath('.//*[@class="stitle"]/a/@href')[0].replace(" ", "").replace("\n", "")
  12. r = requests.get(href, headers=headers)
  13. r.encoding = 'utf8'
  14. s = (r.content)
  15. selector = etree.HTML(s)
  16. times = selector.xpath('//*[@property="v:runtime"]/text()')
  17. type = selector.xpath('//*[@property="v:genre"]/text()')
  18. print(title)
  19. print(times)
  20. print(type)
  21. print("-------")

 

 

 

3.评论数据

网页分析

 

查看网页代码,评论数据的目标标签是<div class="mod-bd" id="comments">

(不知道如何分析,可以看上一篇文章python爬取44130条用户观影数据,分析挖掘用户与电影之间的隐藏信息!,这篇文章也是分析豆瓣电影,里面有详细介绍)。

下面开始爬取这七部电影的评论数据!!!!

 

编程实现

  1. ###评论数据
  2. def getmoviecomment():
  3. url = "https://movie.douban.com/cinema/nowplaying/zhanjiang/"
  4. r = requests.get(url, headers=headers)
  5. r.encoding = 'utf8'
  6. s = (r.content)
  7. selector = etree.HTML(s)
  8. li_list = selector.xpath('//*[@id="nowplaying"]/div[2]/ul/li')
  9. for item in li_list:
  10. title = item.xpath('.//*[@class="stitle"]/a/@title')[0].replace(" ", "").replace("\n", "")
  11. href = item.xpath('.//*[@class="stitle"]/a/@href')[0].replace(" ", "").replace("\n", "").replace("/?from=playing_poster", "")
  12. print("电影=" + title)
  13. print("链接=" + href)
  14. ###
  15. with open(title+".txt","a+",encoding='utf-8') as f:
  16. for k in range(0,200,20):
  17. url = href+"/comments?start="+str(k)+"&limit=20&status=P&sort=new_score"
  18. r = requests.get(url, headers=headers)
  19. r.encoding = 'utf8'
  20. s = (r.content)
  21. selector = etree.HTML(s)
  22. li_list = selector.xpath('//*[@class="comment-item "]')
  23. for items in li_list:
  24. text = items.xpath('.//*[@class="short"]/text()')[0]
  25. f.write(str(text)+"\n")
  26. print("-------")
  27. time.sleep(4)

 

 

 

 

将这些评论数据分别保存到文本文件中,后面将这些评论数据采用不同的图形进行可视化展示!!!!

 

数据可视化

 

1.评分数据可视化

  1. ###画图
  2. font_size = 10 # 字体大小
  3. fig_size = (13, 10) # 图表大小
  4. data = ([datas])
  5. # 更新字体大小
  6. mpl.rcParams['font.size'] = font_size
  7. # 更新图表大小
  8. mpl.rcParams['figure.figsize'] = fig_size
  9. # 设置柱形图宽度
  10. bar_width = 0.35
  11. index = np.arange(len(data[0]))
  12. # 绘制评分
  13. rects1 = plt.bar(index, data[0], bar_width, color='#0072BC')
  14. # X轴标题
  15. plt.xticks(index + bar_width, itemNames)
  16. # Y轴范围
  17. plt.ylim(ymax=10, ymin=0)
  18. # 图表标题
  19. plt.title(u'豆瓣评分')
  20. # 图例显示在图表下方
  21. plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.03), fancybox=True, ncol=5)
  22. # 添加数据标签
  23. def add_labels(rects):
  24. for rect in rects:
  25. height = rect.get_height()
  26. plt.text(rect.get_x() + rect.get_width() / 2, height, height, ha='center', va='bottom')
  27. # 柱形图边缘用白色填充,纯粹为了美观
  28. rect.set_edgecolor('white')
  29. add_labels(rects1)
  30. # 图表输出到本地
  31. plt.savefig('豆瓣评分.png')

 

 

 

在热映的这七部电影中,《你好,李焕英》评分最高(8.3),《唐人街探案3》最低(5.8),这有点出乎意料(唐人街探案3热度远比你好,李焕英热度要高)。

2.时长和类型可视化

时长数据可视化

 

  1. #####时长可视化
  2. itemNames.reverse()
  3. datas.reverse()
  4. # 绘图。
  5. fig, ax = plt.subplots()
  6. b = ax.barh(range(len(itemNames)), datas, color='#6699CC')
  7. # 为横向水平的柱图右侧添加数据标签。
  8. for rect in b:
  9. w = rect.get_width()
  10. ax.text(w, rect.get_y() + rect.get_height() / 2, '%d' %
  11. int(w), ha='left', va='center')
  12. # 设置Y轴纵坐标上的刻度线标签。
  13. ax.set_yticks(range(len(itemNames)))
  14. ax.set_yticklabels(itemNames)
  15. plt.title('电影时长(分钟)', loc='center', fontsize='15',
  16. fontweight='bold', color='red')
  17. #plt.show()
  18. plt.savefig("电影时长(分钟)")

 

 

 

图中的电影时长均在120分钟左右

最长的电影《唐人街探案3》(136分钟),时长最短的是《熊出没·狂野大陆》(99分钟)

 

电影类型数据可视化

  1. #####2.类型可视化
  2. ###从小到大排序
  3. dict = sorted(dict.items(), key=lambda kv: (kv[1], kv[0]))
  4. print(dict)
  5. itemNames = []
  6. datas = []
  7. for i in range(len(dict) - 1, -1, -1):
  8. itemNames.append(dict[i][0])
  9. datas.append(dict[i][1])
  10. x = range(len(itemNames))
  11. plt.plot(x, datas, marker='o', mec='r', mfc='w', label=u'电影类型')
  12. plt.legend() # 让图例生效
  13. plt.xticks(x, itemNames, rotation=45)
  14. plt.margins(0)
  15. plt.subplots_adjust(bottom=0.15)
  16. plt.xlabel(u"类型") # X轴标签
  17. plt.ylabel("数量") # Y轴标签
  18. plt.title("电影类型统计") # 标题
  19. plt.savefig("电影类型统计.png")

 

 

 

将这七部电影的类型进行统计(有的电影属于多个类型,比如'动作', '奇幻', '冒险')。七部电影中其中有四部是属于喜剧。科幻、犯罪、悬疑、冒险均属于其中一部。

 

3.评论数据词云可视化

使用七种不同的图案进行词云可视化,因此将绘图的代码封装成函数!!!

 

  1. ####词云代码
  2. def jieba_cloud(file_name, icon):
  3. with open(file_name, 'r', encoding='utf8') as f:
  4. text = f.read()
  5. text = text.replace('\n',"").replace("\u3000","").replace(",","").replace("。","")
  6. word_list = jieba.cut(text)
  7. result = " ".join(word_list) # 分词用 隔开
  8. # 制作中文云词
  9. icon_name = ""
  10. if icon == "1":
  11. icon_name ='fas fa-envira'
  12. elif icon == "2":
  13. icon_name = 'fas fa-dragon'
  14. elif icon == "3":
  15. icon_name = 'fas fa-dog'
  16. elif icon == "4":
  17. icon_name = 'fas fa-cat'
  18. elif icon == "5":
  19. icon_name = 'fas fa-dove'
  20. elif icon == "6":
  21. icon_name = 'fab fa-qq'
  22. elif icon == "7":
  23. icon_name = 'fas fa-cannabis'
  24. """
  25. # icon_name='',#国旗
  26. # icon_name='fas fa-dragon',#翼龙
  27. icon_name='fas fa-dog',#狗
  28. # icon_name='fas fa-cat',#猫
  29. # icon_name='fas fa-dove',#鸽子
  30. # icon_name='fab fa-qq',#qq
  31. """
  32. picp = file_name.split('.')[0] + '.png'
  33. if icon_name is not None and len(icon_name) > 0:
  34. gen_stylecloud(text=result, icon_name=icon_name, font_path='simsun.ttc', output_name=picp) # 必须加中文字体,否则格式错误
  35. else:
  36. gen_stylecloud(text=result, font_path='simsun.ttc', output_name=picp) # 必须加中文字体,否则格式错误
  37. return picp

 

开始对这七部电影评论数据进行绘图

 

  1. ###评论数据词云
  2. def commentanalysis():
  3. lists = ['刺杀小说家','你好,李焕英','人潮汹涌','侍神令','唐人街探案3','新神榜:哪吒重生','熊出没·狂野大陆']
  4. for i in range(0,len(lists)):
  5. title =lists[i]+".txt"
  6. jieba_cloud(title , (i+1))

废话不多说了,下面开始『词云秀』!!!!!!!

 

1.刺杀小说家

 

2.人潮汹涌

 

3.熊出没·狂野大陆

 

4.新神榜:哪吒重生

 

5.唐人街探案3

 

6.你好,李焕英

 

7.侍神令

原文链接:http://www.cnblogs.com/hhh188764/p/14422098.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号