今年的国庆电影市场还是比较旺盛的。起到了很好的带动作用。《姜子牙》首日突破2亿,打破了《哪吒之魔童降世》在中国电影市场保持的动画电影首日票房纪录。但由于后续口碑下滑,无论是口碑还是票房都已经被《我和我的家乡》彻底超越,不出意外的话,《我和我的家乡》将是今年的最大赢家国庆档。从上图我们可以看到,《我和我的家乡》目前在猫眼上的评分为29.6万,综合评分9.3,可以说是相当不错的成绩了。本篇我们爬取了该片的猫眼影评,一起分析。内容在视频评论区。爬取首先我们来爬取猫眼影评数据,因为PC端只能看到猫眼的几条评论,所以我们需要使用APP接口进行爬取,接口格式为:http://m.maoyan.com/mmdb/comments/movie/movieid.json?_v_=yes&offset=15&startTime=xxx,两个参数说明如下:movieid:网站上每部电影的唯一idstartTime:当前页面第一次评论的时间,每个页面有15条爬取评论的主要实现代码如下:#获取页面内容defget_page(url):headers={'user-agent':'Mozilla/5.0(iPhone;CPUiPhoneOS11_0likeMacOSX)AppleWebKit''/604.1.38(KHTML,likeGecko)Version/11.0Mobile/15A372Safari/604.1','accept':'*/*'}try:r=requests.get(url,headers=headers)r.raise_for_status()returnr.textexceptrequests.HTTPErrorase:print(e)exceptrequests.RequestExceptionase:print(e)except:print("Anerroroccurred")#解析接口返回数据defparse_data(html):json_data=json.loads(html)['cmts']comments=[]#解析数据并将其存储在数组中try:foriteminjson_data:comment=[]comment.append(item['nickName'])#昵称常见t.append(item['cityName']if'cityName'initemelse'')#citycomment.append(item['content'].strip().replace('\n',''))#内容comment.append(item['score'])#starcomment.append(item['startTime'])comment.append(item['time'])#日期comment.append(item['approve'])#Likescomment.append(item['reply'])#repliesif'gender'initem:comment.append(item['gender'])#gendercomments.append(comment)返回评论exceptexceptase:print(comment)print(e)#保存数据,写入csvdefsave_data(comments):filename='comments.csv'dataObject=pd.DataFrame(comments)dataObject.to_csv(filename,mode='a',index=False,sep=',',header=False,encoding='utf_8_sig')在这篇文章中,我们爬取了大约2w条评论数据,并将爬取的数据保存在一个csv文件中数据分析评分星首先我们来看一下爬取到的数据中各个评分星的占比。主要实现代码如下:#RatingStarrates=[]forsindf.iloc[:,3]:rates.append(s)sx=[“五星级”、“四星级”、“三星级”、“两星级”、“一星级”]sy=[str(rates.count(5.0)+rates.count(4.5)),str(rates.count(4.0)+rates.count(3.5)),str(rates.count(3.0)+rates.count(2.5)),str(rates.count(2.0)+rates.count(1.5)),str(rates.count(1.0)+rates.count(0.5))](Pie(init_opts=opts.InitOpts(theme=ThemeType.CHALK,width='700px',height='400px')).add("",list(zip(sx,sy)),radius=["40%","70%"]).set_global_opts(title_opts=opts.TitleOpts(title="评分星级比例",subtitle="数据来源:猫眼电影",pos_left="left")).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%",font_size=12))).render_notebook()效果如下:从图中我们可以看出,近90%的人给影片打了5星,1、2、3星的总比例只有5%左右,说明影片的质量这部电影得到了大多数人的认可。性别比例让我们看看评论者的性别。主要实现代码如下:#Genderratiorates=[]forsindf.iloc[:,8]:ifs!=1ands!=2:s=3rates.append(s)gx=[“男性”,“女性”,“未知”]gy=[rates.count(1),rates.count(2),rates.count(3)](Pie(init_opts=opts.InitOpts(theme=ThemeType.CHALK,width="700px",height="400px")).add("",list(zip(gx,gy))).set_global_opts(title_opts=opts.TitleOpts(title="性别比例",subtitle="数据来源:猫眼电影",pos_left="left")).set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%",font_size=12))).render_notebook()的效果如下如下:从上图我们可以发现,大部分人都比较注重自己的隐私,不会暴露自己的性别。通过性别可见的数据,我们可以发现男性和女性在评论区的活跃度更高。走近一点,女性略高。位置分布让我们看看评论者的位置分布。首先我们来看前100条评论的位置坐标。主要代码实现如下:cities=[]forcityindf.iloc[:,1]:ifcity!="":cities.append(city)data=Counter(cities).most_common(100)gx1=[]gy1=[]forcindata:gx1.append(c[0])gy1.append(c[1])geo=Geo(init_opts=opts.InitOpts(width="700px",height="400px",theme=ThemeType.DARK,bg_c??olor="#404a59"))(geo.add_schema(maptype="china",itemstyle_opts=opts.ItemStyleOpts(color="#323c48",border_color="#111")).add("评论数",list(zip(gx1,gy1))).set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts(toolbox_opts=opts.ToolboxOpts,title_opts=opts.TitleOpts(title="位置分布地理坐标",subtitle="数据来源:猫眼电影",pos_left="left"),visualmap_opts=opts.VisualMapOpts(max_=500,is_piecewise=True))).render_notebook()效果如下:接下来我们使用直方图显示评论最多的前15个城市。主要代码实现如下:data_top15=Counter(cities).most_common(15)gx2=[]gy2=[]forcindata_top15:gx2.append(c[0])gy2.append(c[1])(Bar(init_opts=opts.InitOpts(theme=ThemeType.CHALK,width="700px",height="400px")).add_xaxis(gx2).add_yaxis("",gy2).set_global_opts(title_opts=opts.TitleOpts(title="城市源TOP15",subtitle="数据来源:猫眼电影",pos_left="center"))).render_notebook()效果如下:通过上面两张图,我们可以直观的看出哪些城市的人都是在影片下的评论数,然后就可以据此知道对影片的兴趣程度及时评论数我们来看一下24小时内的评论数。主要代码如下:times=df.iloc[:,5]hours=[]fortintimes:hours.append(str(t[11:13]))hdata=sorted(Counter(hours).most_common())hx=[]hy=[]forcinhdata:hx.append(c[0])hy.append(c[1])(Line(init_opts=opts.InitOpts(theme=ThemeType.CHALK,width="700px",height="400px")).add_xaxis(hx).add_yaxis("",hy,aareastyle_opts=opts.AreaStyleOpts(opacity=0.5)).set_series_opts(label_opts=opts.LabelOpts(is_show=False)).set_global_opts(title_opts=opts.TitleOpts(title="24小时评论数",subtitle="数据来源:猫眼电影",pos_left="center"))).render_notebook()效果如下:从图中可以看出,下午到晚上大家比较活跃,因为19点左右是晚餐时间,这段时间评论数下降也是合理的。主要演员我们来看看评论区提到的主要演员(包括他们的角色)。主要代码如下:cts_list=df.iloc[:,2]cts_str="".join([str(i)foriincts_list])px=["HuangBo","WangBaoqiang","Liu昊然、葛优、刘敏涛、范伟、张译、邓超、闫妮、沉腾、马丽]py=[cts_str.count("黄渤")+cts_str.count("黄大宝"),cts_str.count("王宝强")+cts_str.count("老唐"),cts_str.count("刘昊然")+cts_str.count("小秦"),cts_str.count("葛优")+cts_str.count("张北京"),cts_str.count("刘敏涛")+cts_str.count("玲子"),cts_str.count("范伟")+cts_str.count("老范"),cts_str.count("张译")+cts_str.count("蒋倩倩"),cts_str.count("邓超")+cts_str.count("乔树林"),cts_str.count("闫妮")+cts_str.count("燕飞燕"),cts_str.count("沉腾")+cts_str.count("马良"),??cts_str.count("马丽")+cts_str.count("秋霞")](Bar(init_opts=opts.InitOpts(theme=ThemeType.CHALK,width="700px",height="400px")).add_xaxis(px).add_yaxis("",py).set_global_opts(title_opts=opts.TitleOpts(title="主要演员及其角色被提及次数",subtitle="数据来源:猫眼电影",pos_left="center")))。使成为_notebook()的效果如下:从图中可以看出,评论区出现次数前三的主要演员分别是:沉腾、范伟和邓超,进一步说明这几位演员的人气比较高,引起了大家的关注。评论区多多关注。大家热议的电影单元,我们来看看评论区对每个电影单元的提及情况。主要代码实现如下:mx=["天上掉下一个UFO","北京好人","最后一课","回乡之路","马良"]my=[cts_str.count("天上掉下一个不明飞行物"),cts_str.count("北京好人"),cts_str.count("最后一课"),cts_str.count("回乡之路"),cts_str.count("马亮马亮")](Bar(init_opts=opts.InitOpts(theme=ThemeType.DARK,width="700px",height="400px")).add_xaxis(mx).add_yaxis("",my).set_global_opts(title_opts=opts.TitleOpts(title="电影单位提及",subtitle="",pos_left="center")))。render_notebook()的效果如下:从图中我们可以看出电影单元《最后一课》被提及的次数超过了其他单元被提及的总和,可见其知名度比较高,引起了大家的共鸣,欣欣向荣的感觉。词云展示整体词云首先我们来看一下整体评论的词云。代码实现如下:cts_list=df.iloc[:,2]cts_str="".join([str(i)foriincts_list])stylecloud.gen_stylecloud(text=cts_str,max_words=400,collocations=False,font_path="SIMLI.TTF",icon_name="fasfa-home",size=800,output_name="total.png")Image(filename="total.png"),效果如下:来自图片,我们可以直观的看到:好看、很好看、值得一看、不错、上一课等被提及的次数较多,说明大部分人对影片比较满意,电影单元的最后一课是比较受欢迎,引起了很多人的共鸣。热评词云最后我们来看一下热评词云(点赞和回复多的评论)。代码实现如下:hot_str=""forindex,rowindf.iterrows():content=row[2]support=row[6]reply=row[7]if(support>30):hot_str+=内容elif(回复>5):hot_str+=contentstylecloud.gen_stylecloud(text=hot_str,max_words=200,collocations=False,font_path="SIMLI.TTF",icon_name="fasfa-fire",size=800,output_name="hot.png")Image(filename="hot.png")效果如下:这个热门评论的画风和之前的有点不一样,最醒目的(最大)的字是:UFO,丑,我没看电影,开场前十分钟就和搭档分手了……最后这个就不多说了,大家自己感受一下吧~因为评论收集了数据有限,与实际情况可能存在一定偏差,请大家理性对待。公众号Python小二后台回复201005获取源码。
