查看原文
其他

豆瓣电影评分之数据爬取与可视化的实现

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:钱梦璇

文字编辑:宁刘莹

技术总编:张   邯



重磅!!!为了大家能够更好地学习Python技术,以及应广大粉丝和往期学员的要求,2019年11月29日-12月1日,武汉字符串数据科技有限公司将在湖北武汉举办《第四期Python编程技术培训》。本次培训采用理论与案例相结合的方式,旨在帮助零基础学员轻松入门Python,由浅入深学习和掌握Python的编程技术,特别是网络数据抓取技术。目前正在火热招生中~

如果有兴趣,具体培训内容详见《2019年Python第四期培训招生》,报名请点击:阅读原文哦~



之前的推文中,小编为大家介绍了数据可视化之饼状图、柱状图等图形的绘制,不过这些数据我们都是手动输入的,较为简单。那么如何利用Python爬取数据并进行可视化展示呢?

今天给大家介绍一个简单的例子,以豆瓣电影https://movie.douban.com/中最近热门电影的数据为例,从爬虫数据到可视化展示主要用到了requestsjson以及pyecharts这三个包。

 

1.电影数据的获取

进入豆瓣电影官网,找到如下所示的最近热门电影:


进入开发者模式,寻找含有每个电影详细信息的url。为了方便数据可视化的演示,我们只爬取按热度排序的前20个电影所对应的名称和豆瓣评分。在url=”https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0”preview中,找到了按热度排序的前20个电影信息,如下所示:


分析页面可知,数据在一个json文件中:


针对这个json文件,主要解析代码如下所示:

 

import requestsimport json url='https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend&page_limit=20&page_start=0'result=requests.get(url) #利用requests中的get方法data=json.loads(result.text)['subjects']  #subjects键对应的值即为每个电影信息

此时,我们得到了一个长度为20的列表,列表中的每一个元素对应一个电影信息所构成的字典。


接下来,从每个字典中获取这20个电影的名称以及对应的豆瓣评分:

 

movie=[] #设定movie空列表,用以装载电影名称rate=[] #设定rate空列表,用以装载豆瓣评分for index in range(0,20): movie.append(data[index]['title']) rate.append(data[index]['rate'])print(f"电影名称:{movie}")print(f"豆瓣评分:{rate}")


输出结果如下所示:




2.数据可视化

(1)柱状图

首先,根据movie和rate两个列表的数据来绘制一个柱状图:

from pyecharts.charts import Barfrom pyecharts import options as optsfrom pyecharts.globals import ThemeType #引入主题
bar=Bar(init_opts=opts.InitOpts(theme=ThemeType.MACARONS)) #创建Bar实例bar.add_xaxis(movie) #加入横坐标参数bar.add_yaxis("豆瓣评分",rate) #加入纵坐标参数bar.set_global_opts(title_opts=opts.TitleOpts(title = "豆瓣电影-最近热门电影",subtitle = "按热度排序的前20名电影") ,legend_opts=opts.LegendOpts(pos_top="6%"))bar.render_notebook()


这里,选择的主题是MACARONS; LegendOpts为图例配置项,pos_top设定了图例组件豆瓣评分离容器上侧的距离。得到的图表如下所示:

 


我们发现,横坐标只显示了4个电影名称。这是因为默认的坐标标签显示方法没办法将所有的电影名称同时展示出来,有些电影名称过长,此时我们可以通过对标签进行旋转来展示所有电影名称。


bar.set_global_opts(xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)) #标签旋转


坐标轴配置项AxisOpts是全局配置项中的一种,设置坐标轴标签配置项LabelOpts是它的其中之一选项,而标签配置项中的rotate表示标签旋转的角度,取值范围为-90~90度,正值代表逆时针旋转。这里设定的角度是45,即将坐标轴标签(电影名)按逆时针旋转45度。

 

此外,再介绍一种全局配置项——区域缩放配置项DataZoomOpts。假如我们想快速的从图中发现豆瓣评分在7.5~8.5之间的电影,或者只想了解图中第5~10名电影的评分,就可以通过设定一个可拖动的区域缩放配置项来实现。

bar.set_global_opts(datazoom_opts=[opts.DataZoomOpts(orient='vertical'),opts.DataZoomOpts(type_='slider')])


其中,orient='vertical'表示此配置项的布局方式为竖,对于直角坐标而言,也就决定了缺省情况控制的是纵向数据。type_='slider'表示横坐标的组件类型为slider,即通过滑竿拖动显示柱形,另一种类型为inside,通过鼠标滑动显示柱形。


如上图所示,orient='vertical'决定了图形右边的组件,type_='slider'决定了横坐标下方的组件,我们可以通过拖动组件来展示自己感兴趣的数据。此图展示了中间11个电影中豆瓣评分在6.502~8.700之间的柱形,例如豆瓣评分分别为5.45.1的电影——《沉默的证人》和《深夜食堂》都没有显示出来。

 

2)动态散点图

根据电影数据画出带有涟漪特效的散点图。首先,导入涟漪特效散点图以及涟漪特效图形的标记符号,同绘制柱状图的方法一样,创建EffectScatter()实例并加入横纵坐标参数:

from pyecharts import options as optsfrom pyecharts.charts import EffectScatter #导入涟漪特效散点图from pyecharts.globals import SymbolType #导入涟漪特效图形符号
Scatter=EffectScatter()Scatter.add_xaxis(movie)Scatter.add_yaxis("豆瓣评分",rate,symbol=SymbolType.ARROW) Scatter.set_global_opts(title_opts=opts.TitleOpts(title = "豆瓣电影-最近热门电影",subtitle = "按热度排序的前20名电影") ,xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=45)))Scatter.render_notebook()


在此,将特效图形符号设置为ARROW(箭头)类型,而且箭头带有涟漪效果。标题和坐标轴标签旋转等其他设置同上述一样。在notebook中渲染的图形如下所示:





对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐  
为了辅导作业,这位家长竟然...

      走进列表的世界——列表方法(二)

走进列表的世界——列表方法(一)
朝花夕拾|长宽数据转换——reshape命令

Stata有音乐包啦!

对《陈情令》的数据可视化分析

stata绘制热力图详解

实战演练-明星微博热搜次数的数据可视化

《少年的你》影评

集合常用方法小结

实战演练-爬取深交所年报

重建“通天塔” —— Unicode编码与解码

输出分组描述性统计表的利器——report

字典常用操作小结

XPath Helper助XPath爬虫一臂之力

查找变量?用“codebook”!

distinct命令用法一览

Stata数据分析技术应用培训


关于我们

微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存