社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python 爬取了猫眼 47858 万条评论,告诉你《飞驰人生》值不值得看?!

CSDN • 6 年前 • 908 次点击  


坦白说,看前几部电影的时候,我一直在想“到底放不放阿信的歌啊?什么时候放啊?”,那看《飞驰人生》的时候,直到影片结束片尾曲《一半人生》响起的时候,我才记起来,哦,之前我是为了这首歌才看的这部电影。



截止大年初四晚上24点,猫眼实时数据显示《飞驰人生》综合票房排名第三,票房占比16.1%。但是仅仅依靠数字怎么能直接看出一部电影的优劣呢?不如们来看看观众们的评论,看看从中能得出什么有趣的点。



数据爬取



其实我一开始是想用豆瓣网的评论的,但是我翻了翻吧,发现“最热评论”只能看到500条,“最新评论”只能显示100条,拿600条数据能分析出个啥?



百度了一下,看大家都是用猫眼评论,于是就……爬猫眼!网页版的猫眼只能显示有限的评论,切换到APP版本才能看到所有评论。



找network里面的网页也不难,随便拿一条评论搜索一下就可以找到👇


Crtl+F



关键是找到不同网页之间的变化规律(要不是我在这上面栽了跟头,初三就能写完这篇文章了……😢)



有些网址,表面看上去,区别就是在于offset(偏移量),但是实际上更改这个数值到1005的时候就爬不到东西了(可能是由于网页内部的设置吧),就是说这么下去我们只能得到1000条评论。


那是哪1000条评论呢?我们看到网址中有个关键词“ts=1549640420581”,其实就是当前时间的意思(时间戳),转化一下就是:



所以1000条就是从这个时间点,往前偏移15条后,最新的1000条评论。


通过百度各位大神的爬虫过程,我发现终极解决方法就是更改ts的值!如果说偏移量15的意思是从这个查询的时间往前偏移15条再取得15条评论数据(limit=15),那么我们每次更改ts值不就可以了。


第一个ts值是程序开始运行的时间,第二个值就从已经获取的评论数据中拿到最早的那个数据,以此不断往前翻滚……


我爬取了2月8日24点之前的所有评论信息,按App显示此时至少有80000+条数据,但是我爬下来总共只有4w+条…数据缺失还是比较严重的。



数据格式如下(包括用户id、用户昵称、用户猫眼等级、性别、时间、评分、评论内容、点赞数和评论数):



这些都是在json里面,格式非常清晰明了。




数据清洗



拿到数据除了做词云用了Python(代码在最后),其他的内容Excel分分钟解决,这里尤其感谢发明“数据透视表”的兄弟。



数据分析



1.观众信息



男女比例各占一半,男的对赛车这类刺激性东西感兴趣可以理解,这女观众都是为了啥?为了黄景瑜小哥哥的脸?还是像我一样冲着阿信来的?这里信息太少,我只做少量胡思乱猜。


用户等级又是类似于正态分布的形状,巧的嘞……其中0分和1分的用户(可以认定为新注册用户)仅占9.78%,可以看出评分的人中水军是很少的,基本都是猫眼老用户。

再看看这4天用户评价数量的变化:



基本可得这部电影热度呈现缓慢下降的趋势(但是由于数据的不完整性,不能绝对说明)。

那用户都喜欢在什么时间评论呢?对比看四天的评论hour数据:



如果大家习惯看完电影马上评价的话,那么从评论趋势来看,从中午12点之后评论数逐渐增加,推测是由于早上10点左右那场电影的结束。随后评论数不断增加,在晚饭前的5、6点和睡觉前的23点左右达到小高峰。


嗯,非常符合大家“醒了看电影,看完吃饭,吃了再看,看了再睡‘的“节假日生活作息”。



2.评分情况



按照我爬取的数据我们看到超过一半(52.37%)的观众给这部电影打了满分10分,极少量用户评分在6分以下(仅占7.58%)。根据我爬取的数据,计算所得平均分是8.725,和实时显示的分数8.8相差不大。


除了从宏观角度看评分,我们来瞧瞧评论者性别和评论时间与最终评分有什么不能说的秘密?



性别的不同并没有造成评分很大的区别,男观众和女观众的评分平均分仅仅相差0.35分,“未知性别”人群的评分在两者之间,基本等于男性评分8.53和女性评分8.88的的平均值(8.71)。嗯,我很有理由怀疑“未知人群”中男女比例也各占一半!


从评分时间和评分的关系来看,低分一般出现在0点到7点之间,我猜吧,大概是在这种夜深人静的时候,大家的情绪容易有大起大落,白天看完电影时的兴奋已经退去,留下的只有深深的思考,或许还带点批判性,吧。



3.评论内容


先看看点赞数最高的5条评论



我们发现前5条评论评分均为10分:其中第一条,emmm,与电影无关,暂时跳过……其他几条都是赞美韩寒、沈腾和黄景瑜的。

那通过词云具体看一下评论内容:



从词云图中可以看出:


出现频率最高的是“好看”“不错”“喜欢”,说明观众对《飞驰人生》的整体评价是很不错的。

韩寒”“沈腾”或是该片最大赢家,评论中对他们的名字提到多次;“黄景瑜”“尹正”作为相对名气较小的演员,在此片中的表现也不逊其他人:尹正饰演的宇强说得了中二台词、跳得了性感钢管舞,能给张弛带来当头一棒的警醒,也是一直在他身后的精神支柱;黄景瑜饰演的林臻东人设完美,简直是所有女孩的理想型:多金、高颜值、优秀而又谦逊,爱了爱了。

从剧情来看,“励志”“搞笑”“热血”“梦想 ”这些词语也说明这是一部超燃的电影,里面有一句台词“不是非得赢,我只是不想输”,够中二吧?但也够热血。

词云里面另一个高频词是”结局“(”结尾“),影片的最后张弛因为不能及时刹车冲向了落日,彩蛋里面却出现了他与儿子同学的飞行员爸爸比赛的场景。随着儿子的投币,场景一转,浮现了”Heroes never die“,“英雄不朽”,张弛永远地活在了他儿子的心中。另:巴音布鲁克草原在新疆,哪儿有海?




不成熟的代码



1.爬取评论


1from bs4 import BeautifulSoup
2import requests
3import warnings
4import re
5from datetime import datetime
6import json
7import random
8import time
9import datetime
10
11
12
13headers = {
14    'User-Agent''Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1',
15    'Connection':'keep-alive'}
16cookies={'cookie':'_lxsdk_cuid=168c325f322c8-0156d0257eb33d-10326653-13c680-168c325f323c8; uuid_n_v=v1; iuuid=30E9F9E02A1911E9947B6716B6E91453A6754AA9248F40F39FBA1FD0A2AD9B42; webp=true; ci=191%2C%E5%8F%B0%E5%B7%9E; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; __mta=49658649.1549462270794.1549465778684.1549548206227.3; _lxsdk=30E9F9E02A1911E9947B6716B6E91453A6754AA9248F40F39FBA1FD0A2AD9B42; _lxsdk_s=168c898414e-035-f0e-e6%7C%7C463'}
17
18#url设置offset偏移量为0
19url = 'http://m.maoyan.com/review/v2/comments.json?movieId=1218091&userId=-1&offset=0&limit=15&ts={}&type=3'
20
21comment=[]
22nick=[]
23score=[]
24comment_time=[]
25gender=[]
26userlevel=[]
27userid=[]
28upcount=[]
29replycount=[]
30ji=1
31
32
33url_time=url_time=int(time.time())*1000#获取当前时间(单位是毫秒,所以要✖️1000)
34
35for i in range(2000):
36    value=15*i
37    url_range=url.format(url_time)
38     res=requests.get(url_range,headers=headers,cookies=cookies,timeout=10)
39    res.encoding='utf-8'
40    print('正在爬取第'+str(ji)+'页')
41    content=json.loads(res.text,encoding='utf-8')
42    list_=content['data']['comments']
43    count=0
44    for item in list_:
45        comment.append(item['content'])
46        nick.append(item['nick'])
47        score.append(item['score'])    
48        comment_time.append(datetime.datetime.fromtimestamp(int(item['time']/1000)))
49        gender.append(item['gender'])
50        userlevel.append(item['userLevel'])
51        userid.append(item['userId'])
52        upcount.append(item['upCount'])
53        replycount.append(item['replyCount'])
54        count=count+1
55        if count==15:
56            url_time=item['time']
57    ji+=1
58    time.sleep(random.random())
59print('爬取完成')
60print(url_time)
61result={'用户id':userid,'用户昵称':nick,'用户等级':userlevel,'性别':gender,'时间':comment_time,'评分':score,'评论内容':comment,'点赞':upcount,'评论':replycount}
62results=pd.DataFrame(result)
63results.info()
64results.to_excel('猫眼_飞驰人生.xlsx')


2.画词云


1import pandas as pd
2import numpy as np
3import re
4import jieba
5import wordcloud
6import matplotlib.pyplot as plt
7from collections import Counter
8from PIL import Image
9 jieba.load_userdict("new.txt"#新定义词典
10df=pd.read_excel('猫眼_飞驰人生.xlsx')
11
12comments=str()
13for comment in df['评论内容']:
14    comments=comments+comment
15
16stopwords = {}.fromkeys([ line.rstrip() for line in open('stopwords.txt') ])
17segs = jieba.cut(comments,cut_all=False)
18
19cloud_text =[]
20for seg in segs:
21    if seg not in stopwords:
22            cloud_text.append(seg)      
23
24fre= Counter(cloud_text)
25
26mask = np.array(Image.open('d.jpeg')) # 定义词频背景
27wc = wordcloud.WordCloud(
28    font_path='Hiragino Sans GB.ttc'# 设置字体格式
29    mask=mask, # 设置背景图
30    max_words=150# 最多显示词数
31     max_font_size=150 # 字体最大值
32)
33
34wc.generate_from_frequencies(fre) # 从字典生成词云
35image_colors = wordcloud.ImageColorGenerator(mask) # 从背景图建立颜色方案
36wc.recolor(color_func=image_colors) # 将词云颜色设置为背景图方案
37plt.imshow(wc) # 显示词云
38plt.axis('off'# 关闭坐标轴
39plt.show() # 显示图像
40wc.to_file('comment_pic.png')



写在最后



现在是大年初留,没看电影的大家抓住假期的尾巴去瞧一瞧,电影很精彩,片尾曲《一半人生》也很好听哦!



下面是我看完电影当晚做的影评手账📖



还有还有,祝大家新年快乐,🐷事情顺利!



作者:Yura,计算机科学与技术专业大四在读,因在澳洲交换学习接触了大数据,甚感兴趣。遂开公众号“Yura不说数据说”督促自己学习数据分析!欢迎大家关注我的个人公众号,一起(监督我)学习。

声明:本文为作者投稿,版权归其个人所有。

 热 文 推 荐 

☞ 意大利不禁止华为;13 款 5G 手机时间表公布;亚马逊 CEO 遭威胁 | 极客头条

☞ 程序员们的“钢铁审美”:花花公子封面女郎如何成为互联网第一夫人?

☞ 如果我回腾讯上班

☞ 断舍离:我彻底戒掉苹果、微软、Google、Facebook 和亚马逊之后?

☞  微信说不!有何不可?

☞ 移动互联网“大开放”之死

☞ @程序员,沟通这项核心技能你掌握了多少?

☞ 年薪 10 万的程序员,如何积累人生的第一个 100 万?

print_r('点个好看吧!');
var_dump('点个好看吧!');
NSLog(@"点个好看吧!");
System.out.println("点个好看吧!");
console.log("点个好看吧!");
print("点个好看吧!");
printf("点个好看吧!\n");
cout "点个好看吧!");
fmt.Println("点个好看吧!");
Response.Write("点个好看吧!");
alert("点个好看吧!" )
echo "点个好看吧!"

喜欢就点击“好看”吧!

今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/fFuxOEV0OP
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/28696
 
908 次点击