影评分析第1篇 电影《无双》

1.电影《无双》-写在前面

本套教程,全部基于相同的套路,为的是告诉你python如何入门数据分析,所以每一篇博客的难度都不大,本系列的博客每周更新1~2篇。

本篇文章仅供Python新手入门学习使用,展示一下求生欲。

在这里插入图片描述
今天爬取的是现在电影《无双》 目前评论数据最好爬取的应该还是猫眼,其他的限制太多。猫眼在爬取的时候,如果你去搜索,基本都是在爬取
http://m.maoyan.com/mmdb/comments/movie/342166.json?_v_=yes&offset=30&startTime=2018-10-12%2010%3A14%3A20 这个地址。

分析这个地址,324166.json 是影片ID,offset=30 这个非常重要是,是按照15的倍数进行叠加的,但是尴尬的是,当你不断叠加之后,发现到1000,他就叠加不下去了,应该是猫眼限制了一下数据。

所以转变一下思路就好了

我们把offset锁死在0 然后修改开始时间 startTime 每次获取15条就好,一直到影片的上映日期。写完这篇文章之后,这个口不会也被猫眼封死吧。

数据的爬取代码,自己去github上面取就可以了,这部分采用的是单线程,爬被封IP,所以不再赘述
主要展示一些图表分析。

2.电影《无双》-拿到的数据

首先给大家看一下,拿到的数据,分别是用户id 用户昵称 级别 城市 评论内容 评分 评论时间

在这里插入图片描述

3.电影《无双》-数据分析

先看一下最直观能看到的,评星比例,下面的代码都是基于 pyecharts 编写的,官网教程在这个地方 http://pyecharts.org/#/zh-cn/prepare?id=%e5%ae%89%e8%a3%85-pyecharts
数据有了 先看一下评星,这个最直观的能评价这部电影好不好了

代码如下,里面我使用了pandas操作数据

tips 如果报错,注意按照官网安装相关库,还有这个官网没有提到的 pip install pyecharts-snapshot
下面的代码中,使用了主题,请安装 pip install echarts-themes-pypkg

from pyecharts import Pie # 导入Pie组件,用于生成饼图
import numpy
import pandas as pd

# pandas读取数据
df = pd.read_csv("comments.csv",names =["id","nickName","userLevel","cityName","content","score","startTime"])

attr = ["一星", "二星", "三星", "四星", "五星"]
score = df.groupby("score").size()  # 分组求和

value = [
    score.iloc[0] + score.iloc[1]+score.iloc[1],
    score.iloc[3] + score.iloc[4],
    score.iloc[5] + score.iloc[6],
    score.iloc[7] + score.iloc[8],
    score.iloc[9] + score.iloc[10],
]

pie = Pie('《无双》评星比例', title_pos='center', width=900)
pie.use_theme("dark")
pie.add("评分", attr, value, center=[60, 50],radius=[25, 75], rosetype='raea', is_legend_show=True, is_label_show=True )
pie.render('评星.html')

很直观,无双这部电影不错,70%是5星好评
在这里插入图片描述

4.电影《无双》-地理位置分析

就喜欢碰到数据中有地理坐标的,那样就可以套地图了,来吧,搞起。

import json
import pandas as pd

from pyecharts import Style # 导入Style类,用于定义样式风格
from pyecharts import Geo # 导入Geo组件,用于生成地理坐标类图
df = pd.read_csv("comments.csv",names =["id","nickName","userLevel","cityName","content","score","startTime"])

下面就开始写核心的方法,这个地方会遇到用pyecharts最常见的一个BUG
BUG:

报错:ValueError: No coordinate is specified for xxx(地名)

原因:pyecharts的坐标文件中没有该地名,名称不一致导致的,如数据中地名为’万宁’,而坐标文件中为’万宁市’

坐标文件所在路径:自己搜索,关键字 ........datasets/city_coordinates.json

解决:修改坐标文件,在原位置下复制个同样的,然后修改下地名,或者自己去搜索引擎找答案,很多人可以帮助你解决。
使用geo的时候,请注意提前把相应的模块安装好!在本文开头的位置,官方手册中有相应的提示信息。

# 处理地名数据,解决坐标文件中找不到地名的问题
def handle(cities):
    cities = cities.tolist()

    # 获取坐标文件中所有地名
    data = None
    with open(
            'C:/Users/你电脑的路径/datasets/city_coordinates.json',
            mode='r', encoding='utf-8') as f:
        data = json.loads(f.read())  # 将str转换为json

    # # 循环判断处理
    data_new = data.copy()  # 拷贝所有地名数据
    for city in set(cities):  # 使用set去重
        # 处理地名为空的数据
        if city == '':
            while city in cities:
                cities.remove(city)

        count = 0
        for k in data.keys():
            count += 1
            if k == city:
                break
            if k.startswith(city):  # 处理简写的地名,如 万宁市 简写为 万宁
                # print(k, city)
                data_new[city] = data[k]
                break
            if k.startswith(city[0:-1]) and len(city) >= 3:  # 查找包含关系的关键字等
                data_new[city] = data[k]
                break

        # 处理不存在的地名
        if count == len(data):
            while city in cities:
                cities.remove(city)

    # 写入覆盖坐标文件
    with open(
            'C:/Users/你电脑的路径/datasets/city_coordinates.json',
            mode='w', encoding='utf-8') as f:
        f.write(json.dumps(data_new, ensure_ascii=False))  # 将json转换为str

    return cities  # 把city返回

# 生成效果图
def render():
    city_counts = df.groupby("cityName").size()
    new_citys = handle(city_counts.index)

    tuple_city = list(city_counts.items())  # 将 Series 转写成 [(),(),()] 格式

    attr_values = []   # 为下面的绘图做准备工作
    for item in tuple_city:
        #print(item[0],end=' ')
        if item[0] in new_citys:
            attr_values.append(item)


    # 定义样式
    style = Style(
        title_color='#fff',
        title_pos='center',
        width = 1200,
        height = 600,
        background_color='#404a59',
        subtitle_color='#fff'
    )
    #
    # 根据城市数据生成地理坐标图  这个就是基本操作了
    geo = Geo('《无双》评星人位置分布', '图表来源:CSDN博客-梦想橡皮擦', **style.init_style)
    attr, value = geo.cast(attr_values)

    geo.add('', attr, value, visual_range=[0, 2500],type="scatter",
            visual_text_color='#fff', symbol_size=10,
            is_visualmap=True, visual_split_number=10)
    geo.render('评星人位置分布-地理坐标图.html')


if __name__ == '__main__':
    render()

一顿常规操作,得到如下所示图表
在这里插入图片描述

观影大概趋势排行,还是大城市看电影和写影评的比较多一些。

在这里插入图片描述

最后依旧是常规操作,看一下评论的词云就大概知道这个电影主题是干什么的了。

import jieba # 导入jieba模块,用于中文分词
import pandas as pd  # 导入pandas 用于数据处理
import matplotlib.pyplot as plt # 导入matplotlib,用于生成图形

from wordcloud import WordCloud, STOPWORDS,ImageColorGenerator# 导入wordcloud,用于制作词云图

# 获取所有评论
df = pd.read_csv("comments.csv",names =["id","nickName","userLevel","cityName","content","score","startTime"])
comments = df["content"].tolist()


# 设置分词
comment_after_split = jieba.cut(str(comments), cut_all=False)  # 非全模式分词,cut_all=false
words = " ".join(comment_after_split)  # 以空格进行拼接
# # print(words)
#
# 设置屏蔽词
stopwords = STOPWORDS.copy()
stopwords.update({"电影","最后","就是","不过","这个","一个","感觉","这部","虽然","不是","真的","觉得","还是","但是"})


bg_image = plt.imread('bg.jpg')
#生成
wc=WordCloud(
    width=1024,
    height=768,
    background_color="white",
    max_words=200,
    mask=bg_image,            #设置图片的背景
    stopwords=stopwords,
    max_font_size=200,
    random_state=50,
    font_path='C:/Windows/Fonts/simkai.ttf'   #中文处理,用系统自带的字体
    ).generate(words)

#产生背景图片,基于彩色图像的颜色生成器
image_colors=ImageColorGenerator(bg_image)
#开始画图
plt.imshow(wc.recolor(color_func=image_colors))
#为背景图去掉坐标轴
plt.axis("off")
#保存云图
plt.show()
wc.to_file("评价.png")

在这里插入图片描述

总结:剧情翻转了,演技很不错,里面有画家角色等这些信息都可以直接读到,是不是看完电影,大家觉得也是如此?????

本篇文章是 影评分析系列的第1篇,使用的套路是目前很多博主喜欢的分析方式,主要用来新手入门的,没有什么特别突出的地方。

github地址 : https://github.com/wangdezhen/yingping.git

原文地址:https://www.cnblogs.com/hzcya1995/p/13311588.html