知道《悲伤逆流成河》上映还是在qq空间看见学弟发了说说,突然想起初中追小四的书,每天看到晚上10点多,昨天看了枪版的《悲伤逆流成河》,整个故事情节几乎和小说一模一样,当然缩减是避免不了的,最大的不一样的是原著里的易遥是跳楼自杀的,而电影里路遥是在众人的"舌枪唇剑"、幸灾乐祸的眼睛下,带着不甘与怨恨跳河自杀的,最后竟然…我就不剧透了,整部剧大概一个小时四十分钟下来全程无尿点,昨天就是枪版的我都看了两遍…(正打算找人去电影院再看一遍),也是看了第一遍,才让我想写这篇充满技术+情感的文章。
http://maoyan.com/films/1217236
我们直接访问这个,在web端只能看到最热的10条短评,那怎么获取到所有短评呢?
(1) 访问上面的链接,按下F12,然后点击图片上的图标,把浏览模式(响应式设计模式,火狐快捷键Ctrl+Shift+M)改为手机模式,刷新页面。
第一步
刷新后
(2)换用谷歌浏览器,F12下进行上面操作,加载完毕后下拉短评,页面继续加载,找到含有
offset和startTime
的加载条,发现它的
Response
中包含我们想要的数据,为
json
格式。
获取到真正的评论接口
(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
import
requests
from
fake_useragent
import
UserAgent
import
json
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)数据简单介绍
数据介绍表
文末
获取封装好的爬取猫眼电影数据代码。
猫眼短评的反爬可以说几乎没有,中间断了两次,更改数据,重新运行即可,不封ip。
代码:
运行结果:
代码:
运行结果:
从数据上看,大多数评论者在注册猫时个人信息栏没有标注性别,而且男女中,评分者主要是女生,也好理解,这本来就是一部比较文艺、小众的青春篇,女生可能更为喜爱,而男生可能更加喜欢动作大片。
代码:
运行结果:
从中可以看出,大多数观影评分者位于我国东南部分,城市分布上,深圳、成都、北京、武汉、上海占据前五,因为图标里还有很多地级市,所以数据不集中(最大的也只有几百),还是可以看出,这些人大多分布在一二线城市,有消费能力,也愿意在节假日消费,有钱,就是好。
代码:
运行结果:
由于数据显示不完整,不能很好的看出评论数量变化,但基本可以看出每天的评论数都为1005,我估计是猫眼限制了每天评论数的显示,或者我获取的时候被限制了,从9.21开始到10.6的16天里,每天新增评论数均达到最大值,可以说明其热度不减。
代码:
运行结果:
从数据可视化结果可以看出,评论者中有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
# 获取数据并存储
def
get_data
(self,json_comment)
:
json_response = json_comment[
"cmts"
]
# 列表
list_info = []
for
data
in
json_response:
cityName = data[
"cityName"
]
content = data[
"content"
]
if
"gender"
in
data:
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.存储数据
# 存储文件
def
file_do
(list_info)
:
# 获取文件大小
file_size = os.path.getsize(
r'G:\maoyan\maoyan.csv'
)
if
file_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
:
with
open(
r'G:\maoyan\maoyan.csv'
,
'a+'
, newline=
''
)
as
file_test:
# 追加到文件后面
writer = csv.writer(file_test)
# 写入文件
writer.writerows(list_info)
4.封装代码
5.运行结果显示
三、技术搞事情(数据分析可视化)
1.提取数据
def
read_csv
()
:
content =
''
# 读取文件内容
with
open(
r'G:\maoyan\maoyan.csv'
,
'r'
, encoding=
'utf_8_sig'
, newline=
''
)
as
file_test:
# 读文件
reader = csv.reader(file_test)
i =
for
row
in
reader:
if
i !=
:
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
) +
'条数据'
)
return
content
一共有:15195条数据
2.评论者性别分布可视化
# 评论者性别分布可视化
def
sex_distribution
(gender)
:
# print(gender)
from
pyecharts
import
Pie
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.评论者所在城市分布可视化
# 评论者所在城市分布可视化
def
city_distribution
(cityName)
:
city_list = list(set(cityName))
city_dict = {city_list[i]:
for
i
in
range(len(city_list))}
for
i
in
range(len(city_list)):
city_dict[city_list[i]] = cityName.count(city_list[i])
# 根据数量(字典的键值)排序
sort_dict = sorted(city_dict.items(), key=
lambda
d: d[
1
], reverse=
True
)
city_name = []
city_num = []
for
i
in
range(len(sort_dict)):
city_name.append(sort_dict[i][
])
city_num.append(sort_dict[i][
1
])
import
random
from
pyecharts
import
Bar
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"
)
# 地图可视化
def
render_city
(cities)
:
点击阅读原文查看该函数完整代码
4.每日评论总数可视化分析
# 每日评论总数可视化分析
def
time_num_visualization
(time)
:
from
pyecharts
import
Line
time_list = list(set(time))
time_dict = {time_list[i]:
for
i
in
range(len(time_list))}
time_num = []
for
i
in
range(len(time_list)):
time_dict[time_list[i]] = time.count(time_list[i])
# 根据数量(字典的键值)排序
sort_dict = sorted(time_dict.items(), key=
lambda
d: d[
], reverse=
False
)
time_name = []
time_num = []
print(sort_dict)
for
i
in
range(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"
)
5.评论者猫眼等级、评分可视化
# 评论者猫眼等级、评分可视化
def
level_score_visualization
(userLevel,score)
:
from
pyecharts
import
Pie
userLevel_list = list(set(userLevel))
userLevel_num = []
for
i
in
range(len(userLevel_list)):
userLevel_num.append(userLevel.count(userLevel_list[i]))
score_list = list(set(score))
score_num = []
for
i
in
range(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"
)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。