一、我的感受

知道《悲伤逆流成河》上映还是在qq空间看见学弟发了说说,突然想起初中追小四的书,每天看到晚上10点多,昨天看了枪版的《悲伤逆流成河》,整个故事情节几乎和小说一模一样,当然缩减是避免不了的,最大的不一样的是原著里的易遥是跳楼自杀的,而电影里路遥是在众人的"舌枪唇剑"、幸灾乐祸的眼睛下,带着不甘与怨恨跳河自杀的,最后竟然…我就不剧透了,整部剧大概一个小时四十分钟下来全程无尿点,昨天就是枪版的我都看了两遍…(正打算找人去电影院再看一遍),也是看了第一遍,才让我想写这篇充满技术+情感的文章。

二、技术搞事情(爬一爬)1.猫眼电影短评接口

http://maoyan.com/films/1217236

我们直接访问这个,在web端只能看到最热的10条短评,那怎么获取到所有短评呢?
(1) 访问上面的链接,按下F12,然后点击图片上的图标,把浏览模式(响应式设计模式,火狐快捷键Ctrl+Shift+M)改为手机模式,刷新页面。

第一步

刷新后

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

获取到真正的评论接口

2.获取短评

(1)简单分析

通过上面分析
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是不变的。
(2)代码获取

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

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

importrequests
fromfake_useragentimportUserAgent
importjson
headers={
"User-Agent":UserAgent(verify_ssl=False).random,
"Host":"m.maoyan.com",
"Referer":"http://m.maoyan.com/movie/1217236/comments?_v_=yes"
}
#猫眼电影短评接口
offset=
#电影是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数据


(3)数据简单介绍

数据介绍表

(4)数据提取

#获取数据并存储
defget_data(self,json_comment):
json_response=json_comment["cmts"]#列表
list_info=[]
fordatainjson_response:
cityName=data["cityName"]
content=data["content"]
if"gender"indata:
gender=data["gender"]
else:
gender=
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.存储数据

#存储文件
deffile_do(list_info):
#获取文件大小
file_size=os.path.getsize(r'G:\maoyan\maoyan.csv')
iffile_size==:
#表头
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:
withopen(r'G:\maoyan\maoyan.csv','a+',newline='')asfile_test:
#追加到文件后面
writer=csv.writer(file_test)
#写入文件
writer.writerows(list_info)
4.封装代码

文末获取封装好的爬取猫眼电影数据代码。

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

5.运行结果显示

获取数据显示三、技术搞事情(数据分析可视化)1.提取数据

代码:

defread_csv():
content=''
#读取文件内容
withopen(r'G:\maoyan\maoyan.csv','r',encoding='utf_8_sig',newline='')asfile_test:
#读文件
reader=csv.reader(file_test)
i=
forrowinreader:
ifi!=:
time.append(row[])
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)+'条数据')
returncontent

运行结果:

一共有:15195条数据
2.评论者性别分布可视化

代码:

#评论者性别分布可视化
defsex_distribution(gender):
#print(gender)
frompyechartsimportPie
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.评论者所在城市分布可视化

代码:

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

importrandom
frompyechartsimportBar
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")

#地图可视化
defrender_city(cities):
点击阅读原文查看该函数完整代码

运行结果:

柱状图城市分布

地理位置分布

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

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

代码:

#每日评论总数可视化分析
deftime_num_visualization(time):
frompyechartsimportLine
time_list=list(set(time))
time_dict={time_list[i]:foriinrange(len(time_list))}
time_num=[]
foriinrange(len(time_list)):
time_dict[time_list[i]]=time.count(time_list[i])
#根据数量(字典的键值)排序
sort_dict=sorted(time_dict.items(),key=lambdad:d[],reverse=False)
time_name=[]
time_num=[]
print(sort_dict)
foriinrange(len(sort_dict)):
time_name.append(sort_dict[i][])
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.评论者猫眼等级、评分可视化

代码:

#评论者猫眼等级、评分可视化
deflevel_score_visualization(userLevel,score):
frompyechartsimportPie
userLevel_list=list(set(userLevel))
userLevel_num=[]
foriinrange(len(userLevel_list)):
userLevel_num.append(userLevel.count(userLevel_list[i]))

score_list=list(set(score))
score_num=[]
foriinrange(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=[40,75],
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=[50,50],
is_random=True,
radius=[30,75],
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%,可以看出大家对该电影是一致好评。


源码:


https://github.com/XksA-me/spider/tree/master/spider_maoyan