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