最近几天,有部国产电影因好评及口碑传播而开始异军突起以黑马之势逆袭,在朋友圈以及微博上都会不时看到相关内容,那便是由陈建斌、任素汐等主演的《无名之辈》。这样一部没有什么特别大牌或流量明星,甚至名称与海报都没有什么特色的国产电影却引起了很多人的注意,更是在评分上直接将同期的如《毒液》、《神奇动物:格林德沃之罪》给 PK 了下去。这部剧从 16 日上映到现在,豆瓣评分 8.3 分,其中 5 星好评占 34.8%,而在猫眼上好评则直接超过了 50%。看这个数据,还是一部不错的国产剧。在一个貌似平常的日子,笔者用着一台低配的 Mac 电脑跑了一下《无名之辈》猫眼的评论数据,来看看这部小成本喜剧片究竟值不值得看。

需要特别说明一下,为什么要用猫眼的数据,而不用豆瓣的?主要还是因为豆瓣是直接渲染的 HTML,而猫眼的数据是 JSON,处理起来比较方便。

获取猫眼接口数据

作为一个长期宅在家的程序员,对各种抓包简直是信手拈来。在 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.textreturn 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=strcursor = 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

结果如下:

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

不仅如此,还可以使用更多的 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')
<span class="token keyword">except</span> ValueError <span class="token keyword">as</span> e<span class="token punctuation">:</span>e <span class="token operator">=</span> e<span class="token punctuation">.</span>message<span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token string">"No coordinate is specified for "</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span>data_map <span class="token operator">=</span> <span class="token builtin">filter</span><span class="token punctuation">(</span><span class="token keyword">lambda</span> item<span class="token punctuation">:</span> item<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">!=</span> e<span class="token punctuation">,</span> data_map<span class="token punctuation">)</span>
<span class="token keyword">else</span> <span class="token punctuation">:</span><span class="token keyword">break</span>

geo.render(‘geo_city_location.html’)

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

使用 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]] = valueelse: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 :breakmap.render('city_rate_count.html')

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

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% 的五星数据好很多。

从以上观众分布和评分的数据可以看到,这一部剧,观众朋友还是非常地喜欢。前面,从猫眼拿到了观众的评论数据。现在,笔者将通过 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爬取猫眼数据分析《无名之辈》相关推荐

  1. Python 爬取猫眼数据分析《无名之辈》为何能逆袭成黑马?

    本文首发在 CSDN 微信(ID:CSDNNews). 最近几天,有部国产电影因好评及口碑传播而开始异军突起以黑马之势逆袭,在朋友圈以及微博上都会不时看到相关内容,那便是由陈建斌.任素汐等主演的< ...

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

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

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

    前言 作者: 罗昭成 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 http://note.youdao.com/noteshare?id=3054cce4add8a909e7 ...

  4. python实战(一)Python爬取猫眼评分排行前100电影及简单数据分析可视化python实战(一)Python爬取猫眼排行前一百电影及简单数据分析可视化

    python实战(一)Python爬取猫眼排行前一百电影及简单数据分析可视化 一.抓取数据 需要的库 request库 响应http请求 json库 将文本保存成json形式 pyquery 类似JQ ...

  5. python实战(一)Python爬取猫眼评分排行前100电影及简单数据分析可视化

    python实战(一)Python爬取猫眼排行前一百电影及简单数据分析可视化 一.抓取数据 需要的库 request库 响应http请求 json库 将文本保存成json形式 pyquery 类似JQ ...

  6. python爬取电影评分_用Python爬取猫眼上的top100评分电影

    代码如下: # 注意encoding = 'utf-8'和ensure_ascii = False,不写的话不能输出汉字 import requests from requests.exception ...

  7. (伪)Python爬取猫眼电影(反反爬虫过程中遇到的坑)

    Python爬取猫眼电影 1.打开一个猫眼电影的URL,例如本月的较火的电影<毒液:致命守护者>http://maoyan.com/films/42964 直接F12,查看审核元素,发现上 ...

  8. python爬取猫眼电影数据

    每天一点点,记录学习每一步 近期爬虫项目: 1:python 爬取菜鸟教程python100题,百度贴吧图片反爬虫下载,批量下载 2:python爬虫爬取百度贴吧图片,requests方法 3:pyt ...

  9. 利用python爬取猫眼电影,分析《大侦探皮卡丘》|凹凸数读

    利用python爬取猫眼电影,分析<大侦探皮卡丘>,看看当皮卡丘长出绒毛,"丑拒"还是"真香"都在猫眼短评里了. 本文首发于微信公众号<凹凸数 ...

最新文章

  1. numpy数组切片:一维/二维/数组
  2. SIG Cloud Provider Alibaba 网研会第 2 期顺利召开 | 云原生生态周报 Vol. 46
  3. 【LIBSVM中的 SVMcgForClass提示不存在的解决方法】
  4. 讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候, 他们的执行顺序
  5. php delete和truncate,TRUNCATE 删除表,无法回退。默认选择为整个表的内容,所以不能加条件。...
  6. Bootstrap 标准的分页导航
  7. 小时候有哪些丑事,让你终身难忘?
  8. 自学python-自学编程的6种方法,自学Python
  9. 大部头出版物排版软件
  10. 戴尔微型计算机3048,戴尔5460一体机拆解,戴尔3048一体机
  11. 【Minecraft开服教程】使用 MCSM 面板一键搭建我的世界服务器,并内网穿透公网远程联机
  12. SQL中可以用来算时间差的函数
  13. 榕树贷款 探索人工智能技术 打造金融机构转型新引擎
  14. pymysql的mysql补丁_MySQL 的增删改查以及 pymysql 的使用
  15. Linux 压缩文件与命令
  16. ubuntu添加用户
  17. 【FPGA黑金开发板】发布第二代黑金核心板 HJ-II-CORE
  18. 深入分析:Onliner SpamBot7.11亿电邮账号泄露事件
  19. 倾斜摄影后处理软件 Linux版,正射影像倾斜摄影测量软件相关软件汇总
  20. c语言 指针 字符串 回文 strcmp,【查找字符串面试题】面试问题:C语言指针题集… - 看准网...

热门文章

  1. 教你如何零基础学习视频剪辑,干货满满
  2. 面试题61. 扑克牌中的顺子
  3. 马丁福勒《UML精粹》读书笔记_第一章
  4. 高情商的王维注解了低政商孟浩然的后半生
  5. mc服务器领地位置,服务器领地amp;地皮指令大全 183独家汇总_18183我的世界专区...
  6. 虚拟机VMware 安装centos、常规配置、共享文件等
  7. FYD-Focus Your Distribution-关注你的分布:异常检测和定位的从粗到细的非对比性学习-FYD
  8. PAT甲级 1027 Colors in Mars (20分)
  9. Cent os 快捷键设置
  10. ActiveMQ点对点消息传递