前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >从数据角度探究《前任3》为什么这么火爆

从数据角度探究《前任3》为什么这么火爆

作者头像
Python攻城狮
发布于 2018-08-23 04:14:26
发布于 2018-08-23 04:14:26
40700
代码可运行
举报
文章被收录于专栏:Python攻城狮Python攻城狮
运行总次数:0
代码可运行

1.《前任3》为什么这么火爆

截止发文时《前任3》票房15.50亿,成为一匹黑马,我习惯性的去豆瓣看了评分

豆瓣上8万多人只打出了5.8的评分,其中1星-3星占比72.6%,那么问题来了,在绝大多数豆瓣粉丝都认为是“烂片”的情况下,究竟是什么让《前任3》票房意外火爆呢?

为了更能说明问题,通过一些舆情监测软件,我参考了一些社交圈的一些数据

  • 搜索微信公众号前任3相关的文章,我们可以看到相关结果2w多,总阅读数6006w+
  • 我查看了点赞数最多的,竟然是蕊希的推文 <前任3>:谢谢和你爱过,也不遗憾最终错过。点赞数22956 阅读量10w+,这里为什么用竟然,是因为我也是蕊希忠实的听众啊,多少个成长的夜晚,是这个电台陪我入睡,多少个... 跑题了跑题了,此处省略一万字

点进去仔细看了一遍,这篇文章主要还是以一些经典的情感语录和分手的撕心裂肺来引起读者的共鸣或者是往事,蕊希的文章总是写的很成功,因为她知道什么样的内容可以打动读者的内心情感,看评论就知道了

所以前任三之所以火爆的原因也许是因为:分手?毕竟“分手”是感情世界里永不褪色的话题,也是最能触发观影者内心情感的话题,不过这只是我们的猜测。

作为一名程序员,我们当然不能只靠这些来说话,数据是最有说服力的,于是我爬取了一下豆瓣的影评。

2.采集豆瓣影评

有朋友私我说之前没怎么写过使用框架采集数据的教程,回过头想了想好像是很少使用框架去爬虫了,最早的一篇还是Python网络爬虫(六)- Scrapy框架戳我复习,发现突然让自己用Scrapy还的确忘记从哪开始了,于是对着电脑开始发呆,大概度过了十分钟的贤者时间一下子重新掌握了Scrapy的整体思路,(明明复习了一两个小时)。

戳我学习Scrapy

流程如下:

  • 创建一个Scrapy项目;
  • 定义提取的Item;
  • 编写爬取网站的 spider 并提取 Item;
  • 编写 Item Pipeline 来存储提取到的Item(即数据)。
  • 提取数据库数据,处理展示
  • 创建项目,终端输入
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 创建项目
scrapy startproject douban_qrs

# 进入项目目录
cd douban_qrs
# 创建爬虫文件
scrapy genspider douban https://movie.douban.com
  • 项目结构(不包括后续配置)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
|-- douban_qrs/                        # 项目文件夹
    |-- scrapy.cfg                     # 项目发布配置
    |-- spiders/                       # 项目模块存储了实际的爬虫代码
        |-- __init__.py                # 模块描述文件
        |-- items.py                   # 定义了待抓取域的模型
        |-- pipelines.py               # 项目pipelines定义文件
        |-- settings.py                # 项目全局配置,定义了一些设置,如用户代理、爬取延时等。
        |-- spiders/                   # 爬虫模块<开发>
            |-- __init__.py            # 模块描述文件
            |-- douban.py              # 爬虫代码

难题:scrapy实现模拟登录

这里我又重新去翻了一遍文档,发现文档中是有描述的

参考文档

  • scrapy中cookies的写法,可以与request中cookie的写法对比下

这里我用了两种方法解决这个问题,第一个是加cookie,效果不太理想,我换了第二种采用登录的方式。

  • 由于在登录过程中可能需要输入验证码,目前采用把验证码图片保存至本地手动输入 (借助一些打码平台可以实现自动识别验证码输入,收费)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def logged_in(self, response):
        img_code = response.xpath("//img[@id='captcha_image']/@src").extract()
        if len(img_code) > 0:
            print("请输入验证码登录")
            localpath = "/home/xsl/imgcode.jpg"
            # 将图片下载到本地
            urllib.request.urlretrieve(img_code[0], filename=localpath)
            print("请查看本地验证码图片并输入验证码")
            img_code_value = input()
            data = {
                "form_email": "你的账号",
                "form_password": "您的密码",
                "captcha-solution": str(img_code_value),
            }

        else:
            print("此时没有验证码")
            data = {
                "form_email": "你的账号",
                "form_password": "您的密码",
            }
        print("登录中.(ง •̀_•́)ง")
        return [scrapy.FormRequest('https://www.douban.com/login',
                                   formdata=data,
                                   callback=self.movie)]

3.词云和分布图展示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def word_cloud(comment):
    logger.info('制作词云图...word_cloud')
    comment_text = ''
    back_coloring = imread("static/zzb.jpg")
    cloud = WordCloud(font_path='static/simhei.ttf',  # 若是有中文的话,这句代码必须添加,不然会出现方框,不出现汉字
                      background_color="white",  # 背景颜色
                      max_words=2000,  # 词云显示的最大词数
                      mask=back_coloring,  # 设置背景图片
                      max_font_size=100,  # 字体最大值
                      random_state=42,
                      width=360, height=591, margin=2,  # 设置图片默认的大小,但是如果使用背景图片的话,那么保存的图片大小将会按照其大小保存,margin为词语边缘距离
                      )
    for li in comment:
        comment_text += ' '.join(jieba.cut(li, cut_all=False))
    wc = cloud.generate(comment_text)
    image_colors = ImageColorGenerator(back_coloring)
    plt.figure("wordc")
    plt.imshow(wc.recolor(color_func=image_colors))
    wc.to_file('前任三词云图.png')


def snowlp_analysis(comment):
    logger.info('自然语言处理NLP...snow_analysis')
    sentimentslist = []
    for li in comment:
        s = SnowNLP(li)
        # logger.debug(li)
        # logger.debug(li, s.sentiments)
        print(li, s.sentiments)
        sentimentslist.append(s.sentiments)
    fig1 = plt.figure("sentiment")
    plt.hist(sentimentslist, bins=np.arange(0, 1, 0.02))
    plt.show()

本来是想用至尊宝做一个词云图的,找了好久没找到素材,就用了之前我的一张壁纸

话说,词云图好像并不能看出什么~而分布图表达的结果也并不直观,那就代表本次的结果没有什么卵用,个人觉得是因为数据量太小了,而且词云图本身对数据展示的结果只能看出高频词而已...我就不分析什么了(我真的尽力了(ง •̀_•́)ง)

我也想像其他大佬一样机器学习数据分析

源码已上传Github

时光无法回头,人生也不能重来,珍惜眼前人。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.01.17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android学习第一弹:Android通过用代码画虚线椭圆边框背景来学习一下shape的用法
学习Shape的用法 非著名程序员 在Android程序开发中,我们经常会去用到Shape这个东西去定义各种各样的形状,shape可以绘制矩形环形以及椭圆,所以只需要用椭圆即可,在使用的时候将控件
非著名程序员
2018/02/01
2.2K0
Android学习第一弹:Android通过用代码画虚线椭圆边框背景来学习一下shape的用法
Android 通过layer-list 实现View 的阴影效果
主要介绍如何在res文件夹中的drawable中给View的布局添加上阴影效果。那么我们通过shape进行绘制的带阴影的布局有哪些优缺点和使用场景呢?
zinyan.com
2023/07/13
7750
Android 通过layer-list 实现View 的阴影效果
Android知识点
想每次进入页面刷新,可以放在onResume方法里(不推荐) 颜色透明度:#7f000000 代表50%透明度的黑色
六月的雨
2020/03/27
6860
自定义 Drawable 你还只会 <shape> 吗?
其中每一个卡片的背景都是从上到下渐变,仔细看其中的边框也是渐变的,这个要怎么实现呢?第一个能想到的最简单的办法就是让设计师导出包含边框的完整的背景切图。但是作为一个优(ban)秀(zhuan)的开发工程师,当然要想办法自己实现啦,用切图你就输啦!(开玩笑);更重要的是,对比直接使用一张图,使用自定义 Drawable 来实现可以减少包大小(还能炫技)
Rouse
2024/05/28
1360
自定义 Drawable 你还只会 <shape> 吗?
Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
用户1155943
2018/01/04
2.6K0
Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
android之自定义渐变颜色(一)
你是否已经厌恶了纯色的背景呢?那好,android提供给程序员自定义渐变颜色的接口,让我们的界面炫起来吧。 首先,你在drawable目录下写一个xml,代码如下 <?xml version="1.0
forrestlin
2018/05/23
8330
Android – Drawable 详解
很早看过这篇文章,并做了笔记,后来看到群里的小伙伴有问相关Drawable的问题,就把这篇翻译过来的文章给放出来了。大家一起学习,一起进步。想看原文的小伙伴可以点击下面的链接。 原文地址 前言 Drawable是可以绘制到屏幕上的图形。 Drawable用于定义形状,颜色,边界,渐变等,然后将其应用于Activity中的View。 这通常用于自定义显示在特定View。 Drawable倾向于在XML中定义,然后可以通过XML或Java代码应用于View。 有关Android的每个版本的默认Drawab
code_horse
2018/07/02
5.5K0
Android GradientDrawable(shape标签定义) 静态使用和动态使用(圆角,渐变实现)
本文介绍了如何在Android中创建一个可绘制对象,该对象可以呈现复杂的几何形状、可自定义颜色和样式、支持动态调整大小和位置。同时,还介绍了如何使用GradientDrawable来设置自定义颜色和形状,以及如何使用ShapeDrawable来创建圆角、渐变等效果。同时,还介绍了如何动态创建和修改GradientDrawable的属性,以满足不同的需求。
用户1155943
2018/01/04
3.7K0
Android GradientDrawable(shape标签定义) 静态使用和动态使用(圆角,渐变实现)
Android开发笔记(八)神奇的shape
shape意即形状,是Android中描述规则几何图形的定义,ShapeDrawable其实就是Drawable的一个子类。用好shape,可以让APP页面不再呆板;用好shape,可以节省不小的美工工作量。 shape的定义文件是xml,以shape元素为根节点。根节点下定义了六个节点:corners(圆角)、gradien(渐变)、padding(间隔)、size(尺寸)、solid(填充)、stroke(描边),各节点的属性值主要是各种长宽、半径、角度,以及颜色。这些定义很简单,多用几遍就记住了,不过网上的介绍大多不全,所以博主在下面就详细介绍各节点的属性用法。   shape(根节点) android:shape: 字符串类型,图形的形状。为rectangle表示矩形(默认),为oval表示椭圆(此时corners节点将失效),为line表示直线(此时必须设置stroke节点,不然会报错),为ring表示圆环。 下面的属性只有在android:shape="ring"时可用: android:innerRadius: 像素类型,内圆的半径。 android:innerRadiusRatio: 浮点型,以环的宽度比率来表示内圆的半径。例如,如果android:innerRadiusRatio="3",表示内圆半径等于环的宽度(即外圆直径)除以3。如已设置android:innerRadius则不需设置本属性 android:thickness: 像素类型,环的厚度 android:thicknessRatio: 浮点型,以环的宽度比率来表示环的厚度。例如,如果android:thicknessRatio="2",那么环的厚度就等于环的宽度除以2。如已设置android:thickness则不需设置本属性 android:useLevel: 布尔类型,如果当做是LevelListDrawable使用时值为true,否则为false(一般情况必须设置为false,不然ring无法显示)。   corners(圆角) android:bottomLeftRadius: 像素类型,左下圆角的半径 android:bottomRightRadius: 像素类型,右下圆角的半径 android:topLeftRadius: 像素类型,左上圆角的半径 android:topRightRadius: 像素类型,右上圆角的半径 android:radius: 像素类型,圆角半径(若有上面四个圆角半径的定义,则不需要radius定义)   无corners节点表示没有圆角   gradien(渐变) android:angle: 整型,渐变的起始角度。0值时表示时钟的九点位置,其值增大表示往逆时针方向旋转。例如值为90表示时钟六点位置,值为180表示时钟三点位置,值为270表示时钟零点/十二点位置 android:centerX: 浮点型,圆心的X坐标。当android:type="linear"时不可用 android:centerY: 浮点型,圆心的Y坐标。当android:type="linear"时不可用 android:gradientRadius: 整型,渐变的半径。当android:type="radial"时才需要设置该属性 android:centerColor: 颜色类型,渐变的中间颜色 android:startColor: 颜色类型,渐变的起始颜色 android:endColor: 颜色类型,渐变的终止颜色 android:type: 字符串类型,渐变类型。为linear表示线性渐变(默认值),为radial表示放射渐变(起始颜色就是圆心颜色),为sweep表示滚动渐变(即一个线段以某个端点为圆心做360度旋转) android:useLevel: 布尔类型,设置为true无渐变,false有渐变色。如果要使用LevelListDrawable对象,就要设置为true   无gradien节点表示没有渐变效果   padding(间隔) android:bottom: 像素类型,与下边的间隔 android:left: 像素类型,与左边的间隔 android:right: 像素类型,与右边的间隔 android:top: 像素类型,与上边的间隔   无padding节点表示四周不设间隔   size(尺寸) android:height: 像素类型,图形高度 android:width: 像素类型,图形宽度   无size节点表示长宽自适应   solid(填充) android:color: 颜色类型,内部填充的颜色   无solid节点表示无填充颜色   
aqi00
2019/01/18
1.6K0
Art of Android Development Reading Notes 6
《Android开发艺术探索》读书笔记 (6) 第6章 Android的Drawable
宅男潇涧
2018/08/01
4680
相关推荐
Android学习第一弹:Android通过用代码画虚线椭圆边框背景来学习一下shape的用法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文