用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 list使用示例 list中找连续的数字
Jan 27 Python
Python 基础教程之包和类的用法
Feb 23 Python
Python 3.x 安装opencv+opencv_contrib的操作方法
Apr 02 Python
Django框架封装外部函数示例
May 28 Python
python文件选择对话框的操作方法
Jun 27 Python
Django后端接收嵌套Json数据及解析详解
Jul 17 Python
python for循环remove同一个list过程解析
Aug 14 Python
Django框架 信号调度原理解析
Sep 04 Python
softmax及python实现过程解析
Sep 30 Python
PyTorch实现AlexNet示例
Jan 14 Python
使用python实现名片管理系统
Jun 18 Python
pycharm 如何查看某一函数源码的快捷键
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实现WEB动态网页静态
2006/10/09 PHP
PHP三元运算的2种写法代码实例
2014/05/12 PHP
php通过function_exists检测函数是否存在的方法
2015/03/18 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
2016/10/10 PHP
判断脚本加载是否完成的方法
2009/05/26 Javascript
在次封装easyui-Dialog插件实现代码
2010/11/14 Javascript
JQuery Tips相关(1)----关于$.Ready()
2014/08/14 Javascript
jquery制作多功能轮播图插件
2015/04/02 Javascript
JavaScript设计模式之单体模式全面解析
2016/09/09 Javascript
解析如何利用iframe标签以及js制作时钟
2016/12/08 Javascript
jQuery选择器实例应用
2017/01/05 Javascript
javascript防篡改对象实例详解
2017/04/10 Javascript
浅谈angular4生命周期钩子
2017/09/05 Javascript
基于 Vue 实现一个酷炫的 menu插件
2017/11/14 Javascript
jQuery中的for循环var与let的区别
2018/04/21 jQuery
使用Nuxt.js改造已有项目的方法
2018/08/07 Javascript
nodejs读取图片返回给浏览器显示
2019/07/25 NodeJs
[01:22:10]Ti4 循环赛第二日 DK vs Empire
2014/07/11 DOTA
[原创]Python入门教程2. 字符串基本操作【运算、格式化输出、常用函数】
2018/10/29 Python
python实现推箱子游戏
2020/03/25 Python
在python下读取并展示raw格式的图片实例
2019/01/24 Python
Python字符串的一些操作方法总结
2019/06/10 Python
pandas使用函数批量处理数据(map、apply、applymap)
2020/11/27 Python
html特殊符号示例 html特殊字符编码对照表
2014/01/14 HTML / CSS
HTML5自定义元素播放焦点图动画的实现
2019/09/25 HTML / CSS
最新的小工具和卓越的产品设计:Oh That Tech!
2019/08/07 全球购物
贝佳斯官方网站:Borghese
2020/05/08 全球购物
介绍一些UNIX常用简单命令
2014/11/11 面试题
工程造价专业大学生自荐信
2013/10/01 职场文书
幼儿园保育员岗位职责
2014/04/13 职场文书
户外宣传策划方案
2014/05/25 职场文书
在教室放鞭炮的检讨书
2014/09/28 职场文书
2014年售票员工作总结
2014/11/19 职场文书
三傻大闹宝莱坞观后感
2015/06/03 职场文书
彻底理解golang中什么是nil
2021/04/29 Golang
mongodb清除连接和日志的正确方法分享
2021/09/15 MongoDB