吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 11046|回复: 37
收起左侧

[Python 原创] [Python]Scrapy爬取猫眼流浪地球影评3----- 数据可视化

  [复制链接]
py看考场 发表于 2019-3-17 01:28
本帖最后由 py看考场 于 2019-4-8 22:45 编辑

大家好,前两个帖子为大家介绍了scrapy的安装配置以及对猫眼流浪地球评论的爬取,这个帖子是对爬取的数据可视化分析。
传输门   scrapy的安装配置     scrapy爬取评论数据

可视化分析之前,windows环境必须下载安装好的第三方模块有pandas,collections,pyecharts,jieba,matplotlib以及wordcloud,地图有关模块
其中pyecharts(各种图表)下载后通过pip安装,,方式和“scrapy的安装配置” 中的方法一样,在此就不介绍了
collections(统计)是python的内置模块,无需安装
重点介绍一下pandas,jieba,matplotlib和wordcloud,地图有关模块的安装方法

一.模块安装
1.pandas数据处理,matplotlib绘图
因为pandas,matplotlib依赖numpy,所以先pip install numpy,然后再pip install pandas, pip install --upgrade setuptools, pip install matplotlib

2.jieba分词
全自动安装: pip install jieba
半自动安装:首先在 https://pypi.org/project/jieba/#files 中下载.zip文件(访问此链接需要外网,不然速度太慢,因此在本帖最后我将附上此文件)

首先定位到解压后jieba的setup.py文件存在地方,然后输入python setup.py install安装(这里我已经安装过了)
1.png

3.wordcloud词云
这个模块安装较绕,我也是踩坑后解决的
直接用pip install wordcloud安装报错"error: Microsoft Visual C++ 14.0 is required. Get it with “Microsoft Visual C++ Build "
查看了很多方法,还是直接在https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud下载源文件安装最简单,最方便
下载的版本等信息可以参考我之前写的"scrapy的安装配置",将下载后的文件复制,放入你的python安装包的目录下(我是放在E:\Python3.6.0\Scripts下)首先一定要进去E:\Python3.6.0\Scripts这个路径下,然后在用pip install wordcloud-xxx.whl 安装,安装完后可以将安装包删除


4.地图相关模块
安装国家、省级、市级地图包
pip install echarts-countries-pypkg
pip install echarts-china-provinces-pypkg
pip install echarts-china-cities-pypkg



OK,相关模块已经安装好了!

二.直接上代码
提前说明一下,做词云用的数据跟做图表用的数据大小不同,因为数据过大时生成词云会出现MemoryError错误(64bit的python不会出现这种情况)

[Python] 纯文本查看 复制代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author : jin  time :2019/3/3
import pandas as pd
from collections import Counter
from pyecharts import Geo, Bar, Scatter
import jieba
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS
import time

#观众地域图中部分注释
#attr:标签名称(地点)
#value:数值
#visual_range:可视化范围
#symbol_size:散点的大小
#visual_text_color:标签颜色
#is_visualmap:是否映射(数量与颜色深浅是否挂钩)
#maptype:地图类型


#读取csv文件(除了词云,其它图表用的源数据)
def read_csv(filename, titles):
    comments = pd.read_csv(filename, names = titles, low_memory = False)
    return comments

#词云用的源数据(比较小)
def read_csv1(filename1, titles):
    comments = pd.read_csv(filename1, names = titles, low_memory = False)
    return comments

#全国观众地域分布
def draw_map(comments):
    attr = comments['city_name'].fillna('zero_token') #以'zero_token'代替缺失数据
    data = Counter(attr).most_common(300) #Counter统计各个城市出现的次数,返回前300个出现频率较高的城市
    # print(data)
    data.remove(data[data.index([(i,x) for i,x in data if i == 'zero_token'][0])]) #检索城市'zero_token'并移除('zero_token', 578)
    geo =  Geo('《流浪地球》全国观众地域分布', '数据来源:Mr.jin', title_color = '#fff', title_pos = 'center', width = 1000, height = 600, background_color = '#404a59')
    attr, value = geo.cast(data) #data形式[('合肥',229),('大连',112)]
    geo.add('', attr, value, visual_range = [0, 4500], maptype = 'china', visual_text_color = '#fff', symbol_size = 10, is_visualmap = True)
    geo.render('C:\\Users\\1\\Desktop\\流浪地球影评\\观众地域分布-地理坐标图.html')
    print('全国观众地域分布已完成')


#观众地域排行榜单
def draw_bar(comments):
    data_top20 = Counter(comments['city_name']).most_common(20) #前二十名城市
    bar = Bar('《流浪地球》观众地域排行榜单', '数据来源:Mr.jin', title_pos = 'center', width = 1200, height = 600)
    attr, value = bar.cast(data_top20)
    bar.add('', attr, value, is_visualmap = True, visual_range = [0, 4500], visual_text_color = '#fff', is_more_utils = True, is_label_show = True)
    bar.render('C:\\Users\\1\\Desktop\\流浪地球影评\\观众地域排行榜单-柱状图.html')
    print('观众地域排行榜单已完成')


#观众评论数量与日期的关系
#必须统一时间格式,不然时间排序还是乱的
def draw_data_bar(comments):
    time1 = comments['time']
    time_data = []
    for t in time1:
        if pd.isnull(t) == False and 'time' not in t: #如果元素不为空
            date1 = t.replace('/', '-')
            date2 = date1.split(' ')[0]
            current_time_tuple = time.strptime(date2, '%Y-%m-%d') #把时间字符串转化为时间类型
            date = time.strftime('%Y-%m-%d', current_time_tuple) #把时间类型数据转化为字符串类型
            time_data.append(date)
    data = Counter(time_data).most_common() #data形式[('2019/2/10', 44094), ('2019/2/9', 43680)]
    data = sorted(data, key = lambda data : data[0]) #data1变量相当于('2019/2/10', 44094)各个元组 itemgetter(0)
    bar =  Bar('《流浪地球》观众评论数量与日期的关系', '数据来源:Mr.jin', title_pos = 'center', width = 1200, height = 600)
    attr, value = bar.cast(data) #['2019/2/10', '2019/2/11', '2019/2/12'][44094, 38238, 32805]
    bar.add('', attr, value, is_visualmap = True, visual_range = [0, 3500], visual_text_color = '#fff', is_more_utils = True, is_label_show = True)
    bar.render('C:\\Users\\1\\Desktop\\流浪地球影评\\观众评论日期-柱状图.html')
    print('观众评论数量与日期的关系已完成')


#观众评论数量与时间的关系
#这里data中每个元组的第一个元素要转化为整数型,不然排序还是乱的
def draw_time_bar(comments):
    time = comments['time']
    time_data = []
    real_data = []
    for t in time:
        if pd.isnull(t) == False and ':' in t:
            time = t.split(' ')[1]
            hour = time.split(':')[0]
            time_data.append(hour)
    data = Counter(time_data).most_common()
    for item in data:
        temp1 = list(item)
        temp2 = int(temp1[0])
        temp3 = (temp2,temp1[1])
        real_data.append(temp3)
    data = sorted(real_data, key = lambda x : x[0])
    bar = Bar('《流浪地球》观众评论数量与时间的关系', '数据来源:Mr.jin', title_pos = 'center', width = 1200, height = 600)
    attr, value = bar.cast(data)
    bar.add('', attr, value, is_visualmap = True, visual_range = [0, 3500], visual_text_color = '#fff', is_more_utils = True, is_label_show = True)
    bar.render('C:\\Users\\1\\Desktop\\流浪地球影评\\观众评论时间-柱状图.html')
    print('观众评论数量与时间的关系已完成')


#词云,用一部分数据生成,不然数据量有些大,会报错MemoryError(64bit的python版本不会)
def draw_word_cloud(comments):
    data = comments['comment']
    comment_data = []
    print('由于数据量比较大,分词这里有些慢,请耐心等待')
    for item in data:
        if pd.isnull(item) == False:
            comment_data.append(item)
    comment_after_split = jieba.cut(str(comment_data), cut_all = False)
    words = ' '.join(comment_after_split)
    stopwords = STOPWORDS.copy()
    stopwords.update({'电影', '非常', '这个', '那个', '因为', '没有', '所以', '如果', '演员', '这么', '那么', '最后', '就是', '不过', '这个', '一个', '感觉', '这部', '虽然', '不是', '真的', '觉得', '还是', '但是'})
    wc = WordCloud(width = 800, height = 600, background_color = '#000000', font_path = 'simfang', scale = 5, stopwords = stopwords, max_font_size = 200)
    wc.generate_from_text(words)
    plt.imshow(wc)
    plt.axis('off')
    plt.savefig('C:\\Users\\1\\Desktop\\流浪地球影评\\WordCloud.png')
    plt.show()


#观众评分排行榜单
def draw_score_bar(comments):
    score_list = []
    data_score = Counter(comments['score']).most_common()
    for item in data_score:
        if item[0] != 'score':
            score_list.append(item)
    data = sorted(score_list, key = lambda x : x[0])
    bar = Bar('《流浪地球》观众评分排行榜单', '数据来源:Mr.jin', title_pos = 'center', width = 1200, height = 600)
    attr, value = bar.cast(data)
    bar.add('', attr, value, is_visualmap = True, visual_range = [0, 4500], visual_text_color = '#fff', is_more_utils = True, is_label_show = True)
    bar.render('C:\\Users\\1\\Desktop\\流浪地球影评\\观众评分排行榜单-柱状图.html')
    print('观众评分排行榜单已完成')


#观众用户等级排行榜单
def draw_user_level_bar(comments):
    level_list = []
    data_level = Counter(comments['user_level']).most_common()
    for item in data_level:
        if item[0] != 'user_level':
            level_list.append(item)
    data = sorted(level_list, key = lambda x : x[0])
    bar = Bar('《流浪地球》观众用户等级排行榜单', '数据来源:Mr.jin', title_pos = 'center', width = 1200, height = 600)
    attr, value = bar.cast(data)
    # is_more_utils = True 提供更多的实用工具按钮
    bar.add('', attr, value, is_visualmap = True, visual_range = [0, 4500], visual_text_color = '#fff', is_more_utils = True, is_label_show = True)
    bar.render('C:\\Users\\1\\Desktop\\流浪地球影评\\观众用户等级排行榜单-柱状图.html')
    print('观众用户等级排行榜单已完成')


if __name__ == '__main__':
    filename = 'C:\\Users\\1\\Desktop\\流浪地球影评\\comment.csv'
    filename2 = 'C:\\Users\\1\\Desktop\\流浪地球影评\\info3.csv'
    titles = ['city_name','comment','user_id','nick_name','score','time','user_level']
    comments = read_csv(filename, titles)
    comments2 = read_csv1(filename2, titles)
    draw_map(comments)
    draw_bar(comments)
    draw_data_bar(comments)
    draw_time_bar(comments)
    draw_word_cloud(comments2)
    draw_score_bar(comments)
    draw_user_level_bar(comments)


三.程序运行后效果与分析


1.观众地域分布-地理坐标图

《流浪地球》全国观众地域分布.png


由全国地域热力图可见,观众主要分布在中部,南部,东部以及东北部,各省会城市的观众尤其多(红色代表观众最多),这与实际的经济、文化、消费水平基本相符。


2.《流浪地球》观众地域排行榜单



《流浪地球》观众地域排行榜单.png


找到排名前20的城市,北京观众最多,不愧是首都。令人惊奇的是成都超过广州和上海位列第三,其它基本上也都是一二线城市


3.《流浪地球》观众评分排行榜单

《流浪地球》观众评分排行榜单.png

可以看到评分满分的用户几乎超过总人数的70%,可见观众看完电影之后很满足,也说明了电影的可看性很高


4.《流浪地球》观众评论数量与日期的关系

《流浪地球》观众评论数量与日期的关系.png

通过观众的评论日期可以看出,大年初一上映的第一天评论人数并不多,应该大家都在家里和家人团聚,从初二开始评论数就开始激增。其中初五,初六两天达到了峰值,原因可能是这两天是放假的最后两天,大家想趁着放假结束带着自己的孩子看一看电影吧。上班之后大家很忙,故人数开始下降


5.《流浪地球》观众评论数量与时间的关系

《流浪地球》观众评论数量与时间的关系.png

从图中可以看出,评论的数量主要集中在16-17点和21-23点,因为这部电影时长为2小时,所以把评论时间往前移动2小时基本就是看电影时间。可以看出大家都是中午吃完饭(13点左右)和晚上吃完饭(19点左右)后再去看电影的,而且晚上看电影的人更多


6.《流浪地球》观众用户等级排行榜单

《流浪地球》观众用户等级排行榜单.png

可见用户等级为0,5,6的用户基本没有,而且随着等级的提升,人数急剧变少。新用户可能是以年轻人为主,对科幻电影感兴趣,因而评论数量较多,而老用户主要偏向于现实剧情类的电影,评论数量较少


7.《流浪地球》词云图

WordCloud.png

这是8万多的评论集中产生的词云,出现的词越多,在图片中的字号就越大。可以看到大家评论最多的词为“好看”、“可以”、“流浪”,“地球”、“国产”、“科幻片”等

四.备注

1.以上就是对 《流浪地球》的可视化分析,分析结果仅代表个人观点
2.本来还想做一个关于用户等级与评分之间的关系的图表,一直达不到想要的效果,如果有大佬看到,希望指点一二,多谢
3.未解决数据过大时生成词云出现MemoryError问题(可以把32bitpython卸掉装为64bitpython,但想要其它解决方法),如果有大佬看到,希望指点一二,多谢
4.我将本帖用到的comment.csv和info3.csv以及生成的图表等数据已打包放在下面
5.如果对大家有用的话希望可以给个热心
6.jieba模块下载链接: https://pan.baidu.com/s/1qe3XUK8X0PPErixkpAuA2g 提取码: fkev
7.图表文件下载链接: https://pan.baidu.com/s/128a8wBEn28-69L3PVC9lCw 提取码: 2fwr
8.源代码: data_analysis.zip (2.79 KB, 下载次数: 88)

免费评分

参与人数 11吾爱币 +13 热心值 +10 收起 理由
你流和我流 + 1 热心回复!
keepython + 1 + 1 谢谢@Thanks!
时空之外 + 1 + 1 用心讨论,共获提升!
从0开始的小小怪 + 1 + 1 感谢分享
萌小蕾 + 1 用心讨论,共获提升!
wdye + 1 + 1 流弊坏了,谢谢lz分享
jay-j + 1 + 1 谢谢@Thanks!
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
zhao1125 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
潇洒超人 + 1 新来的朋友真厉害 欢迎。
joneqm + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

166818008 发表于 2019-10-10 11:32
Traceback (most recent call last):
  File "c:/Users/Administrator/Desktop/webspider/maoyan/maoyan/data_analysis.py", line 161, in <module>
    draw_map(comments)
  File "c:/Users/Administrator/Desktop/webspider/maoyan/maoyan/data_analysis.py", line 38, in draw_map
    geo =  Geo('《流浪地球》全国观众地域分布', '数据来源:Mr.jin', titles_color = '#fff', titles_pos = 'center', width = 1000, height = 600, background_color = '#404a59')
TypeError: __init__() got an unexpected keyword argument 'titles_color'
kabin 发表于 2019-7-27 17:20
楼主您好,我用的是anaconda,根据您的代码安装了echart,但导入时报错,不知道怎么解决。
ImportError: cannot import name 'Geo' from 'pyecharts' (d:\Program\Anaconda3\lib\site-packages\pyecharts\__init__.py)
from pyecharts import charts, commons, components, datasets, options, render, scaffold
from pyecharts._version import __author__, __version__
谢谢。
kinalon 发表于 2019-3-17 02:38
wuharlin 发表于 2019-3-17 08:27
技术贴,感谢
tclin08 发表于 2019-3-17 08:47
技术贴,如果能把爬虫代码贴出来,那更好。
po1lux 发表于 2019-3-17 10:30
这个数据分析有点厉害啊,学习一下
 楼主| py看考场 发表于 2019-3-17 10:34 来自手机
tclin08 发表于 2019-3-17 08:47
技术贴,如果能把爬虫代码贴出来,那更好。

可以参见我的上一篇帖子
wuchen2138 发表于 2019-3-17 15:45
哇,学习学习,厉害
rickw 发表于 2019-3-17 21:20
不错的技术贴
tclin08 发表于 2019-3-18 10:33
py看考场 发表于 2019-3-17 10:34
可以参见我的上一篇帖子

感谢,先去学习学习!
jay-j 发表于 2019-3-18 12:15
哇可以可以
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 13:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表