截止到 8 月 20 日,《战狼Ⅱ》上映的第 25 天,它的票房已超 50 亿人民币,真正成为唯一一部挺进世界影史票房前 100 名的亚洲电影。
抛开爆炸的票房不说,电影还激起了观众各种情绪,甚至有人放狠话说:敢喷《战狼Ⅱ》的,要么是智障,要么是公敌,就是这么简单粗暴。
大家对《战狼Ⅱ》褒贬不一,纷纷在豆瓣短评上面留言,表达自己对这部电影的看法。尽管各路评论出街,媒体闹得沸沸扬扬,观众还是傻傻分不清楚哪边意见比较靠谱。
截至目前已经有超过十五万的评论,在你看评论的时候,你可能在一段时间里看到的大部分是表扬或者是贬低的评论。
那么通过浏览评论我们很难看出大家对于这部电影的总体情况。现在让我们通过数据分析的方法看看在这些评论中究竟发生了什么有趣的事情!
本文通过 Python 爬虫的方式获取数据,对豆瓣电影评论进行分析,制作了豆瓣影评的云图。
现在,让我们来看看,《战狼Ⅱ》评论里到底藏着哪些有趣的潜台词。
数据的获取
本文采用的是 Python 爬虫的方式获取的数据,用到的主要是 requests 包与正则包 re,该程序并未对验证码进行处理。
之前也爬取过豆瓣的网页,当时由于爬取的内容少,所以并没有遇到验证码的事情。
在写本文爬虫的时候,原以为也不会有验证码,但是当爬取到大概 15000 个评论的时候跳出来验证码。
然后我就想不就是十二万吗?最多我也就是输入大概十几次验证码,所以就没有处理验证码的事情。
但是接下来的事情就有点坑到我了,爬取 15000 左右评论并输入验证码的时候,我以为会接下来爬取到 30000 左右,可是才爬了 3000 左右就不行了,还是要输验证码。
然后就一直这样,跌跌撞撞,有时候爬取好长时间才需要验证码,有时候则不是。不过最后还是把评论爬取下来了。
爬取的内容主要是:用户名,是否看过,评论的星星点数,评论时间,认为有用的人数,评论内容。
以下是 Python 爬虫的代码:
| import requests
import re
import pandas as pd
url_first = 'https://movie.douban.com/subject/26363254/comments?start=0'
head = { 'User-Agent' : 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko
) Ubuntu Chromium/59.0.3071.109 Chrome/59.0.3071.109 Safari/537.36' }
html = requests.get(url_first,headers = head,cookies = cookies)
cookies = { 'cookie' : '你自己的cookie' }
ren = re. compile (r '(.*?).*?comment">(.*?).*?.*?
class="">(.*?).*?(.*?).*?title="(.*?)">.*?title="(.*?)">.*?class=""> (.*?)\n' ,re.S)
while html.status_code = = 200 :
url_next = 'https://movie.douban.com/subject/26363254/comments' + re.findall(
reg,html.text)[ 0 ]
zhanlang = re.findall(ren,html.text)
data = pd.DataFrame(zhanlang)
data.to_csv( '/home/wajuejiprince/文档/zhanlang/zhanlangpinglun.csv' , header = False ,index = False ,mode = 'a+' )
data = []
zhanlang = []
html = requests.get(url_next,cookies = cookies,headers = head)
|
以上代码注意设置你自己的 User-Agent,Cookie,CSV 保存路径等。
爬取的内容保存成 CSV 格式的文件,保存的文件内容如下:
数据清洗
本文用 R语言来处理数据,虽然在爬取的时候已经非常注意爬取内容的结构了,但是还是不可避免的有一些值不是我们想要的。
比如有的评论内容会出现在评论者这一项中,所以还是有必要进行一下数据的清洗。
首先加载要用到的所有包:
1 2 3 4 5 6 | library(data.table)
library(plotly)
library(stringr)
library(jiebaR)
library(wordcloud2)
library(magrittr)
|
导入数据并清洗:
| dtfile .choose())
dt[,c( "V8" , "V9" , "V10" , "V11" , "V12" , "V13" ):=NULL]
my_dt"d+" )][评论有用== '有用' ][是否看过== "看过" ][五星数% in %c( "很差" , "较差" , "还行" , "推荐" , "力荐" )]
|
数据浅析
先来看一看通过星星数评论的情况:
| plot_ly(my_dt[,.(.N),by=.(五星数)], type = 'bar' ,x=~五星数,y=~N)
|
五角星的个数对应 5 个等级,5 颗星代表力荐,4 颗星代表推荐,3 颗星代表还行,2 颗星代表较差,1 颗星代表很差。
通过五角星的评论显而易见,我们有理由相信绝大部分观看者对这部影片持满意态度。
对评论结果的云图展示
首先我们应该先进行评论的分词:
1 2 3
4 5 6 7 8 9 10 11 12 | wk < - worker()
sw< - function(x){wk< = x}
segwords< - lapply(my_dt[,评论内容],sw)
my_segwords< - unlist(segwords)
st< - readLines( file .choose())
stopwords< - c(NULL)
for (i in 1 :length(st))
{
stopwords[i]< - st[i]
}
seg_Words< - filter_segment(my_segwords,stopwords)
|
总体评论云图展示:
1 2 3 4 | words< - table(seg_Words) % > % data.table()
setnames(words, "N" , "pinshu" )
words[pinshu> 1000 ]
wordcloud2(words[pinshu> 1000 ], size = 2 , fontFamily = "微软雅黑" ,color = "random-light" , backgroundColor = "grey" )
|
由于数据太多,导致我的破电脑卡顿,所以在制作云图的时候去掉了频数低于 1000 的词汇。
云图结果如下:
整体来看,大家对这不影片的评论还是不错呀!剧情,动作,爱国等话题是大家谈论的焦点。
评价关键词:吴京、个人英雄主义、主旋律、中国、主角光环、达康书记、很燃。
可见,“燃”并不是看完之后的最多反馈,观众更多是对吴京本人的赞叹,以及对爱国主义和个人主义的评价。
不同评论等级的云图展示
但是如果把不同评价的人的评论分别展示会是什么样子呢?也就是对五个等级(力荐,推荐,还行,较差,很差)的评论内容制作云图,代码如下(只要改变代码中力荐为其他即可):
1. 力荐的评论人的评论云图
2. 推荐的评论人的评论云图
3. 还行的评论人的评论云图
4. 较差的评论人的评论云图
5. 很差的评论人的评论云图
结论
从不同的评论的分词结果来看,他们都有一个共同的话题:爱国。
在力荐的评论中可能爱国话题的基数比很差的评论中的多,在力荐的评论中人们更愿意讨论的是爱国话题之外的事情。在很差的评论中人们讨论的大多是爱国话题。而且他们占的比例很有意思,从力荐的人到评论很差的人,爱国话题的比例逐渐增加。
我们不能主观的认为谁对谁错,只能说他们站在的角度不一样,所以看到的结果也不太一样。当我们和别人意见不同时,往往是所处的角度不同。评论很差的人考虑的更多的是爱国的话题吧(这里只是爱国话题的讨论,并不是谁爱不爱国)!!
分析完了,这部《战狼2》之所以能获得这么多人的支持,根本原因还是在于从制作上实现了《战狼1》所没有的美国大片级大场面,同时在爱国主义上引起了共鸣,激起了民心。
推荐阅读:
爬虫进阶:反爬策略的应对机制
真正受过教育的人应该具备的思维方式
40行代码的人脸识别实践
Python的基础语法回顾
经验 | Python爬虫基础
给Python初学者的一些技巧
自学Python如何少走弯路
学Python经历的坑