Python爬猫眼电影影评及可视化 Robin NJU

1.Fiddler4抓包分析影评数据接口

1.1 基本设置

①电脑端:下载Fiddler4

设置:tools-options-connections-allow
remote computers to connect

查看电脑IP:鼠标移至Fiddler界面右上角处,即可显示本机IP

Python爬猫眼电影影评及可视化 Robin NJU_第1张图片

②手机端:与电脑连接同一个局域网,设置局域网手动代理,代理地址为电脑IP

手机安全证书:输入http://ipv4.fiddler:8888/ 点击fiddlerroot certificate安装证书

1.2
开始抓包

在手机上打开猫眼专业版,搜索电影短评,往下滑,Fiddler上不断刷新抓到的包

Python爬猫眼电影影评及可视化 Robin NJU_第2张图片

1.3
抓包分析

Fiddler上找到端口,打开raw数据,就可以找到影评的数据接口
在这里插入图片描述

Url对应的就是猫眼评论的接口,到浏览器里可以验证

Python爬猫眼电影影评及可视化 Robin NJU_第3张图片

1.4
额外发现

电脑上Fiddler抓包,可以得到JSON格式数据包
Python爬猫眼电影影评及可视化 Robin NJU_第4张图片

以及使用app时的定位

Python爬猫眼电影影评及可视化 Robin NJU_第5张图片

2.Python爬取网站接口内影评

2.1 源代码

import requests
import json
import time
import random

#下载第一页数据
def get_one_page(url):
headers = {
‘User-Agent’:‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36’
}
response = requests.get(url,headers=headers)
if response.status_code == 200:
return response.text
return None

#解析第一页数据
def parse_one_page(html):
data = json.loads(html)[‘cmts’]
for item in data:
yield{
‘comment’:item[‘content’],
‘date’:item[‘time’].split(’ ')[0],
‘rate’:item[‘score’],
‘city’:item[‘cityName’],
‘nickname’:item[‘nickName’]
}

#保存数据到文本文档
def save_to_txt():
for i in range(1,10):
url = ‘http://m.maoyan.com/mmdb/comments/movie/248566.json?v=yes&offset=’ + str(i)
html = get_one_page(url)
print(‘正在保存第%d页。’% i)
for item in parse_one_page(html):
with open(‘city.txt’,‘a’,encoding=‘utf-8’) as f:
f.write(item[‘date’] + ‘,’ + item[‘nickname’] + ‘,’ + item[‘city’] + ‘,’ +str(item[‘rate’])+’,’+item[‘comment’]+’\n’)
time.sleep(5 + float(random.randint(1, 100)) / 20)

if name == ‘main’:
save_to_txt()

2.2注释(下方数字表示源代码行数,下同)

1-4:cmd里pip install requests、json、time、random库

9:获取用户代理(user-agent)–在浏览器输入about://version,得到
Python爬猫眼电影影评及可视化 Robin NJU_第6张图片

12:response.status_code == 200表示页面请求成功。303重定向、400请求错误、401未授权、403禁止访问、404文件未找到、500服务器错误。

18:cmts表示评论,是网页上的标签

21-25:把评论标签里各类value分别赋给自己定义的变量,变量名和key名相同

35:解析后的数据下载至自己定义的.txt文件中,文件路径和python文件在一个文件夹下。

2.3
开始爬影评

Cmd里跑程序,显示下载数据

在这里插入图片描述

Python爬猫眼电影影评及可视化 Robin NJU_第7张图片

3
数据可视化

3.1地图显示观众地理位置分布

3.1.1 源代码

from pyecharts import Style
from pyecharts import Geo
#读取城市数据
city = []
with open(‘chenyuan.txt’,mode=‘r’,encoding=‘utf-8’) as f:
rows = f.readlines()
for row in rows:
if len(row.split(’,’)) == 5:
city.append(row.split(’,’)[2].replace(’\n’,’’))

def all_list(arr):
result = {}
for i in set(arr):
result[i] = arr.count(i)
return result

data = []
for item in all_list(city):
data.append((item,all_list(city)[item]))
style = Style(
title_color = “#fff”,
title_pos = “center”,
width = 1200,
height = 600,
background_color = “#404a59”
)

geo = Geo("《邪不压正》粉丝人群地理位置",“陈媛sdd”,**style.init_style)
attr,value= geo.cast(data)
geo.add("",attr,value,visual_range=[0,20],
visual_text_color="#fff",symbol_size=20,
is_visualmap=True,is_piecewise=True,
visual_split_number=4)

geo.render()

3.1.2 注释

4-9:对爬取数据分析可知,city信息在第二个逗号之后,第三个逗号之前。用信息被4个逗号分为5段,city信息在第三段,即row.split(’,’)[2]表示的含义。.replace(’\n’,’’)表示把换行用空格代替,防止数据因为换行间距过大。

这里出现一个bug,导入的地图信息不包括部分县名,可能导致出错35: render() 生成 .html 文件

3.1.3
可视化结果

Python爬猫眼电影影评及可视化 Robin NJU_第8张图片

3.2影评云图

3.2.1源代码

import pickle
from os import path
import jieba
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator

comment = []
with open(‘cy2.txt’,mode=‘r’,encoding=‘utf-8’) as f:
rows = f.readlines()
for row in rows:
if len(row.split(’,’)) == 5:
comment.append(row.split(’,’)[4].replace(’\n’,’’))

comment_after_split = jieba.cut(str(comment),cut_all=False)

wl_space_split= " “.join(comment_after_split)
#导入背景图
backgroud_Image = plt.imread(r"D:\1.jpg”,“wb”)
stopwords = STOPWORDS.copy()
#可以加多个屏蔽词
stopwords.add(“电影”)
stopwords.add(“一部”)
stopwords.add(“一个”)
stopwords.add(“没有”)
stopwords.add(“什么”)
stopwords.add(“有点”)
stopwords.add(“这部”)
stopwords.add(“这个”)
stopwords.add(“不是”)
stopwords.add(“真的”)
stopwords.add(“感觉”)
stopwords.add(“觉得”)
stopwords.add(“还是”)

#设置词云参数
#参数分别是指定字体、背景颜色、最大的词的大小、使用给定图作为背景形状
wc = WordCloud(width=1024,height=768,background_color=‘white’,
mask=backgroud_Image,font_path=“C:\simhei.ttf”,
stopwords=stopwords,max_font_size=400,
random_state=50)
wc.generate_from_text(wl_space_split)
img_colors= ImageColorGenerator(backgroud_Image)
wc.recolor(color_func=img_colors)
plt.imshow(wc)
plt.axis(‘off’)#不显示坐标轴
plt.show()
#保存结果到本地
wc.to_file(‘D:\python code’)

3.2.2注释

8-14:与之前类似,分出最后一个逗号之后的内容,即为评论。所有评论导入至comment元组里。

15:jieba.cut(str(comment),cut_all=False)
jieba.cut()接收三个参数,第一个是要分词的内容,这里是字符串形式的comment;第二个参数cut_all=False表示控制采用精准模式,若cut_all=True表示全模式。

19:在制定路径中放置要做云图的背景图

39:下载喜欢的字体格式**.ttf作为云图文字的字体格式

Python爬猫眼电影影评及可视化 Robin NJU_第9张图片

3.2.3
云图效果展示
Python爬猫眼电影影评及可视化 Robin NJU_第10张图片

3.3
影评星级分布饼图

3.3.1
源代码

from pyecharts import ThemeRiver

rate = []
with open(‘cy.txt’,mode=‘r’,encoding=‘utf-8’) as f:
rows = f.readlines()
for row in rows:
if len(row.split(’,’)) == 5:
rate.append(row.split(’,’)[3].replace(’\n’,’’))

print(rate.count(‘5’)+rate.count(‘4.5’))
print(rate.count(‘4’)+rate.count(‘3.5’))
print(rate.count(‘3’)+rate.count(‘2.5’))
print(rate.count(‘2’)+rate.count(‘1.5’))
print(rate.count(‘1’)+rate.count(‘0.5’))

#饼状图
from pyecharts import Pie
attr = [“五星”, “四星”, “三星”, “二星”, “一星”]

#分别代表各星级评论数
v1 = [7214,4368,2026,444,872]
pie = Pie("<<邪不压正>>星级分布", title_pos=‘center’, width=900)
pie.add(“cy”, attr, v1, center=[75, 50], is_random=True,
radius=[30, 75], rosetype=‘area’,
is_legend_show=False, is_label_show=True)
pie.show_config()
pie.render()

3.3.2
注释

25: is_label_show=True:显示每个点的值(各个属性的数据信息); is_legend_show=False表示不显示标签值。

3.3.3
影评分布饼图展示

Python爬猫眼电影影评及可视化 Robin NJU_第11张图片

4
总结

Python中拥有丰富的可视化库,运用得当,可以把生活中很多有趣的细节用图表的形式,直观地展现出来。除了文中提到的影评外,python还可以在天气、水文、手机应用方面做出不错的可视化效果。

本文的亮点是详细阐述python爬影评之前,数据的来源过程,即应用Fiddler对网站进行抓包分析,解析出数据所在的接口。

你可能感兴趣的:(python项目)