数说成龙电影|数据告诉你,成龙大哥真的老了吗

简介: 数说成龙电影|数据告诉你,成龙大哥真的老了吗

最近的电影《哪吒》绝对是风靡全国,各种“我命由我不由天”,激励着平民大众。而《上海堡垒》则彻底扑街,鹿晗也跌落神坛,流量不再。而老大哥成龙的新片《龙牌之谜》也在日前悄悄上映了,之所用悄悄是因为电影并没有做过多的宣传,低调上映。但是上映之后的口碑却不敢恭维,好多影迷都说,大哥老了,也开始持续拍烂片了。今天,我们就来分析下历年成龙的电影得分数据和《龙牌之谜》的评论,用数据来告诉你,真的是大哥老了,打不动了吗?

Part1.豆瓣数据分析

豆瓣数据获取

爬取的过程还是蛮简单的,直接给出代码

1def get_data():
 2
 3    data = []
 4
 5    for i in range(0, 150, 25):
 6
 7        url = 'https://movie.douban.com/celebrity/1054531/movies?start=%s&format=text&sortby=time&role=A1' % i
 8
 9        res = requests.get(url).text
10
11        content = BeautifulSoup(res, "html.parser")
12
13        tbody_tag = content.find_all('tbody')
14
15        tr_tag = tbody_tag[1].find_all('tr')
16
17        for tr in tr_tag:
18
19            tmp = []
20
21            name = tr.find('a').text
22
23            year = tr.find('td', attrs={'headers': 'mc_date'}).text
24
25            rate = tr.find('td', attrs={'headers': 'mc_rating'}).text
26
27            tmp.append(name)
28
29            tmp.append(year)
30
31            tmp.append(rate.replace('\n', '').strip().replace('-', ''))
32
33            data.append(tmp)
34
35    return data
36
37
38
39if __name__ == '__main__':
40
41    data = get_data()
42
43    print(data)
44
45    with open('jack_data.csv', 'w', encoding='utf-8') as f:
46
47        f.write('name,year,rate\n')
48
49        for d in data:
50
51            try:
52
53                rowcsv = '{},{},{}'.format(d[0], d[1], d[2])
54
55                f.write(rowcsv)
56
57                f.write('\n')
58
59            except:
60
61                continue

数据拿到之后,我们再做些简单的数据处理,去除掉 rate 为空的数据,和一些异常数据

1df = pd.read_csv('jack_data.csv')
 2
 3df.isnull().sum()  # 查看缺失值情况
 4
 5
 6
 7df_copy = df.copy()
 8
 9df_copy.dropna(how='any', inplace=True)  # 去掉缺失值
10
11
12
13# 去掉异常值
14
15except_data = df_copy[df_copy['name'].apply(lambda x: x == '喜剧之王')].index
16
17df_copy.drop(except_data, inplace=True)

一、成龙电影总体得分分布

成龙大哥的高分电影,多集中在早年。大多数电影的评分,都几种在6-7分上下浮动。而近些年的几部电影,口碑都不是很好,有持续下滑的趋势。

二、评分最高与最低影片

成龙大哥的电影,最高得分为《龙争虎斗》,8.2 分,不过这个电影好像是李小龙的呀,尴了个尬,不知道成龙在电影里干了啥,豆瓣会把这部电影分给成龙。

评分最低的是《神探蒲松龄》,只有 3.8 分。年岁增大,不能再像以前那样“功夫喜剧”了,成龙电影未来的方向在哪里呢。

而《龙争虎斗》是 1973 年上映的,《神探蒲松龄》 则是 2019 年上映的,也从侧面反映出近些年龙大哥在电影市场的不给力情况。

其实龙大哥早些年的《A 计划》,《警察故事》等都是我蛮喜欢的电影。

三、出产电影年份

我们再来看看哪些年份,成龙大哥出产的电影比较多呢

1978 年,成龙出产的电影占比是最多的,总共是 6 部,接下来就是 1973、1985 和 1976 年,都是 5部电影。

我们来看下这几年电影的评分情况

1978 年

1973 年

1985 年

1976 年

可以看出来,早些年,大哥年轻的时候,无论是数量还是质量,都是比较有保证的。不过太多电影过于遥远,真心没看过啊!

虽然说,成龙电影总体评分并不是太高,最高也才 8 点几分,但是作为华语影坛的大哥级人物,大家对他的期待还是非常高的。

不管怎么说,还是希望成龙大哥能够好好保养身体,在以后的时光中,给大家带来更多好的作品。

Part2.猫眼数据分析

爬一爬猫眼上《龙牌之谜》的用户评论,看看这个口碑不佳的作品,用户的想法是怎么样的

分析猫眼网站

我们首先进入到猫眼,找到对应的电影,地址为:https://maoyan.com/films/343473

页面拖到最下面,发现只有10条最热门的评论,其他评论去哪了?

浏览器手机模式

这里可以使用浏览器手机模式,在 Chrome 浏览器下,按 F12 打开开发者工具,再点击下图中的按钮,即可进入到手机模式

此时再重新刷新网页,发现我们已经神奇的进入到了猫眼的 M 站了

现在再拖动网页到最下部,点击查看全部评论,就可以进入到评论页面,查看全部的评论了。

寻找加载评论的接口

接下来我们继续下拉页面,发现评论是动态加载的。此时经验就非常重要了,我们让页面多加载加载评论几次,就能够发现一个“可疑”的请求,如下

它是以 comments 命名的啊,差不多就是它了。

接下来再查看其 response,确实就是评论内容,而且是清爽的 json 数据,很开心!

分析接口参数

我们先来观察下这个接口

http://m.maoyan.com/review/v2/comments.json?movieId=343473&userId=-1&offset=30&limit=15&ts=1567064825883&type=3

movieid 很显然就是电影的 id,不动

userid 的值为 -1,应该是我们没有登陆的原因

offset 经过尝试,相当于是 page 的作用,且每次的步长为 15

limit 应该是每次返回数据的数量

其他的参数暂时不明

我们把该接口信息放到 postman 中,尝试着调用下

我去掉了 movieid 以外的所有参数,发现是可以调用成功的

查看接口返回数据的最后面,发现一个 paging 字段

1"paging": {
2        "hasMore": true,
3        "limit": 10,
4        "offset": 0,
5        "total": 2838
6    }

已经清楚的告诉了我们,还有更多数据("hasMore": true),每页限制为10("limit": 10),当前是第0页("offset": 0),总共的数据为2838条("total": 2838)。

最后经过测试,type = 3 会每次都会返回 hotComments 这个字段,而当 type = 2 时,则不会返回该字段,于是我选择使用 type 为2来发送请求,那么最终我决定使用的请求 url 就是如下:

http://m.maoyan.com/review/v2/comments.json?movieId=343473&offset=60&limit=15&type=2

offset 作为变量,循环替换即可。

编写爬虫代码

提取 json 数据

1def get_json(res):
 2    data_list = []
 3    res_json = json.loads(res)
 4    data = res_json['data']['comments']
 5    for d in data:
 6        content = d['content']
 7        gender = d['gender']
 8        userLevel = d['userLevel']
 9        score = d['score']
10        try:
11            if len(d['tagList']) == 0:
12                ticket = 0
13            elif len(d['tagList']) == 1:
14                if d['tagList'][0]['id'] == 4:
15                    ticket = 1
16                else:
17                    ticket = 0
18            elif len(d['tagList']) == 2:
19                ticket == 1
20        except:
21            ticket = 0
22        tmp = [content, gender, userLevel, score, ticket]
23        data_list.append(tmp)
24    return data_list

解析 json 就比较简单了,只要做好异常处理即可。

因为评论中有很多 emoji 表情,可以使用正则过滤掉

1emoji_pattern = re.compile("["
2        u"\U0001F600-\U0001F64F"  # emoticons
3        u"\U0001F300-\U0001F5FF"  # symbols & pictographs
4        u"\U0001F680-\U0001F6FF"  # transport & map symbols
5        u"\U0001F1E0-\U0001F1FF"  # flags (iOS)
6                           "]+", flags=re.UNICODE)
7emoji_pattern1.sub(r'', str1)

最后保存数据到 csv 文件

1def save_to_csv(data):
 2    with open('maoyan_data.csv', 'w', encoding='utf-8') as f:
 3        f.write('content,gender,userlevel,score,ticket\n')
 4        for d in data:
 5            try:
 6                row = '{},{},{},{},{}'.format(d[0], d[1], d[2], d[3], d[4])
 7                f.write(row)
 8                f.write('\n')
 9            except:
10                continue

最后得到的数据如下:

数据可视化分析

性别分布

我们先来看下评论者的性别分布是怎样的

可以看出,男性观众的比例还是多一些,不过大多数人都没有设置性别,隐私工作做得很不多哦

用户等级

不出所料,大部分都是 level-0的用户,普通大众最普通,天下何止千千万。

评分分布

看到结果之后扎心不,打分数量最高的是0分,不知道如果可以打负分,那么情况会是怎么样

评论词云

最后,我们再来做一个词云,看看评论中的高频词汇都有哪些

老规矩,不对评论做过多点评

不过还是忍不住要说一句,评论里面“好看”这个词出现的频率还是非常高的,看评论里有人说是水军,拿钱了,不知道你怎么看呢

最后给出完整代码

最后给出完整代码

Part1:https://github.com/zhouwei713/douban/tree/master/jackchen

Part2:https://github.com/zhouwei713/data_analysis/tree/master/maoyan

相关文章
|
BI
解决File.delete()删除不掉文件
首先注意两点: 此文件被使用的时候无法删除(比如网络输出没关闭流) 判断此文件是否存在再做删除(exists) 删除文件夹之前先删除文件夹下的所有文件(递归解决) 判断是否删除成功会有返回值,文件名错了的话,删除文件不会报错。
2462 0
|
Web App开发 开发者
Chrome 插件篇 - 已安装的crx插件源码查看,插件安装位置查看方法
Chrome 插件篇 - 已安装的crx插件源码查看,插件安装位置查看方法
1687 0
Chrome 插件篇 - 已安装的crx插件源码查看,插件安装位置查看方法
|
8月前
|
域名解析 存储 人工智能
Manus的技术实现原理浅析与简单复刻
作者参考网络相关信息并加上个人理解,对Manus的技术实现原理进行深入分析,并做了一个简单版本的复刻,欢迎大家在评论区互相交流探讨~
Manus的技术实现原理浅析与简单复刻
|
消息中间件 Java 测试技术
Python性能测试全攻略:JMeter与Locust,双剑合璧斩断性能瓶颈🗡️
【8月更文挑战第4天】在软件开发中,性能至关重要。对Python开发者来说,掌握高效性能测试方法尤为关键。本文将带您探索性能测试工具JMeter与Locust的强大功能。JMeter作为Java世界的巨擘,以其强大功能和灵活性在性能测试领域占有一席之地,不仅适用于Java应用,也能测试Python Web服务。
264 0
|
数据挖掘 C语言 C++
R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。
【10月更文挑战第21天】时间序列分析是一种重要的数据分析方法,广泛应用于经济学、金融学、气象学、生态学等领域。R语言是一种强大的统计分析工具,提供了丰富的函数和包用于时间序列分析。本文将介绍使用R语言进行时间序列分析的基本概念、方法和实例,帮助读者掌握R语言在时间序列分析中的应用。
303 3
|
Arthas Java 应用服务中间件
一次Tomcat返回404的分析
一个Web应用部署在阿里云EDAS上,使用Tomcat 7.0.59.3,在测试环境遭遇所有接口返回404的问题,而生产环境正常。测试与生产环境主要差异在于Apollo配置不同。通过Arthas工具监控,确认Spring已正确加载Controller,并且请求未进入Spring或Filter处理流程。进一步分析发现,Tomcat内部处理流程中设置了404状态码,最终定位到`org.apache.coyote.http11.AbstractHttp11Processor.process`方法存在问题。通过对代码逻辑的分析,确定原因是请求URL路径不正确。修正URL路径后问题得到解决。
276 1
一次Tomcat返回404的分析
|
网络协议 网络虚拟化 网络架构
单臂路由实现VLAN间路由
本文介绍了单臂路由实现VLAN间路由的配置方法,包括网络设备的IP配置、交换机的VLAN划分、路由器的子接口配置以及ARP广播的设置,并通过ping测试验证了配置的正确性。
单臂路由实现VLAN间路由
|
存储 移动开发 JavaScript
IRS应用发布之十一:应用部署发布
开发商工作台基于Docker体系和NodeJS构建发布系统,Docker镜像版本为NodeJS Long Term Support (LTS)版(node:lts),根据NodeJS升级计划自动更新默认版本。构建流程如下所示:
IRS应用发布之十一:应用部署发布
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的民宿短租系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的民宿短租系统的详细设计和实现(源码+lw+部署文档+讲解等)
184 1
|
JSON JavaScript 前端开发
基于Vue+SpringBoot+MySQL实现个人博客系统
基于Vue+SpringBoot+MySQL实现个人博客系统