欢迎关注天善智能 hellobi.com,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习、问答、求职,一站式搞定!
对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。
温馨提示:如果想要本文爬取的豆瓣评论的数据请在评论区留下邮箱或联系文末作者!】
最近<<战狼Ⅱ>>异常火爆。《战狼Ⅱ》是吴京执导的动作军事电影,由吴京、弗兰克·格里罗、吴刚、张翰、卢靖姗、丁海峰等主演。该片于2017年7月27日在中国内地上映。2017年8月11日凌晨,《战狼2》票房(含服务费)突破40亿元,打破《美人鱼》此前创下的33.92亿元记录,打破国产电影历史最高票房纪录。
电影上映过后,大家褒贬不一。纷纷在豆瓣短评上面留言,表达自己对这部电影的看法。截至目前【2017.08.11】已经有十五万左右的评论。在你看评论的时候,你可能在一段时间里看到的大部分是表扬或者是贬低的评论,那么通过浏览评论我们很难看出大家对于这部电影的总体情况。现在让我们通过用数据分析的方法看看在这些评论中究竟发生了什么有趣的事情!
数据的获取
对于数据的获取,本文采用的是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'
}
#也就是找到你的账号对应的cookie
reg
=
re
.
compile
(
r')#下一页 ren=re.compile(r'(.*?).*?comment">(.*?).*?.*? (.*?).*? (.*?) .*?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+' ) #写入csv文件,'a+'是追加模式 data = [] zhanlang = [] html = requests . get ( url_next , cookies = cookies , headers = head )
以上代码注意设置你自己的User-Agent,Cookie,CSV保存路径等。
爬取的内容保存成CSV格式的文件。保存的文件内容如下:
数据清洗
本文用R语言来处理数据。虽然在爬取的时候已经非常注意爬取内容的结构了,但是还是不可避免的有一些值不是我们想要的,比如有的评论内容会出现在评论者这一项中。所以还是有必要进行一下数据的清洗。
首先加载要用到的所有包:
library
(
data
.
table
)
library
(
plotly
)
library
(
stringr
)
library
(
jiebaR
)
library
(
wordcloud2
)
library
(
magrittr
)
导入数据并清洗:
dt<-fread(file.choose())
#导入数据 dt[,c(
"V8",
"V9",
"V10",
"V11",
"V12",
"V13"):=NULL]
#删除空列
#一条命令清洗数据 my_dt<-dt[str_detect(赞成评论数,
"\\d+")][评论有用==
'有用'][是否看过==
"看过"][五星数
%in
%c(
"很差",
"较差",
"还行",
"推荐",
"力荐")]
数据浅析
先来看一看通过星星数评论的情况:
plot_ly(my_dt[,.(.N),by=.(五星数)],type = 'bar',x=~五星数,y=~N)
五角星的个数对应5个等级,5颗星代表力荐,4颗星代表推荐,3颗星代表还行,2颗星代表较差,1颗星代表很差。通过五角星的评论显而易见。我们有理由相信绝大部分观看者对这部影片持满意态度。
对评论结果的云图展示:
首先我们应该先进行评论的分词
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)
#去除中文停止词
总体评论云图展示
words<-table(seg_Words)%>%data.table() setnames(words,
"N",
"pinshu") words[pinshu>
1000]
#去除较低频数的词汇(小于1000的) wordcloud2(words[pinshu>
1000], size =
2, fontFamily =
"微软雅黑",color =
"random-light", backgroundColor =
"grey")
由于数据太多,导致我的破电脑卡顿,所以在制作云图的时候去掉了频数低于1000的词汇。
云图结果如下:
整体来看,大家对这不影片的评论还是不错呀!剧情,动作,爱国等话题是大家谈论的焦点。但是如果把不同评价的人的评论分别展示会是什么样子呢?
不同评论等级的云图展示
也就是对五个等级(力荐,推荐,还行,较差,很差)的评论内容制作云图。代码如下(只要改变代码中力荐为其他即可):
力荐的评论人的评论云图
2.推荐的评论人的评论云图
3.还行的评论人的评论云图
4.较差的评论人的评论云图
5.很差的评论人的评论云图
结论:
从不同的评论的分词结果来看,他们都有一个共同的话题:爱国。在力荐的评论中可能爱国话题的基数比很差的评论中的多,在力荐的评论中人们更愿意讨论的是爱国话题之外的事情。在很差的评论中人们讨论的大多是爱国话题。而且他们占的比例很有意思,从力荐的人到评论很差的人,爱国话题的比例逐渐增加。我们不能主观的认为谁对谁错,只能说他们站在的角度不一样,所以看到的结果也不太一样。当我们和别人意见不同时,往往是所处的角度不同。评论很差的人考虑的更多的是爱国的话题吧(这里只是爱国话题的讨论,并不是谁爱不爱国)!!
天善学院svip包含Excel BI、Python爬虫案例、Python机器学习、Python数据科学家、大数据、数据分析报告、数据分析师体系、深度学习、R语言案例10套课程火爆报名中,欢迎大家关注 www.hellobi.com/svip
转载请保留以下内容:
本文来源自天善社区面包君老师的博客(公众号)。
原文链接:https://ask.hellobi.com/blog/dataman/9520
还没有评论,来说两句吧...