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

1.1 基本设置

①电脑端:下载Fiddler4

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

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

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

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

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

1.2
开始抓包

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

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

1.3
抓包分析

Fiddler上找到端口,打开raw数据,就可以找到影评的数据接口
Python爬猫眼电影影评及可视化 Robin NJU

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

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

1.4
额外发现

电脑上Fiddler抓包,可以得到JSON格式数据包
Python爬猫眼电影影评及可视化 Robin NJU

以及使用app时的定位

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

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

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

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

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

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

3.2.3
云图效果展示
Python爬猫眼电影影评及可视化 Robin NJU

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

4
总结

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

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

相关文章:

  • 2021-09-23
  • 2021-06-19
  • 2021-10-04
  • 2022-12-23
  • 2022-12-23
  • 2021-07-24
  • 2022-12-23
  • 2021-11-26
猜你喜欢
  • 2021-10-12
  • 2021-08-03
  • 2021-08-26
  • 2021-04-13
  • 2021-09-13
  • 2021-09-14
相关资源
相似解决方案