查看原文
其他

爬取了《悲伤逆流成河》15195 条猫眼数据,满分好评背后靠的是什么?

XksA CSDN 2018-10-26

作者 | XksA

责编 | 郭芮

郭敬明五年电影最动人之作《悲伤逆流成河》,可以说是口碑票房双丰收的好剧,可惜导演不是郭敬明——导演是一位叫落落的写而优则导的好作家。

本篇文章将带你爬取猫眼电影《悲伤逆流成河》短评,用数据告诉你这部刷屏朋友圈的电影之所以几乎100%好评背后的数据解读。


写在前面


知道《悲伤逆流成河》电影上映还是在QQ空间看见学弟发了说说,突然想起初中追小四的书,每天看到晚上10点多。

昨天看了《悲伤逆流成河》,整个故事情节几乎和小说一模一样,当然缩减是避免不了的。最大的不一样的是原著里的易遥跳楼自杀了,而电影里路遥是在众人的"舌枪唇剑"、“幸灾乐祸”的眼睛下,带着不甘与怨恨跳河自杀的,但是最后竟然…我就不多剧透了。

整部剧大概一个小时四十分钟下来全程无槽点,电影我直接看了两遍…因此这次我想写写这篇充满技术+情感的文章。


数据爬取


1、猫眼电影短评接口

http://maoyan.com/films/1217236——我们直接访问这个,在web端只能看到最热的10条短评,那怎么获取到所有短评呢?

  • 访问上面的链接,按下F12,然后点击图片上的图标,把浏览模式(响应式设计模式,火狐快捷键Ctrl+Shift+M)改为手机模式,刷新页面。

第一步

刷新后

  • 换用谷歌浏览器,F12下进行上面操作,加载完毕后下拉短评,页面继续加载,找到含有offset和startTime的加载条,发现它的Response中包含我们想要的数据,为json格式。

获取到真正的评论接口

2、获取短评

  • 简单分析

通过上面分析Request URL:http://m.maoyan.com/mmdb/comments/movie/1217236.json?v=yes&offset=0&startTime=0%2021%3A09%3A31

Request Method:GET

下滑了几次,我发现了下面的规律:

测试表

分析上面数据变化,可以大致猜测出:offset表示该接口显示评论开始位置,每个页面15条,比如:15,则显示15-30这中间的15条评论; startTime表示当前评论的时间,固定格式(2018-10-06)。

另外接口最后的%2021%3A09%3A31是不变的。

  • 代码获取

'''
data : 2018.10.06
author : 极简XksA
goal : 爬取猫眼《悲伤逆流成河》影评,词云可视化
'''


# 猫眼电影介绍url
# http://maoyan.com/films/1217236

import requests
from fake_useragent import UserAgent
import json
headers = {
        "User-Agent": UserAgent(verify_ssl=False).random,
        "Host":"m.maoyan.com",
        "Referer":"http://m.maoyan.com/movie/1217236/comments?_v_=yes"
    }
# 猫眼电影短评接口
offset = 0
# 电影是2018.9.21上映的
startTime = '2018-09-21'
comment_api = 'http://m.maoyan.com/mmdb/comments/movie/1217236.json?_v_=yes&offset={0}&startTime={1}%2021%3A09%3A31'.format(offset,startTime)
# 发送get请求
response_comment = requests.get(comment_api,headers = headers)
json_comment = response_comment.text
json_comment = json.loads(json_comment)
print(json_comment)

返回数据:

json数据

  • 数据简单介绍

  • 数据提取

# 获取数据并存储
def get_data(self,json_comment):
    json_response = json_comment["cmts"]  # 列表
    list_info = []
    for data in json_response:
        cityName = data["cityName"]
        content = data["content"]
        if "gender" in data:
            gender = data["gender"]
        else:
            gender = 0
        nickName = data["nickName"]
        userLevel = data["userLevel"]
        score = data["score"]
        list_one = [self.time,nickName,gender,cityName,userLevel,score,content]
        list_info.append(list_one)
    self.file_do(list_info)

3、存储数据

# 存储文件
def file_do(list_info):
    # 获取文件大小
    file_size = os.path.getsize(r'G:\maoyan\maoyan.csv')
    if file_size == 0:
        # 表头
        name = ['评论日期''评论者昵称''性别''所在城市','猫眼等级','评分','评论内容']
        # 建立DataFrame对象
        file_test = pd.DataFrame(columns=name, data=list_info)
        # 数据写入
        file_test.to_csv(r'G:\maoyan\maoyan.csv', encoding='gbk', index=False)
    else:
        with open(r'G:\maoyan\maoyan.csv''a+', newline=''as file_test:
            # 追加到文件后面
            writer = csv.writer(file_test)
            # 写入文件
            writer.writerows(list_info)

4、封装代码

猫眼短评的反爬可以说几乎没有,中间断了两次,更改数据,重新运行即可,不封IP。

5、运行结果显示


数据分析可视化


1、提取数据

  • 代码:

def read_csv():
    content = ''
    # 读取文件内容
    with open(r'G:\maoyan\maoyan.csv''r', encoding='utf_8_sig', newline=''as file_test:
        # 读文件
        reader = csv.reader(file_test)
        i = 0
        for row in reader:
            if i != 0:
                time.append(row[0])
                nickName.append(row[1])
                gender.append(row[2])
                cityName.append(row[3])
                userLevel.append(row[4])
                score.append(row[5])
                content = content + row[6]
                # print(row)
            i = i + 1
        print('一共有:' + str(i - 1) + '条数据')
        return content
  • 运行结果:最终获取了 15195 条数据。

2、评论者性别分布可视化

  • 代码:

# 评论者性别分布可视化
def sex_distribution(gender):
    # print(gender)
    from pyecharts import Pie
    list_num = []
    list_num.append(gender.count('0')) # 未知
    list_num.append(gender.count('1')) # 男
    list_num.append(gender.count('2')) # 女
    attr = ["其他","男","女"]
    pie = Pie("性别饼图")
    pie.add("", attr, list_num, is_label_show=True)
    pie.render("H:\PyCoding\spider_maoyan\picture\sex_pie.html")
  • 运行结果:

从数据上看,大多数评论者在注册猫眼时个人信息栏没有标注性别,而且男女中,评分者主要是女生。也好理解,这本来就是一部比较文艺、小众的青春篇,女生可能更为喜爱,而男生可能更加喜欢动作大片。

3、评论者所在城市分布可视化

  • 代码:

# 评论者所在城市分布可视化
def city_distribution(cityName):
    city_list = list(set(cityName))
    city_dict = {city_list[i]:0 for i in range(len(city_list))}
    for i in range(len(city_list)):
        city_dict[city_list[i]] = cityName.count(city_list[i])
    # 根据数量(字典的键值)排序
    sort_dict = sorted(city_dict.items(), key=lambda d: d[1], reverse=True)
    city_name = []
    city_num = []
    for i in range(len(sort_dict)):
        city_name.append(sort_dict[i][0])
        city_num.append(sort_dict[i][1])

    import random
    from pyecharts import Bar
    bar = Bar("评论者城市分布")
    bar.add("", city_name, city_num, is_label_show=True, is_datazoom_show=True)
    bar.render("H:\PyCoding\spider_maoyan\picture\city_bar.html")

# 地图可视化
def render_city(cities):
     点击阅读原文查看该函数完整代码
  • 运行结果:

柱状图城市分布

地理位置分布

从中可以看出,大多数观影评分者位于我国东南部分。城市分布上,深圳、成都、北京、武汉、上海占据前五,因为图标里还有很多地级市,所以数据不集中(最大的也只有几百),还是可以看出,这些人大多分布在一二线城市,有消费能力,也愿意在节假日消费。

4、每日评论总数可视化分析

  • 代码:

# 每日评论总数可视化分析
def time_num_visualization(time):
    from pyecharts import Line
    time_list = list(set(time))
    time_dict = {time_list[i]: 0 for i in range(len(time_list))}
    time_num = []
    for i in range(len(time_list)):
        time_dict[time_list[i]] = time.count(time_list[i])
    # 根据数量(字典的键值)排序
    sort_dict = sorted(time_dict.items(), key=lambda d: d[0], reverse=False)
    time_name = []
    time_num = []
    print(sort_dict)
    for i in range(len(sort_dict)):
        time_name.append(sort_dict[i][0])
        time_num.append(sort_dict[i][1])

    line = Line("评论数量日期折线图")
    line.add(
        "日期-评论数",
        time_name,
        time_num,
        is_fill=True,
        area_color="#000",
        area_opacity=0.3,
        is_smooth=True,
    )
    line.render("H:\PyCoding\spider_maoyan\picture\c_num_line.html")
  • 运行结果:

每日评论数折线图

由于数据显示不完整,不能很好得看出评论数量变化,但基本可以看出每天的评论数都为1005。我估计是猫眼限制了每天评论数的显示,或者我获取的时候被限制了,从9.21开始到10.6的16天里,每天新增评论数均达到最大值,可以说明其热度不减。

5、评论者猫眼等级、评分可视化

  • 代码:

# 评论者猫眼等级、评分可视化
def level_score_visualization(userLevel,score):
    from pyecharts import Pie
    userLevel_list = list(set(userLevel))
    userLevel_num = []
    for i in range(len(userLevel_list)):
        userLevel_num.append(userLevel.count(userLevel_list[i]))

    score_list = list(set(score))
    score_num = []
    for i in range(len(score_list)):
        score_num.append(score.count(score_list[i]))

    pie01 = Pie("等级环状饼图", title_pos='center', width=900)
    pie01.add(
        "等级",
        userLevel_list,
        userLevel_num,
        radius=[4075],
        label_text_color=None,
        is_label_show=True,
        legend_orient="vertical",
        legend_pos="left",
    )
    pie01.render("H:\PyCoding\spider_maoyan\picture\level_pie.html")
    pie02 = Pie("评分玫瑰饼图", title_pos='center', width=900)
    pie02.add(
        "评分",
        score_list,
        score_num,
        center=[5050],
        is_random=True,
        radius=[3075],
        rosetype="area",
        is_legend_show=False,
        is_label_show=True,
    )
    pie02.render("H:\PyCoding\spider_maoyan\picture\score_pie.html")
  • 运行结果:

等级分布

评分分布

从数据可视化结果可以看出,评论者中有47.08%为猫眼二级用户,31.5%为猫眼三级用户,四级及以上用户占11.82%,0级或1级(可以认定为新注册用户)占9.6%。可以看出评分的人中水军是很少的,基本都是猫眼老用户,评分和评论都不会有任何客观色彩。

从评分上看,五星的满分,评分在3星及以上的占93.8%,评分在4星及以上的占87.7%,评分在5星满分占62.82%,大家对该电影都是一致好评。

6、评论者评论内容可视化分析

  • 代码:

#定义个函数式用于分词
def jiebaclearText(text):
    点击阅读原文查看该函数完整代码

# 生成词云图
def make_wordcloud(text1):
    text1 = text1.replace("悲伤逆流成河""")
    bg = plt.imread(d + r"/static/znn1.jpg")
    # 生成
    wc = WordCloud(# FFFAE3
        background_color="white",  # 设置背景为白色,默认为黑色
        width=890,  # 设置图片的宽度
        height=600,  # 设置图片的高度
        mask=bg,
        # margin=10,  # 设置图片的边缘
        max_font_size=150,  # 显示的最大的字体大小
        random_state=50,  # 为每个单词返回一个PIL颜色
        font_path=d+'/static/simkai.ttf'  # 中文处理,用系统自带的字体
    ).generate_from_text(text1)
    # 为图片设置字体
    my_font = fm.FontProperties(fname=d+'/static/simkai.ttf')
    # 图片背景
    bg_color = ImageColorGenerator(bg)
    # 开始画图
    plt.imshow(wc.recolor(color_func=bg_color))
    # 为云图去掉坐标轴
    plt.axis("off")
    # 画云图,显示
    # 保存云图
    wc.to_file(d+r"/picture/word_cloud.png")
  • 人物图运行结果:

真的超级喜欢电影里拿手机那一笑,初恋的感觉

词云图

整体来看,是一部良心剧:好看,挺好看的,非常好看,超级好看,看哭了,感人,值得一看…几乎100%的好评。主题鲜明,校园暴力,险恶嘴脸,事不关己高高挂起的腐烂心态的显露,这部电影很好地凸显了现在浮躁的社会和浮躁的气氛。


我想说的话


最后,我想说一些技术无关的话,纯粹关于电影本身的内容。

《悲伤逆流成河》这部剧除了反应校园暴力,当代中、高、大学生,乃至成年人心浮气躁外,也在一些细微之处透露了那个时代友谊的可贵,甚至还有像《我不是药神》一样凸显医药品的小细节。极力推荐大家去看这部电影。

在电影中,路遥去找那个小诊所的男医生,后者说的”一次100,10次下来你的痛苦就可以彻底解脱了“,到现在我还依然记得路遥迷茫的眼神。还有路遥的妈妈,做的也不是肮脏的生意,就是普通地给那些"腐朽"的人按按摩而已。

还有很多情节,路遥妈妈说的”我每次做生意的时候都刻意把你的内衣收着就是怕那些垃圾知道你“;路遥急着找钱时发现妈妈给她存的报名费,从一元的到一百的,那么厚厚一沓;路遥妈妈知道路遥染病是因为自己后,打自己的那个耳光;齐铭妈妈看见路遥妈妈拉着路遥的惊讶眼神…

太多了,最后路遥说出那句”杀死顾森湘的凶手,我不知道是谁,但杀死我的凶手,你们知道是谁“,转身往大海奔去。我不知道是解脱还是傻,只怪我们都胆小怕事,别人做什么我们就跟着做什么。

世间向来不缺乏温暖,只是大家都太过于想要温暖,而总是搞一些小团体、建“四人邦”、“送礼”…...等形形色色的法子。最后我想说,无论你是小孩,初中生,高中生,大学生,成年人,工作的,当官的…还是什么,请多多关爱身边的弱势群体,给你的后辈做好榜样,请不要“因为需要所以掠夺”。

我相信,世间的邪恶虽不能完全消除,但我们可以尽量多地发现善良和美。

作者:XksA,大三在读的师范技术生,主要学习Python web、数据分析、可视化方面,个人公众号 极简XksA 长期分享学习笔记,学习资料,欢迎交流学习。

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

END


微信改版了,

想快速看到CSDN的热乎文章,

赶快把CSDN公众号设为星标吧,

打开公众号,点击“设为星标”就可以啦!


征稿啦

CSDN 公众号秉持着「与千万技术人共成长」理念,不仅以「极客头条」、「畅言」栏目在第一时间以技术人的独特视角描述技术人关心的行业焦点事件,更有「技术头条」专栏,深度解读行业内的热门技术与场景应用,让所有的开发者紧跟技术潮流,保持警醒的技术嗅觉,对行业趋势、技术有更为全面的认知。

如果你有优质的文章,或是行业热点事件、技术趋势的真知灼见,或是深度的应用实践、场景方案等的新见解,欢迎联系 CSDN 投稿,联系方式:微信(guorui_1118,请备注投稿+姓名+公司职位),邮箱(guorui@csdn.net)。

推荐阅读:

2018 AI开发者大会

AI工程师必备大会


2018 AI开发者大会是一场由中美人工智能技术高手联袂打造的AI技术与产业的年度盛会!我们只讲技术,拒绝空谈!

这里有10场技术专题论坛:计算机视觉、数据分析、机器学习、知识图谱、智慧金融、智能驾驶、语音技术、智慧医疗、机器学习工具、自然语言处理。

还有15+硅谷实力讲师团、80+AI领军企业技术核心人物、100+技术&大众实力媒体、1500+AI专业开发者

识别下方二维码,快速获取大会更多信息,并获得最低折扣票!

点击“阅读原文”,也可立即报名。


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

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