目录

* 前言 <https://mp.csdn.net/mdeditor/98644495#font_colorFF0FFFfont_1>
* 分析 <https://mp.csdn.net/mdeditor/98644495#font_colorFF0FFFfont_15>
* 具体步骤 <https://mp.csdn.net/mdeditor/98644495#font_colorFF0FFFfont_24>
* 登录 <https://mp.csdn.net/mdeditor/98644495#font_colorB23AEEfont_25>
* 爬取与存储 <https://mp.csdn.net/mdeditor/98644495#font_colorB23AEEfont_67>
* 可视化分析 <https://mp.csdn.net/mdeditor/98644495#font_colorB23AEEfont_107>
* 结语 <https://mp.csdn.net/mdeditor/98644495#font_colorFF0FFFfont_258>
 

<>前言

* 暑期档电影惨淡,但随着哪吒爆红开拓了新局面。这也是国产动画的首次爆红。在哪吒刚出,笔者以为最多10亿
就算不错的了。没想过仅过了几天就破了10亿。接着头条又突破20亿--------目前11天27亿,势头增长依然很猛!
那笔者就很好奇人们是怎么看待这一步电影的呢?

* 哪吒?我想哪吒是陪伴过不少人成长的一部动画片吧,也是记忆中算得上最好看的动画片之一
了。里面的哪吒、小猪熊、申公豹、石鸡娘娘令人历历在目。我们或许都被哪吒的敢打敢为、勇敢和天真所感动!
<>分析

* 对于这么一部爆红的动画电影。我想简单分析人们对哪吒动画电影的评价状况。那么就选择猫眼票房或者豆瓣的短评爬下来分析了。
* step1:打开豆瓣主页哪吒短评的界面。F12打开调试点击页面下一页会发现有ajax数据交互。

* step2:分析这个接口,发现无加密。返回的是json套html需要解析处理一下。用网页访问这个接口。但是你会发现一旦你访问页面靠后它就拒绝访问
了。提示你要登录再访问。


* step3:思路很清晰了。只需要登录—>访问接口爬取存储—>可视化分析即可
<>具体步骤

<>登录

* 账密登录fidder抓包发现可以直接发送请求登录。大胆猜测没有cookie限制。登陆后即可访问接口!

* 程序方面只需要根据参数进行模拟即可,登录完将cookie保存。后面的访问都带着这个cookie即可。
登录部分代码为:
import requests import urllib.parse from http import cookiejar url=
'https://accounts.douban.com/j/mobile/login/basic' header={'user-agent':
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Chrome/73.0.3683.86 Safari/537.36', 'Referer':
'https://accounts.douban.com/passport/login_popup?login_source=anony', 'Origin':
'https://accounts.douban.com', 'content-Type':
'application/x-www-form-urlencoded', 'x-requested-with':'XMLHttpRequest',
'accept':'application/json', 'accept-encoding':'gzip, deflate, br',
'accept-language':'zh-CN,zh;q=0.9', 'connection': 'keep-alive' ,'Host':
'accounts.douban.com' } data={ 'ck':'', 'name':'', 'password':'', 'remember':
'false', 'ticket':'' }
##登录函数。post请求api。返回cookie。后面携带这个cookie访问接口
def login(username,password): global data data['name']=username data['password'
]=password data=urllib.parse.urlencode(data) print(data) req=requests.post(url,
headers=header,data=data,verify=False) cookies = requests.utils.
dict_from_cookiejar(req.cookies) print(cookies) return cookies
<>爬取与存储

* 通过api的规则拼凑,抓下来的数据。我们主要需要评价星,和评论语句。
* 使用Beautifulsoup进行dom解析。使用xldr、xldw将数据写入excel文件中。一个页面20条。页面url增加直到出现异常为止停止。

主要代码实现: def getcomment(cookies): start=0 w = xlwt.Workbook(encoding='ascii') ws
= w.add_sheet('sheet1') index=1 while True:##存入ws.write(hang,lie,value) try: url
= 'https://movie.douban.com/subject/26794435/comments?start='+str(start)+
'&limit=20&sort=new_score&status=P&comments_only=1' start+=20 req = requests.get
(url,cookies=cookies) res = req.json() res=res['html'] soup = BeautifulSoup(res,
'lxml') node = soup.select('.comment-item') #print(node[0]) for va in node: name
= va.a.get('title') star = va.select_one('.comment-info').select('span')[1].get(
'class')[0][-2] comment = va.select_one('.short').text print(name, star, comment
) ws.write(index,0,index) ws.write(index, 1, name) ws.write(index, 2, star) ws.
write(index, 3, comment) index+=1 except Exception as e: print(e) break w.save(
'nezha.xls')
* 对于爬取的结过一览

<>可视化分析

* 我们要对评分进行统计、词频统计。还有就是生成词云展示。而对应的就是matplotlib、WordCloud库。
评分统计:

* 对于评分统计,使用数组将上面的1,2,3,4,5,五个分数段读取时候写入,根据数据画出饼状图分析即可。

* 从上图也可以知道,对于评分,大部分还是分布在5分和4分的,占比分别为41.2%和33.4%.而2分和1分时非常少!这足以说明这部片绝对不是烂片或者
争议不是很大。一部片不可能满足所有人。存在不满意的都在三分但依然能够接受。所以从评分分布来看哪吒还是广受支持的!
词频统计:

* 根据jieba分词。统计前面热词出现的次数。反应观众共鸣点。

* 可以看的出国产、大圣(大圣归来对比).这些热门话题直戳心头!
词云展示:

* 相比词频,词云无法看到词语的准确数量,但是可以看的到更多词汇、人们的评价。笔者这里通过count()类(map)对分词结果进行词频统计。统计完的词频排序
前300个词展示在2个词云上。这些词语的出现频率均大于10.所以还是有所参考价值额。


* 可以从词云简单分析出大家还是很满意的,充满浓浓封神色彩、动画风格、不屈的争斗、国产的激动!在票房直逼30亿的情况下!我、要去看了。
代码

* 顺便给出可视化分析部分代码: import matplotlib.pyplot as plt import matplotlib import
jiebaimport xlwt import xlrd from wordcloud import WordCloud import numpy as np
from collections import Counter matplotlib.rcParams['font.sans-serif'] = [
'SimHei'] matplotlib.rcParams['axes.unicode_minus'] = False
##获取分数的饼图。用数组获取1-5分出现的次数def anylasescore(comment): score=[0,0,0,0,0,0] count=0
for va in comment: try: score[int(va[2])]+=1 count+=1 except Exception as e:
continue print(score) label='1分','2分','3分','4分','5分' color = 'blue', 'orange',
'yellow', 'green', 'red' # 各类别颜色 size=[0,0,0,0,0] explode=[0,0,0,0,0] for i in
range(1,5): size[i]=score[i]*100/count explode[i]=score[i]/count/10 pie = plt.
pie(size, colors=color, explode=explode, labels=label, shadow=True, autopct=
'%1.1f%%') for font in pie[1]: font.set_size(8) for digit in pie[2]: digit.
set_size(8) plt.axis('equal') plt.title(u'各个评分占比', fontsize=12) plt.legend(loc=0
, bbox_to_anchor=(0.82, 1)) # 图例 # 设置legend的字体大小 leg = plt.gca().get_legend()
ltext= leg.get_texts() plt.setp(ltext, fontsize=6) plt.savefig("score.png") #
显示图 plt.show() def getzhifang(map):##词频的直方图 x=[]##词语 y=[]##词语出现数量 for k,v in map
.most_common(15): x.append(k) y.append(v) Xi = np.array(x) Yi = np.array(y) x =
np.arange(0, 15, 1) width = 0.6 plt.rcParams['font.sans-serif'] = ['SimHei'] #
用来正常显示中文标签 plt.figure(figsize=(8, 6)) ##指定图像比例: 8:6 plt.bar(Xi, Yi, width, color
='blue', label='热门词频统计', alpha=0.8,) plt.xlabel("词频")##标签 plt.ylabel("次数") plt.
show() return def getciyun_most(map):##获取词云 x = [] y = [] for k, v in map.
most_common(300):##300个词云分2个词云 x.append(k) y.append(v) xi=x[0:150] xi=' '.join(
xi) print(xi) backgroud_Image = plt.imread('nezha.jpg') # 如果需要个性化词云,哪吒背景图 wc =
WordCloud(background_color="white", width=1500, height=1200, #min_font_size=40,
mask=backgroud_Image, font_path="simhei.ttf", max_font_size=150, # 设置字体最大值
random_state=50, # 设置有多少种随机生成状态,即有多少种配色方案 ) #
字体这里有个坑,一定要设这个参数。否则会显示一堆小方框wc.font_path="simhei.ttf" # 黑体 #
wc.font_path="simhei.ttf" my_wordcloud = wc.generate(xi) plt.imshow(my_wordcloud
) my_wordcloud.to_file("img.jpg") xi=' '.join(x[150:300]) my_wordcloud = wc.
generate(xi) my_wordcloud.to_file("img2.jpg") plt.axis("off") def anylaseword(
comment):## 分词,去掉符号、换行等垃圾数据 commnetstr='' c = Counter() low=Counter() index=0
for va in comment: seg_list = jieba.cut(va[3],cut_all=False) index+=1 for x in
seg_list: if len(x) > 1 and x != '\r\n': try: c[x]+=1 except: continue
commnetstr+=va[3] for (k, v) in c.most_common(): if v<5: c.pop(k) continue
#print(k,v) print(len(c),c) getzhifang(c) getciyun_most(c) #print(commnetstr)
def anylase(): data = xlrd.open_workbook('nezha.xls') # 打开xls文件 table = data.
sheets()[0] # 打开第i张表 comment = [] for i in range(1, 500): comment.append(table.
row_values(i)) # print(comment) anylasescore(comment) anylaseword(comment) if
__name__== '__main__': anylase()
<>结语

* 如果自己需要可以到github下载项目完整代码
<https://github.com/javasmall/python/tree/master/%E7%88%AC%E8%99%AB/Include/%E8%B1%86%E7%93%A32>
。当然,只需要更改部分即可同理分析其他电影。
* 项目依然有不够完善地方,如影评,对不同评分的平均不同处理、其他不同角度如评论用户性别、地点等等等等,这里不做延申。
* 如果对后端、爬虫、数据结构算法等感性趣欢迎关注我的个人公众号交流(关注一波十年少):bigsai 持续输出分享!

 
 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信