前言

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

作者: 罗昭成

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

获取猫眼接口数据

作为一个长期宅在家的程序员,对各种抓包简直是信手拈来。在 Chrome 中查看原代码的模式,可以很清晰地看到接口,接口地址即为:

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

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

1 defgetMoveinfo(url):2 session =requests.Session()3 headers ={4 "User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X)"

5 }6 response = session.get(url, headers=headers)7 if response.status_code == 200:8 returnresponse.text9 return None

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

1 {2 "cmts":[3 {4 "approve":0,5 "approved":false,6 "assistAwardInfo":{7 "avatar":"",8 "celebrityId":0,9 "celebrityName":"",10 "rank":0,11 "title":""

12 },13 "authInfo":"",14 "cityName":"贵阳",15 "content":"必须十分,借钱都要看的一部电影。",16 "filmView":false,17 "id":1045570589,18 "isMajor":false,19 "juryLevel":0,20 "majorType":0,21 "movieId":1208282,22 "nick":"nick",23 "nickName":"nickName",24 "oppose":0,25 "pro":false,26 "reply":0,27 "score":5,28 "spoiler":0,29 "startTime":"2018-11-22 23:52:58",30 "supportComment":true,31 "supportLike":true,32 "sureViewed":1,33 "tagList":{34 "fixed":[35 {36 "id":1,37 "name":"好评"

38 },39 {40 "id":4,41 "name":"购票"

42 }43 ]44 },45 "time":"2018-11-22 23:52",46 "userId":1871534544,47 "userLevel":2,48 "videoDuration":0,49 "vipInfo":"",50 "vipType":051 }52 ]53 }54 ​

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

nickName, cityName, content, startTime, score

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

1 defparseInfo(data):2 data = json.loads(html)['cmts']3 for item indata:4 yield{5 'date':item['startTime'],6 'nickname':item['nickName'],7 'city':item['cityName'],8 'rate':item['score'],9 'conment':item['content']10 }

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

1 defsaveCommentInfo(moveId, nikename, comment, rate, city, start_time)2 conn = sqlite3.connect('unknow_name.db')3 conn.text_factory=str4 cursor =conn.cursor()5 ins="insert into comments values (?,?,?,?,?,?)"

6 v =(moveId, nikename, comment, rate, city, start_time)7 cursor.execute(ins,v)8 cursor.close()9 conn.commit()10 conn.close()

数据处理

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

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

结果如下:

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

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

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

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

1 data = pd.read_csv(f,sep='{',header=None,encoding='utf-8',names=['date','nickname','city','rate','comment'])2 city = data.groupby(['city'])3 city_com = city['rate'].agg(['mean','count'])4 city_com.reset_index(inplace=True)5 data_map = [(city_com['city'][i],city_com['count'][i]) for i inrange(0,city_com.shape[0])]6 geo = Geo("GEO 地理位置分析",title_pos = "center",width = 1200,height = 800)7 whileTrue:8 try:9 attr,val =geo.cast(data_map)10 geo.add("",attr,val,visual_range=[0,300],visual_text_color="#fff",11 symbol_size=10, is_visualmap=True,maptype='china')12 ​13 exceptValueError as e:14 e = e.message.split("No coordinate is specified for")[1]15 data_map = filter(lambda item: item[0] !=e, data_map)16 else:17 break

18 geo.render('geo_city_location.html')

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

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

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

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

1 data = pd.read_csv(f,sep='{',header=None,encoding='utf-8',names=['date','nickname','city','rate','comment'])2 city = data.groupby(['city'])3 city_com = city['rate'].agg(['mean','count'])4 city_com.reset_index(inplace=True)5 fo = open("citys.json",'r')6 citys_info =fo.readlines()7 citysJson =json.loads(str(citys_info[0]))8 data_map_all = [(getRealName(city_com['city'][i], citysJson),city_com['count'][i]) for i inrange(0,city_com.shape[0])]9 data_map_list ={}10 for item indata_map_all:11 ifdata_map_list.has_key(item[0]):12 value =data_map_list[item[0]]13 value += item[1]14 data_map_list[item[0]] =value15 else:16 data_map_list[item[0]] = item[1]17 data_map = [(realKeys(key), data_map_list[key] ) for key indata_map_list.keys()]18 defgetRealName(name, jsonObj):19 for item injsonObj:20 ifitem.startswith(name) :21 returnjsonObj[item]22 returnname23 defrealKeys(name):24 return name.replace(u"省", "").replace(u"市", "")25 .replace(u"回族自治区", "").replace(u"维吾尔自治区", "")26 .replace(u"壮族自治区", "").replace(u"自治区", "")

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

1 defgenerateMap(data_map):2 map = Map("城市评论数", width= 1200, height = 800, title_pos="center")3 whileTrue:4 try:5 attr,val =geo.cast(data_map)6 map.add("",attr,val,visual_range=[0,800],7 visual_text_color="#fff",symbol_size=5,8 is_visualmap=True,maptype='china',9 is_map_symbol_show=False,is_label_show=True,is_roam=False,10 )11 exceptValueError as e:12 e = e.message.split("No coordinate is specified for")[1]13 data_map = filter(lambda item: item[0] !=e, data_map)14 else:15 break

16 map.render('city_rate_count.html')

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

1 data = pd.read_csv(f,sep='{',header=None,encoding='utf-8',names=['date','nickname','city','rate','comment'])2 #按评分分类

3 rateData = data.groupby(['rate'])4 rateDataCount = rateData["date"].agg([ "count"])5 rateDataCount.reset_index(inplace=True)6 count = rateDataCount.shape[0] - 1

7 attr = [rateDataCount["rate"][count - i] for i inrange(0, rateDataCount.shape[0])]8 v1 = [rateDataCount["count"][count - i] for i inrange(0, rateDataCount.shape[0])]9 bar = Bar("评分数量")10 bar.add("数量",attr,v1,is_stack=True,xaxis_rotate=30,yaxix_min=4.2,11 xaxis_interval=0,is_splitline_show=True)12 bar.render("html/rate_count.html")

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

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

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

导出:

.

python猫眼电影分析_Python 爬取猫眼电影《无名之辈》并对其进行数据分析相关推荐

  1. python怎么爬取电影海报_Python 爬取猫眼数据分析《无名之辈》为何能逆袭成黑马?...

    原标题:Python 爬取猫眼数据分析<无名之辈>为何能逆袭成黑马? 作者 | 罗昭成 责编 | 唐小引 出品 | CSDN(ID:CSDNNews) 最近几天,有部国产电影因好评及口碑传 ...

  2. python爬虫猫眼电影票房_python爬取猫眼电影top100排行榜

    爬取猫眼电影TOP100(http://maoyan.com/board/4?offset=90) 1). 爬取内容: 电影名称,主演, 上映时间,图片url地址保存到mariadb数据库中; 2). ...

  3. python爬取豆瓣电影评论_python 爬取豆瓣电影评论,并进行词云展示及出现的问题解决办法...

    def getHtml(url): """获取url页面""" headers = {'User-Agent':'Mozilla/5.0 ( ...

  4. python爬取豆瓣电影并分析_Python爬取豆瓣电影的短评数据并进行词云分析处理

    前言 对于爬虫很不陌生,而爬虫最为经典的案例就是爬取豆瓣上面的电影数据了,今天小编就介绍一下如果爬取豆瓣上面电影影评,以<我不是药神>为例. 基本环境配置 版本:Python3.6 相关模 ...

  5. python获取天气分析_Python爬取南京市往年天气预报,使用pyecharts进行分析

    上一次分享了使用matplotlib对爬取的豆瓣书籍排行榜进行分析,但是发现python本身自带的这个绘图分析库还是有一些局限,绘图不够美观等,在网上搜索了一波,发现现在有很多的支持python的绘图 ...

  6. python微博爬虫分析_python爬取和分析新浪微博(一):scrapy构建新浪微博榜单、博主及微博信息爬虫...

    1. 爬虫项目介绍 爬虫首先基于python scrapy 框架,使用了随机用户代理和IP代理等反爬技巧,将爬取到的微博领域数据,各领域榜单博主信息和博主的微博信息分别存入的mysql数据库对应的表格 ...

  7. python历史净值分析_Python 爬取基金历史净值数据

    # -*- coding: utf-8 -*- """ * DataSource : 天天基金网 (http://fund.eastmoney.com/161005.ht ...

  8. python战反爬虫:爬取猫眼电影数据 (一)(Requests, BeautifulSoup, MySQLdb,re等库)

    姓名:隋顺意 博客:Sui_da_xia 微信名:世界上的霸主 本篇文章未涉及猫眼反爬,主要介绍爬取无反爬内容,战反爬内容请去 python战反爬虫:爬取猫眼电影数据 (二)(Requests, Be ...

  9. python战反爬虫:爬取猫眼电影数据 (二)(Requests, BeautifulSoup, MySQLdb,re等库)

    姓名:隋顺意 博客:Sui_da_xia 微信名:世界上的霸主 本文主要介绍破解反爬,可以先去上一篇观看爬取无反爬内容 python战反爬虫:爬取猫眼电影数据 (一)(Requests, Beauti ...

最新文章

  1. Linux对文件内容基本操作(学习笔记七)
  2. python数据库模糊查询_原创:Python编写通讯录,支持模糊查询,利用数据库存储...
  3. oc-14-对象方法调用类方法
  4. 使用增量备份修复DG中的GAP
  5. 【翻译】Pro.Silverlight.5.in.CSharp.4th.Edition - 第三章 布局 03
  6. process launch failed: Security
  7. 新手学习嵌入式需要掌握的几点知识点
  8. 关于树的父子节点的图形化展示
  9. 机器学习-吴恩达-笔记-6-应用机器学习的建议
  10. Android中的Handler的机制与用法详解
  11. python查看模块的方法_python 查看某个模块都有什么方法
  12. [原]Jenkins(二十一) jenkins再出发Build periodically和Poll SCM
  13. jQuery 知识点大纲
  14. linux iptable 使用指南
  15. WORD打印时显示错误,未定义标签?
  16. 苹果id注册显示无法连接服务器失败原因,apple id连接服务器失败怎么办
  17. 【presto】函数大全
  18. OTA更新利用CRC保证程序的完整性
  19. 红外光谱曲线的基线调整
  20. 【python】简单使用selenium编写无界面谷歌浏览器的网页登录和签到功能

热门文章

  1. dedecms怎么改php版本_一键建站系列教程(宝塔面板+DeDeCMS)
  2. css样式大全(整理版)
  3. 课工场与阿里云签订合作协议 共同培养云计算专业人才
  4. 【微信小程序】—— swiper轮播图圆角滑动会先直角再圆角的解决办法
  5. mysql-索引-马士兵教育
  6. 【福利】送编程日历,GitChat 祝你新年无 BUG
  7. 通信历史和原理科普:电话和手机是如何打通的?
  8. 华为战略规划落地的核心:VDBD(价值驱动业务设计模型) 盈利模式(利润模型)详细介绍
  9. Chrome 浏览器 Adobe Flash Plugs 过期
  10. 这 9款 日志管理工具大比拼,选型必备!