↑ 关注 + 星标 ~ 有趣的不像个技术号
每晚九点,我们准时相约  

大家好,我是朱小五
今天给大家带来一个关于电影的数据分析文章。
别走啊,这次不是豆瓣,也不是猫眼
真的
今天分析的电影是韩国电影《寄生虫》。
它是由韩国导演奉俊昊自编自导的影片,一举拿下最佳影片、最佳导演、最佳原创剧本和最佳国际电影四座奥斯卡奖杯,创造历史成为奥斯卡史上首部非英语最佳影片。
nb plus!
这次带大家看看韩国人如何评价这部韩国电影的?

获取数据

数据从哪获取呢?
我们先打开韩国最大门户网站NAVER
找到영화(电影)板块,搜索기생충(寄生虫)并打开
上面介绍部分跟猫眼专业版一样,各种评分、演职员表、评分男女比例、年龄分布。
在评论区部分,它其实有点像是豆瓣和猫眼的综合体,无论看没看过都可以评价打分,不过看过的会单独有个小标识。
我们下划到评论区
下图中可以看到,目前有36360条评价,我们想要获取的数据是黑框中的内容。
包括每条留言的评论人昵称、评论时间、评分、评论内容以及这条评论得到的赞或踩。
下面开始爬取评论数据
利用requests和pyquery爬取数据,展示部分源码,完整见文末。
defmain():
data = []

for
i
in
range(
1
,
200
):
#爬取多少页
url =
'https://movie.naver.com/movie/bi/mi/pointWriteFormList.nhn?code=161967&type=after&onlyActualPointYn=N&onlySpoilerPointYn=N&order=newest&page='
+str(i)

print(
'准备采集第{}页数据'
.format(i))

html = restaurant(url)

doc = pq(html)

for
i
in
range(
0
,
10
):

print(i)

dic = {}

dic[
'star'
] = doc(
'li:nth-child('
+ str(i+
1
) +
') > div.star_score > em'
).text()

dic[
'text'
] = doc(
'#_filtered_ment_'
+ str(i)).text()

dic[
'datetime'
] = doc(
'li:nth-child('
+ str(i+
1
) +
') > div.score_reple > dl > dt > em:nth-child(2)'
).text()

dic[
'name'
] = doc(
'li:nth-child('
+ str(i+
1
) +
') > div.score_reple > dl > dt > em:nth-child(1) > a'
).text()

dic[
'zan'
] = doc(
'li:nth-child('
+ str(i+
1
) +
') > div.btn_area > a._sympathyButton > strong'
).text()

dic[
'cai'
] = doc(
'li:nth-child('
+ str(i+
1
) +
') > div.btn_area > a._notSympathyButton > strong'
).text()

data.append(dic)

#time.sleep(random.random())
pd.DataFrame(data).to_csv(
'寄生虫评论.csv'
,encoding=
"utf_8"
,index =
False
)

return
data

运行结果:
歪瑞古德!
这样我们就成功获取了韩国人评价韩国电影《寄生虫》的评论数据!

数据整理

我们简单看一下数据
共35940条,比上文截图时候少了一点,这是因为我爬取和写这篇文章的时候有一点时间间隔,所以这个小问题请忽略。
另外,非常明显,评论字段缺失了很多。
我查看了一下,认为是在这个网站观看过电影的人可以只打分,不写评论。
(有点像在猫眼上买了电影票,评论时候同样可以只打分,不写评论
简单补齐它吧,直接删除还是会影响整体的评分的。
defdata_cleaning(df):
cols = df.columns

for
col
in
cols:

if
df[col].dtype ==
'object'
:

df[col].fillna(
'缺失数据'
, inplace =
True
)

else
:

df[col].fillna(
0
, inplace =
True
)

return
(df)

这样我们就补全了缺失值
简单看一下平均分吧
看来这就是韩国观众的打分(9.07)比网民对《寄生虫》虫的评价(8.48)要高。
这与国内的情况也是相似的,同一部电影猫眼淘票票的分数普遍比豆瓣上要高。
毕竟真金白银去看电影的人,肯定会认为它是一部好片子才去看。
只要不像被《爱情公墓》一样诈骗,基本观众的分数不会太低。
后面想讲韩国网友的评论做一个词云,这样的话我们就需要先将评论中的韩文翻译成中文。

翻译评论

采用哪个翻译软件呢?
尝试了几个常见的翻译,发现结果都大同小异。
干脆采用了之前自己用过的有道翻译小接口。
deftranslate(text):
url =
'http://fanyi.youdao.com/translate?&doctype=json&type=KR2ZH_CN&i='
+ text

requ_text = requests.get(url)

json_text = requ_text.json()

data = json_text[
'translateResult'
][
0
][
0
][
'tgt'
]

time.sleep(
2
+random.random())

print(
'翻译中'
)

return
data

将评论列翻译,并新建一列用以做词云
ata['text_t'] = data.apply(lambda x :translate(x['text']), axis=1)
运行结果
额,这个翻译一言难尽,不过大体意思还是可以看懂的,不太影响做词云。
接下来我们开始尝试做做图。

分析与可视化

正常利用python分析电影评论都有一个环节是男女比例和评分比例,这次我们并没有获得相关数据,那么就用NAVER网站提供的结果图简单的讲一下吧。
观看人群的性别比例非常均衡,各占50%。
各年龄段均有分布,其中[20,30)的观看人群最多。为什么10-20岁的青少年观看这么少呢?后面词云部分会回答这个问题。
在上图普通网民的评价中,女性评分更高一些。随着年龄的增长,评分越低,难道是越是年龄大的人越看透了韩国的现状?
他们主要的欣赏点依次是“导演”、“연기”、“故事”、“视觉效果”、“电影原声”。
(其中的“연기”用翻译软件都是翻译成烟,难道是特效的意思?懂韩文的同学可以留言一下)
至于看过电影的观众打分比普通网民会高,平均9.07分,而且男性比女性要略高。其他方面大体相似,就不讲了。
我们再看一下,韩国观众对电影《寄生虫》评论数量的时间走势。
plt.figure(figsize=(
8
,
5
), dpi=
200
)

x = score_by_time.index.date

y = score_by_time.values

plt.plot(x,y,c=
"g"
,marker=
"."
,ls=
"-"
)


plt.title(
"韩国电影《寄生虫》评论数走势图"
)

plt.xlabel(
"月份"
)

plt.ylabel(
"评论数"
)

结果如下
可以明显看到,评论数量在电影《寄生虫》上映后达到一个高峰,而后随着时间的推移,数量逐渐减少。
之后有两个小高峰,分别是2019年8月初和2020年2月初。
通过查找新闻信息,收集到了两个消息:
1、韩国电影《寄生虫》,预计将在8月6日公开流媒体服务(就相当于我国的爱奇艺、优酷类似的平台)。
2、《寄生虫》2月10日拿下四项奥斯卡大奖后,在韩国的热度继续上升。
这样大家应该就解释清楚两个小高峰的问题啦。
最后我们再利用有道翻译好的评论数据做个WordCloud词云吧。
在对主创人员的讨论中,奉俊昊导演的功力和宋康昊的杰出演技被多次提及,电影中提到的“气味”“果酱”“戒指”也被多次探讨,故事中对社会与现实的反思也是热门的讨论话题。
前文我提到了为什么10-20岁的青少年观看这么少呢?而且词云中“15”这个关键词也比较突出。
这是因为韩国于1998年建立电影分级制度。规定电影分为5个等级:全民、12岁以上、15岁以上、18岁以上可以观看和限制放映。
而《寄生虫》在韩国获得了“15岁以上可以观影”的等级判定。
对作品内容就不做评价了。
以上。
后台回复关键词「进群」,即刻加入读者交流群~
这篇文章的灵感在去年看《寄生虫》就有了,结果就拖延拖延;
到了今年《寄生虫》获得奥斯卡,结果又因为那段时间工作忙,没时间写,就拖到了现在。
所以说,大家多多点在看,这样我就不好意思拖延不发原创了,是不是
继续阅读
阅读原文