用Python 爬取猫眼电影数据分析《无名之辈》


Posted in Python onJuly 24, 2020

前言

作者: 罗昭成

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef

获取猫眼接口数据

作为一个长期宅在家的程序员,对各种抓包简直是信手拈来。在 Chrome 中查看原代码的模式,可以很清晰地看到接口,接口地址即为:http://m.maoyan.com/mmdb/comments/movie/1208282.json?_v_=yes&offset=15

在 Python 中,我们可以很方便地使用 request 来发送网络请求,进而拿到返回结果:

def getMoveinfo(url):
 session = requests.Session()
 headers = {
  "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X)"
 }
 response = session.get(url, headers=headers)
 if response.status_code == 200:
  return response.text
 return None

根据上面的请求,我们能拿到此接口的返回数据,数据内容有很多信息,但有很多信息是我们并不需要的,先来总体看看返回的数据:

{
 "cmts":[
  {
   "approve":0,
   "approved":false,
   "assistAwardInfo":{
    "avatar":"",
    "celebrityId":0,
    "celebrityName":"",
    "rank":0,
    "title":""
   },
   "authInfo":"",
   "cityName":"贵阳",
   "content":"必须十分,借钱都要看的一部电影。",
   "filmView":false,
   "id":1045570589,
   "isMajor":false,
   "juryLevel":0,
   "majorType":0,
   "movieId":1208282,
   "nick":"nick",
   "nickName":"nickName",
   "oppose":0,
   "pro":false,
   "reply":0,
   "score":5,
   "spoiler":0,
   "startTime":"2018-11-22 23:52:58",
   "supportComment":true,
   "supportLike":true,
   "sureViewed":1,
   "tagList":{
    "fixed":[
     {
      "id":1,
      "name":"好评"
     },
     {
      "id":4,
      "name":"购票"
     }
    ]
   },
   "time":"2018-11-22 23:52",
   "userId":1871534544,
   "userLevel":2,
   "videoDuration":0,
   "vipInfo":"",
   "vipType":0
  }
 ]
}
​

如此多的数据,我们感兴趣的只有以下这几个字段:

nickName, cityName, content, startTime, score

接下来,进行我们比较重要的数据处理,从拿到的 JSON 数据中解析出需要的字段:

def parseInfo(data):
 data = json.loads(html)['cmts']
 for item in data:
  yield{
   'date':item['startTime'],
   'nickname':item['nickName'],
   'city':item['cityName'],
   'rate':item['score'],
   'conment':item['content']
  }

拿到数据后,我们就可以开始数据分析了。但是为了避免频繁地去猫眼请求数据,需要将数据存储起来,在这里,笔者使用的是 SQLite3,放到数据库中,更加方便后续的处理。存储数据的代码如下:

def saveCommentInfo(moveId, nikename, comment, rate, city, start_time)
 conn = sqlite3.connect('unknow_name.db')
 conn.text_factory=str
 cursor = conn.cursor()
 ins="insert into comments values (?,?,?,?,?,?)"
 v = (moveId, nikename, comment, rate, city, start_time)
 cursor.execute(ins,v)
 cursor.close()
 conn.commit()
 conn.close()

数据处理

因为前文我们是使用数据库来进行数据存储的,因此可以直接使用 SQL 来查询自己想要的结果,比如评论前五的城市都有哪些:

SELECT city, count(*) rate_count FROM comments GROUP BY city ORDER BY rate_count DESC LIMIT 5

结果如下:

用Python 爬取猫眼电影数据分析《无名之辈》

从上面的数据, 我们可以看出来,来自北京的评论数最多。

不仅如此,还可以使用更多的 SQL 语句来查询想要的结果。比如每个评分的人数、所占的比例等。如笔者有兴趣,可以尝试着去查询一下数据,就是如此地简单。

而为了更好地展示数据,我们使用 Pyecharts 这个库来进行数据可视化展示。

根据从猫眼拿到的数据,按照地理位置,直接使用 Pyecharts 来在中国地图上展示数据:

data = pd.read_csv(f,sep='{',header=None,encoding='utf-8',names=['date','nickname','city','rate','comment'])
city = data.groupby(['city'])
city_com = city['rate'].agg(['mean','count'])
city_com.reset_index(inplace=True)
data_map = [(city_com['city'][i],city_com['count'][i]) for i in range(0,city_com.shape[0])]
geo = Geo("GEO 地理位置分析",title_pos = "center",width = 1200,height = 800)
while True:
 try:
  attr,val = geo.cast(data_map)
  geo.add("",attr,val,visual_range=[0,300],visual_text_color="#fff",
    symbol_size=10, is_visualmap=True,maptype='china')
​
 except ValueError as e:
  e = e.message.split("No coordinate is specified for ")[1]
  data_map = filter(lambda item: item[0] != e, data_map)
 else :
  break
geo.render('geo_city_location.html')

注:使用 Pyecharts 提供的数据地图中,有一些猫眼数据中的城市找不到对应的从标,所以在代码中,GEO 添加出错的城市,我们将其直接删除,过滤掉了不少的数据。

使用 Python,就是如此简单地生成了如下地图:

用Python 爬取猫眼电影数据分析《无名之辈》

从可视化数据中可以看出,既看电影又评论的人群主要分布在中国东部,又以北京、上海、成都、深圳最多。虽然能从图上看出来很多数据,但还是不够直观,如果想看到每个省/市的分布情况,我们还需要进一步处理数据。

而在从猫眼中拿到的数据中,城市包含数据中具备县城的数据,所以需要将拿到的数据做一次转换,将所有的县城转换到对应省市里去,然后再将同一个省市的评论数量相加,得到最后的结果。

data = pd.read_csv(f,sep='{',header=None,encoding='utf-8',names=['date','nickname','city','rate','comment'])
city = data.groupby(['city'])
city_com = city['rate'].agg(['mean','count'])
city_com.reset_index(inplace=True)
fo = open("citys.json",'r')
citys_info = fo.readlines()
citysJson = json.loads(str(citys_info[0]))
data_map_all = [(getRealName(city_com['city'][i], citysJson),city_com['count'][i]) for i in range(0,city_com.shape[0])]
data_map_list = {}
for item in data_map_all:
 if data_map_list.has_key(item[0]):
  value = data_map_list[item[0]]
  value += item[1]
  data_map_list[item[0]] = value
 else:
  data_map_list[item[0]] = item[1]
data_map = [(realKeys(key), data_map_list[key] ) for key in data_map_list.keys()]
def getRealName(name, jsonObj):
 for item in jsonObj:
  if item.startswith(name) :
   return jsonObj[item]
 return name
def realKeys(name):
 return name.replace(u"省", "").replace(u"市", "")
    .replace(u"回族自治区", "").replace(u"维吾尔自治区", "")
    .replace(u"壮族自治区", "").replace(u"自治区", "")

经过上面的数据处理,使用 Pyecharts 提供的 map 来生成一个按省/市来展示的地图:

def generateMap(data_map):
 map = Map("城市评论数", width= 1200, height = 800, title_pos="center")
 while True:
  try:
   attr,val = geo.cast(data_map)
   map.add("",attr,val,visual_range=[0,800],
     visual_text_color="#fff",symbol_size=5,
     is_visualmap=True,maptype='china',
     is_map_symbol_show=False,is_label_show=True,is_roam=False,
     )
  except ValueError as e:
   e = e.message.split("No coordinate is specified for ")[1]
   data_map = filter(lambda item: item[0] != e, data_map)
  else :
   break
 map.render('city_rate_count.html')

用Python 爬取猫眼电影数据分析《无名之辈》

当然,我们还可以来可视化一下每一个评分的人数,这个地方采用柱状图来显示:

data = pd.read_csv(f,sep='{',header=None,encoding='utf-8',names=['date','nickname','city','rate','comment'])
# 按评分分类
rateData = data.groupby(['rate'])
rateDataCount = rateData["date"].agg([ "count"])
rateDataCount.reset_index(inplace=True)
count = rateDataCount.shape[0] - 1
attr = [rateDataCount["rate"][count - i] for i in range(0, rateDataCount.shape[0])]
v1 = [rateDataCount["count"][count - i] for i in range(0, rateDataCount.shape[0])]
bar = Bar("评分数量")
bar.add("数量",attr,v1,is_stack=True,xaxis_rotate=30,yaxix_min=4.2,
  xaxis_interval=0,is_splitline_show=True)
bar.render("html/rate_count.html")

画出来的图,如下所示,在猫眼的数据中,五星好评的占比超过了 50%,比豆瓣上 34.8% 的五星数据好很多。

用Python 爬取猫眼电影数据分析《无名之辈》

从以上观众分布和评分的数据可以看到,这一部剧,观众朋友还是非常地喜欢。前面,从猫眼拿到了观众的评论数据。现在,笔者将通过 jieba 把评论进行分词,然后通过 Wordcloud 制作词云,来看看,观众朋友们对《无名之辈》的整体评价:

data = pd.read_csv(f,sep='{',header=None,encoding='utf-8',names=['date','nickname','city','rate','comment'])
comment = jieba.cut(str(data['comment']),cut_all=False)
wl_space_split = " ".join(comment)
backgroudImage = np.array(Image.open(r"./unknow_3.png"))
stopword = STOPWORDS.copy()
wc = WordCloud(width=1920,height=1080,background_color='white',
 mask=backgroudImage,
 font_path="./Deng.ttf",
 stopwords=stopword,max_font_size=400,
 random_state=50)
wc.generate_from_text(wl_space_split)
plt.imshow(wc)
plt.axis("off")
wc.to_file('unknow_word_cloud.png')

导出:

用Python 爬取猫眼电影数据分析《无名之辈》 .

到此这篇关于用Python 爬取猫眼电影数据分析《无名之辈》的文章就介绍到这了,更多相关Python 爬取猫眼电影数据分析《无名之辈》内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python入门篇之编程习惯与特点
Oct 17 Python
python实现网站的模拟登录
Jan 04 Python
python与C互相调用的方法详解
Jul 14 Python
python之super的使用小结
Aug 13 Python
python实现多张图片拼接成大图
Jan 15 Python
Python实现的IP端口扫描工具类示例
Feb 15 Python
python 图像的离散傅立叶变换实例
Jan 02 Python
python 实现朴素贝叶斯算法的示例
Sep 30 Python
python 发送get请求接口详解
Nov 17 Python
Python tkinter之Bind(绑定事件)的使用示例
Feb 05 Python
python爬虫用request库处理cookie的实例讲解
Feb 20 Python
PyCharm 安装与使用配置教程(windows,mac通用)
May 12 Python
基于Python实现简单学生管理系统
Jul 24 #Python
用python实现学生管理系统
Jul 24 #Python
Python 解析简单的XML数据
Jul 24 #Python
深入了解NumPy 高级索引
Jul 24 #Python
python实现学生管理系统开发
Jul 24 #Python
浅析Python 多行匹配模式
Jul 24 #Python
Python图像处理二值化方法实例汇总
Jul 24 #Python
You might like
php中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
for循环连续求和、九九乘法表代码
2012/02/20 PHP
PHP遍历数组的几种方法
2012/03/22 PHP
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
php中动态修改ini配置
2014/10/14 PHP
php获取当前页面完整URL地址
2015/12/30 PHP
PHP排序算法之简单选择排序(Simple Selection Sort)实例分析
2018/04/20 PHP
php ZipArchive实现多文件打包下载实例
2019/10/31 PHP
php实现根据身份证获取精准年龄
2020/02/26 PHP
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
方便实用的jQuery checkbox复选框全选功能简单实例
2013/10/09 Javascript
js流动式效果显示当前系统时间
2016/05/16 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
canvas实现环形进度条效果
2017/03/23 Javascript
老生常谈angularjs中的$state.go
2017/04/24 Javascript
BootStrap实现文件上传并带有进度条效果
2017/09/11 Javascript
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
vue非父子组件通信问题及解决方法
2018/06/11 Javascript
Vue2.0使用嵌套路由实现页面内容切换/公用一级菜单控制页面内容切换(推荐)
2019/05/08 Javascript
ElementUI中el-tree节点的操作的实现
2020/02/27 Javascript
实例分析javascript中的异步
2020/06/02 Javascript
JavaScript数组类型Array相关的属性与方法详解
2020/09/08 Javascript
[00:11]战神迅矛
2019/03/06 DOTA
Python实现栈的方法
2015/05/26 Python
Tensorflow累加的实现案例
2020/02/05 Python
在pytorch中实现只让指定变量向后传播梯度
2020/02/29 Python
土耳其时尚购物网站:Morhipo
2017/09/04 全球购物
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
优秀团员事迹材料1000字
2014/08/20 职场文书
无刑事犯罪记录证明范本
2014/09/29 职场文书
社区班子个人对照检查材料思想汇报
2014/10/07 职场文书
门面房租房协议书
2014/12/01 职场文书
2015年见习期工作总结
2014/12/12 职场文书
会计工作总结范文2014
2014/12/23 职场文书
Python实现制作销售数据可视化看板详解
2021/11/27 Python