查看原文
其他

Python 爬取猫眼千页评论,分析《狄仁杰之四大天王》是否值得一看

胡萝卜酱 CSDN 2018-08-21

作为徐老怪的忠实影迷,《狄仁杰之四大天王》肯定是要去看的。看豆瓣评分和前两部相差不多,所以本文就简单分析了一下《狄仁杰》的影评。



数据爬取


本来笔者是打算爬取豆瓣的全部影评,但是很不幸,数据爬取到一半,我的账号被封了(建议大家改为动态IP进行爬取),于是转战于猫眼。猫眼的短评不能直接通过源码获得,需要寻找它的数据接口,如下:

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

其中341516属于电影的专属ID,offset代表页数且只展示1000页的内容,同时仅限于当日的评论。此文只为做影评分析演示,所以笔者只爬取了今日的评论,去重后仅为几百条,建议大家多爬取今天的数据,再做分析。

代码如下:

import requests
import json
import time
import random

#下载一页数据
def get_one_page(url):
    headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
    }
    response = requests.get(url,headers=headers)
    if response.status_code == 200:  #页面正常响应
        return response.text # 返回页面源代码
    return None

#解析一页数据
def parse_ono_page(html):
    data = json.loads(html)['cmts'#评论以json形式存储,故以json形式截取
    for item in data:
        yield#该方法返回一个字典
            'comment':item['content'],
            'date':item['time'].split(' ')[0],
            'rate':item['score'],
            'city':item['cityName'],
            'nickname':item['nickName']
        }

#保存数据到文本文档
def save_to_txt():
    for i in range(11001):
        url='http://m.maoyan.com/mmdb/comments/movie/341516.json?_v_=yes&offset=' + str(i)
        html = get_one_page(url)
        print('正在保存第%d页.'% i)
        for item in parse_ono_page(html):
            with open('狄仁杰.txt','a',encoding='utf-8'as f:
                f.write(item['date'] + ',' + item['nickname'] + ',' + item['city'] + ',' +str(item['rate'])+','+item['comment']+'\n')
        #反爬
        time.sleep(5 + float(random.randint(1,100)) /20

# 获取的评论可能有重复,为了最终统计的真实性,需做去重处理
def delete_repeat(old,new):
    oldfile = open(old,'r',encoding='UTF-8')
    newfile = open(new,'w',encoding='UTF-8')
    content_list = oldfile.readlines() #读取的数据集
    content_alreadly_ditinct = [] #存储不重复的评论数据
    for line in content_list:
        if line not in content_alreadly_ditinct: #评论不重复
            newfile.write(line+'\n')
            content_alreadly_ditinct.append(line)

if __name__ =='__main__':
    save_to_txt()
    delete_repeat(r'狄仁杰.txt'r'狄仁杰_new.txt')


爬取数据如下:



数据分析


直观来看,有用的数据仅为城市、评分和评论。我们分别采用热力图、柱状图和云图来进行可视化分析。

观影者分布热力图 

根据观影者的城市,我们画出了观影者分布情况:

可明显发现东部地区,尤其是北京、上海、广东,成都等城市最为突出,当然,这和经济发展有着重要的联系,也符合我们的常规想法。

代码如下:

from wordcloud import WordCloud, STOPWORDS
import pandas as pd
import jieba
import matplotlib.pyplot as plt
import seaborn as sns
from pyecharts import Geo

f = open('狄仁杰_new.txt',encoding='UTF-8')
data = pd.read_csv(f,sep=',',header=None,encoding='UTF-8',names=['date','nickname','city','rate','comment'])

city = data.groupby(['city'])
rate_group = city['rate']
city_com = city['city'].agg(['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("狄仁杰",title_color="#fff",title_pos="center",width=1200,
          height=600,background_color="#404a59")

while True
    try:
        attr, val = geo.cast(data_map)
        geo.add("", attr, val, visual_range=[050], visual_text_color="#fff", is_geo_effect_show=False,
                is_piecewise=True, visual_split_number=6, symbol_size=15, is_visualmap=True)

    except ValueError as e:
        e = str(e)
        e = e.split("No coordinate is specified for ")[1]  # 获取不支持的城市名称
        for i in range(0,len(data_map)):
            if e in data_map[i]:
                data_map.pop(i)
                break
    else:
        break
geo.render('狄仁杰.html')


评分柱状图 

相较于豆瓣的评分机制,猫眼的评分机制允许给出半星的评价,于是通过简单的柱状图来大概看一下评分情况。

大部分的评分都高于3分,给出满分的最多,只有少数的观影者给出了低分,看来徐克这部电影的口碑还行,至少在及格线以上。那大家观完影,最直观的感受是什么呢,下面就通过短评分析来看看。

代码如下:

#评分分析
rate = data['rate'].value_counts()

sns.set_style("darkgrid")
bar_plot = sns.barplot(x=rate.index,y=(rate.values/sum(rate)),palette="muted")
plt.xticks(rotation=90)
plt.show()


短评词云图 

为了分析短评,我们采用jieba对短评进行了分词,然后做出词云图。

背景图:

词云图:

和前两部一样,最突出的是特效、剧情和徐老怪,看来这部电影的特效做得很棒,徐老怪的个人风格也展示得淋漓尽致。同时,也能发现好看、不错、推荐也是观影者的主要感受,看来还是蛮值得去看的。

代码如下:

#分词
comment = jieba.cut(str(data["comment"]),cut_all=False)
wl_space_split= " ".join(comment)
#导入背景图
backgroud_Image = plt.imread('xuke.jpg')
stopwords = STOPWORDS.copy()
print(" STOPWORDS.copy()",help(STOPWORDS.copy()))
#可以自行加多个屏蔽词,也可直接下载停用词表格
stopwords.add("电影")
stopwords.add("一部")
stopwords.add("一个")
stopwords.add("没有")
stopwords.add("什么")
stopwords.add("有点")
stopwords.add("这部")
stopwords.add("这个")
stopwords.add("不是")
stopwords.add("真的")
stopwords.add("感觉")
stopwords.add("觉得")
stopwords.add("还是")
stopwords.add("特别")
stopwords.add("非常")
stopwords.add("可以")
stopwords.add("因为")
stopwords.add("为了")
stopwords.add("比较")
print (stopwords)
#设置词云参数
#参数分别是指定字体/背景颜色/最大的词的大小,使用给定图作为背景形状
wc =WordCloud(width=1024,height=768,background_color='white',
              mask = backgroud_Image,font_path='C:/Windows/Fonts/simkai.ttf',
              stopwords=stopwords,max_font_size=400,
              random_state=50)
#将分词后数据传入云图
wc.generate_from_text(wl_space_split)
plt.imshow(wc)
plt.axis('off')#不显示坐标轴
plt.show()
#保存结果到本地
wc.to_file(r'xuke_wordcloud.jpg')



结语


本文只是做了简单的数据爬取和分析,主要是用以学习如何进行分词,词云和热力图,建议大家可以基于此进行练习。

声明:本文为作者投稿,版权归对方所有。

作者:胡萝卜酱,首发于经管人学数据分析(ID:DAT-2017)。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存