一.主题式网络爬虫设计方案

1.主题式网络爬虫名称:爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

2.主题式网络爬虫爬取的内容:美团平台古乐牛香牛杂火锅评论及评分数据

3.设计方案概述:

实现思路:通过开发者工具抓取古乐牛香牛杂火锅评论及评分的数据,分析该数据的url拼接方式,通过requests模块进行翻页爬取,将它转换成json数据进行解析,提取用户名称,用户评论,用户评分及用户评星数据,通过pandas模块对数据进行保存,随后对数据进行清洗和处理,通过jieba、wordcloud分词对文本数据进行分析并呈现,最后使用多种模块对评分及星级数据进行分析和可视化,并根据数据之间的关系分析两个变量之间的相关系数建立变量之间的多元回归方程

技术难点:此次使用的库多,需要仔细阅读官方文档并熟练使用。

二、主题页面的结构特征分析

1.首先我们进入 美图平台 古乐牛香牛杂火锅(南俊店)(https://www.meituan.com/meishi/114865734/)

打开开发者工具进行抓包处理 如下图:

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第1张

 

我们会抓取到非常多数据包,通过反复查找,我们会发现这个request url为:https://www.meituan.com/meishi/api/poi/getMerchantComment?uuid=0bb11f415036498cae5a.1585902206.1.0.0&platform=1&partner=126&originUrl=https%3A%2F%2Fwww.meituan.com%2Fmeishi%2F114865734%2F&riskLevel=1&optimusCode=10&id=114865734&userId=&offset=0&pageSize=10&sortType=1 的一个数据包,我们点击Previvew查看他的内容,会发现它就是我们要找的用户评论数据包:

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第2张

 

那么接下来就可以打开这个URL,查看我们想要的数据了!!!

 

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第3张

 

 

不难发现  我们想要的用户名称,用户评论,用户评分,用户评星的数据分别保存在 data//comments下面的comment,userLevel,star里面,那么我们开始用python对它进行爬取和保存吧!

首先我们把cookie,user-agent,host和referer拿下来

 

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第4张

 

然后是要对这些用户评论数据的url 进行分析。

 

通过点击下一页,我们会发现,只有offset=xx改变了:

 

 

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第5张

 

 

并且我们发现规律,第一页对应的是offset=0,第二页对应的是offset=10,第三页是offset=20....所以我们可以对URL进行拼接处理,实现翻页爬取。

 

 

url1='https://www.meituan.com/meishi/api/poi/getMerchantComment?uuid=0bb11f415036498cae5a.1585902206.1.0.0&platform=1&partner=126&originUrl=https%3A%2F%2Fwww.meituan.com%2Fmeishi%2F114865734%2F&riskLevel=1&optimusCode=10&id=114865734&userId=&offset='
url2='&pageSize=10&sortType=1'

#我们不妨把它拆分为两部分,把offset=xx的数字部分单独取出,通过for循环更改后再将url1和url2拼接


#我们爬取前10页数据进行分析

for set in range(10):
    url=url1+str(set*10)+url2
    
    #注意要使用str将数字变为字符,再拼接
    
    print('正在爬取第{}页数据'.format(set+1))
    #print(url),检查url是否拼接正确
    html=requests.get(url=url,headers=headers)

  然后我们把爬取下来的数据转换成可处理的json数据,并将我们想要的数据都保存在先前定义的4个数组当中,并将数据全部存储到F:\\python\\PL//pl.xlsx中

#使用json.loads函数让数据转换为可处理的json格式
    a=json.loads(html.text)


    #可以在该数据中发现我们想要的用户,评论,评分,星级都在["data"]["comments"]中
    #那我们可以用for循环去遍历这个json数据
    for x in a["data"]["comments"]:
        #将我们想要的数据都赋值给一个变量
        o=x["comment"]
        p=x["userLevel"]
        q=x["userName"]
        s=int(x["star"]/10) #除以10是因为星级的评判只有0~5星,再用int使它变为整形


        #将数据都添加进我们先前生成的4个数组当中
        pl.append(o)
        pf.append(p)
        yh.append(q)
        xj.append(s)
        #print('用户:'+str(q)+'评分:'+str(p)+'分'+'星级'+str(s)+'星')
        #这里检查是否提取正确

        #使用pandas的DataFrame函数创建匹配列名并存放数据
        df = pd.DataFrame({'用户':yh,'评论':pl,'评分':pf,'星级':xj})

        #将数据保存为excel文件,存放在F:\\python\\PL中并命名为pl.xlsx
        df.to_excel('F:\\python\\PL//pl.xlsx',index=False)

我们看一下我们的数据有没有成功保存

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第6张

 

ok !数据保存下来了

 

接下来我们在进行分词之前,为了让我们可以更直观地看到用户评分和用户评星所占的比例,我们通过合计评分分值和星级数量来绘制饼图,查看5分和5星所占的比例

#合计所有评分中0,1,2,3,4,5分的数量
m=collections.Counter(pf)

#合计所有星级中0,1,2,3,4,5星的数量
x=collections.Counter(xj)


#先看看它们数量有多少

print('=========评分分值总计如下=========')
print('评0分的总计为:',m[0],'\n'
      '评1分的总计为:',m[1],'\n'
      '评2分的总计为:',m[2],'\n'
      '评3分的总计为:',m[3],'\n'
      '评4分的总计为:',m[4],'\n'
      '评5分的总计为:',m[5],'\n'
      )




print('=========星级数量总计如下=========')
print('评0分星总计为:',x[0],'\n'
      '评1分星总计为:',x[1],'\n'
      '评2分星总计为:',x[2],'\n'
      '评3分星总计为:',x[3],'\n'
      '评4分星总计为:',x[4],'\n'
      '评5分星总计为:',x[5],'\n'
      )

plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False



#在将dict转为DataFrame时会报错 需要在尾部添加参数:index = [0]

#我们将统计好的评分数据保存在一个excel中
df = pd.DataFrame({'0分总计':m[0],'1分总计':m[1],'2分总计':m[2],'3分总计':m[3],'4分总计':m[4],'5分总计':m[5]},index = [0])
df.to_excel('pfzj.xlsx',index=False)



#我们开始绘制评分分值总计的饼图
plt.figure(figsize=(10,10))#将画布设定为正方形,则绘制的饼图是正圆
label=['0分总计','1分总计','2分总计','3分总计','4分总计','5分总计']#定义饼图的标签,标签是列表
explode=[0,0,0,0,0,0.1]    #设定各项距离圆心n个半径
#绘制饼图
values=[m[0],m[1],m[2],m[3],m[4],m[5]] #加入数值
plt.pie(values,explode=explode,labels=label,autopct='%1.1f%%')#绘制饼图的参数
plt.title('评分分值总计图')
plt.savefig('./评分分值总计图')
plt.show()



#我们将统计好的星级数据保存在另一个excel中
dm = pd.DataFrame({'0星总计':x[0],'1星总计':x[1],'2星总计':x[2],'3星总计':x[3],'4星总计':x[4],'5星总计':x[5]},index = [0])
dm.to_excel('xjzj.xlsx',index=False)



#我们开始绘制星级数量总计的饼图
plt.figure(figsize=(10,10))#将画布设定为正方形,则绘制的饼图是正圆
label=['0星总计','1星总计','2星总计','3星总计','4星总计','5星总计']#定义饼图的标签,标签是列表
explode=[0,0,0,0,0,0.1]#设定各项距离圆心n个半径
#绘制饼图
values=[x[0],x[1],x[2],x[3],x[4],x[5]]#加入数值
plt.pie(values,explode=explode,labels=label,autopct='%1.1f%%')#绘制饼图的参数
plt.title('星级数量总计图')
plt.savefig('星级数量总计图')
plt.show()

运行代码,结果如下:

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第7张

 

我们来看一下评分总计的数据和星级数量总计的数据是否保存成功:

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第8张爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第9张

 

ok !评分总计的数据和星级数量总计的数据保存成功

 

我们再来看看生成的饼图数据:

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第10张

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第11张

好的,我们完成了评分饼图和星级饼图的绘制,可以看出这家店还是不错的,以前路过因为排队排到路边去了,就放弃了去品尝的想法Q.Q

接下来,我们开始通过jieba和wordcloud分词,对用户评论数据进行可视化吧!

为了使生成的词云更加精美有趣,我使用了最近很火的瑞幸咖啡的LOGO!!

 
#接下来我们要对评论数据进行数据清洗,将特殊符号全部删除掉
#以便我们更好地分词和呈现数据


#这里我们定义一个clearSen函数,用于将将特殊符号全部删除

def clearSen(comment):
    comment = comment.strip()
    comment = comment.replace('、', '')
    comment = comment.replace(',', '。')
    comment = comment.replace('《', '。')
    comment = comment.replace('》', '。')
    comment = comment.replace('~', '')
    comment = comment.replace('…', '')
    comment = comment.replace('\r', '')
    comment = comment.replace('\t', ' ')
    comment = comment.replace('\f', ' ')
    comment = comment.replace('/', '')
    comment = comment.replace('、', ' ')
    comment = comment.replace('/', '')
    comment = comment.replace('。', '')
    comment = comment.replace('(', '')
    comment = comment.replace(')', '')
    comment = comment.replace('_', '')
    comment = comment.replace('?', ' ')
    comment = comment.replace('?', ' ')
    comment = comment.replace('了', '')
    comment = comment.replace('', '')
    comment = comment.replace(':', '')
    return comment

 
#打开数据文件进行jieba.cut处理,使它生成一个生成器
text = (open('评论文本.txt','r',encoding='utf-8')).read()
segs=jieba.cut(text)

#定义一个新的数组,用于存放清洗后地数据
mytext_list=[]
 
#对其进行文本清洗
for x in segs:
    cs=clearSen(x)
    mytext_list.append(cs)


#将清洗后的数据放入即将用于生成的词云中
cloud_text=",".join(mytext_list)


#为了使生成的词云更加精美有趣,我使用了最近很火的瑞幸咖啡的LOGO


#加载背景图片
cloud_mask = np.array(Image.open("瑞幸.jpg"))


#对生成的词云图片进行设置
wc = WordCloud(
    background_color="white", #背景颜色
    mask=cloud_mask,
    max_words=100000, #显示最大词数
    font_path="simhei.ttf",  #使用字体,我使用的是黑体
    min_font_size=10, #字体最小字号
    max_font_size=50, #字体最大字号
    width=1000,  #图幅宽度
	height=1000
    #图幅高度
    )


#调用词云数据
wc.generate(cloud_text)
#生成词云图片,名称为2.jpg
wc.to_file("词云.jpg")

  

代码运行结果如下:

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第12张

successfully-------证明生成成功!!

我们来到文件夹看到我们生成的词云图片:

 

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第13张

词云非常精美!接下来我们开始对评分和星级数据进行清理和分析,做可视化处理

#通过jieba、wordcloud分词对文本数据进行分析并呈现后,我们开始分析评分和星级的数据关系


#将pl.xlsx读取给mt变量

mt=pd.read_excel('F:\\python\\PL//pl.xlsx')

#这里我们定义一个shujuqingli的函数,用于对评分和星级的数据清理
def shujuqingli(mt):
    
    #查看统计空值情况
    print(mt.isnull())
    #查看重复值情况
    print(mt.duplicated())
    #查看空值情况
    print(mt['评分'].isnull().value_counts())
    print(mt['星级'].isnull().value_counts())
    #查看异常值处理情况
    print(mt.describe())

#将mt放入shujuqingli函数中进行清理
shujuqingli(mt)

#检查后发现数据无异常


#接下来我们对它进行数据分析与可视化(例如:数据柱形图、直方图、散点图、盒图、分布图)
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False


#使用numpy中的random.rand函数返回一组服从标准正态分布的随机样本值。
x=np.random.rand(50)
y=np.random.rand(50)

#设置x轴的标签文本
plt.xlabel("评分")
#设置y轴的标签文本
plt.ylabel("星级")



#画出散点图
plt.scatter(x,y,100,color='g',alpha=1)

#这里我们使用sns.jointplot函数
#kind的值 必须是 'scatter', 'reg', 'resid', 'kde', 或者 'hex'种类



#散点图 + 分布图

sns.jointplot(x="评分",y="星级",data=mt,kind='scatter')

#联合分布图

sns.jointplot(x="评分",y="星级",data=mt,kind='reg')

#密度图

sns.jointplot(x="评分",y="星级",data=mt,kind="kde",space=0,color='b')

#残差模块图

sns.jointplot(x="评分",y="星级",data=mt,kind='resid')

#六边形图

sns.jointplot(x="评分",y="星级",data=mt,kind='hex')


#调用corr方法,计算每个列两两之间的相似度

print(mt.corr())

#调用corr方法,计算该序列与传入序列之间的相关度

print(mt['评分'].corr(mt['星级']))




  

#这里开始对评分和星级数据进行分析和可视化
pldict={'评分':pf,'星级':xj}


#转换为DataFrame的数据格式
pldf = DataFrame(pldict)
 
#绘制散点图
plt.scatter(pldf.评分,pldf.星级,color = 'b',label = "Exam Data")
 
#添加图的标签(x轴,y轴)
plt.xlabel("评分")
plt.ylabel("星级")
#显示图像
plt.savefig("pldf.jpg")
plt.show()
 
 

 
#我们通过回归方程 y = a + b*x (模型建立最佳拟合线)


#使用pandas的loc函数显示索引,并赋值给exam_X,csY
csX  =  pldf.loc[:,'星级']
csY  =  pldf.loc[:,'评分']
 

#实例化一个线性回归的模型
model = LinearRegression()
 

 
#使用values.reshape(-1,1)更改数据的行列数目
zzX = csX.values.reshape(-1,1)
zzY = csY.values.reshape(-1,1)


#建立模型拟合 
model.fit(zzX,zzY)
 
jieju  = model.intercept_#截距
 
xishu = model.coef_#回归系数
 
print("最佳拟合线:截距",jieju,",回归系数:",xishu)
 

 
plt.scatter(zzX, zzY, color='blue', label="train data")
 
#训练数据的预测值
xunlian = model.predict(zzX)


#绘制最佳拟合线
plt.plot(zzX, xunlian, color='black', linewidth=3, label="best line")
 

 
#添加图标标签
plt.legend(loc=2)
plt.xlabel("评分")
plt.ylabel("星级")
#显示图像
plt.savefig("最终.jpg")
plt.show()

  

代码运行会出现很多图片,我们可以逐个保存,实现数据持久化存储

代码运行结果如下:

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第14张

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第15张

我们绘制的图片如下:

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第16张

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第17张

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第18张

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第19张

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第20张

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第21张

 

这是我们通过回归方程最终得到的图片

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第22张

 

最终附上本次程序的源码及文件截图:

  1 import requests
  2 import json
  3 import time
  4 import jieba
  5 import pandas as pd
  6 from wordcloud import WordCloud
  7 import matplotlib.pyplot as plt
  8 import matplotlib
  9 import numpy as np
 10 import seaborn as sns
 11 import jieba.analyse
 12 from PIL import Image
 13 from pandas import DataFrame,Series
 14 from sklearn.model_selection import train_test_split
 15 from sklearn.linear_model import LinearRegression
 16 import collections
 17 
 18 #新建4个数组,分别用来存放爬取下来的评论,评分,用户,星级
 19 
 20 pl=[]
 21 pf=[]
 22 yh=[]
 23 xj=[]
 24 
 25 #设置请求头
 26 #cookie有时效性,需要爬取时需要进行更换
 27 
 28 
 29 
 30 headers={
 31         'Cookie': '_lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; _lxsdk_cuid=1713f23471ec8-0fff7149bdd69c-3f6b4f04-144000-1713f23471ec8; __mta=147731336.1585902209621.1585902209621.1585902209621.1; ci=110; rvct=110%2C1; client-id=68720d01-7956-4aa6-8c0e-ed3ee9ae6295; _hc.v=51b2d328-c63b-23ed-f950-4af49bde68ee.1585902347; _lxsdk=1713f23471ec8-0fff7149bdd69c-3f6b4f04-144000-1713f23471ec8; uuid=0bb11f415036498cae5a.1585902206.1.0.0',
 32         'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36',
 33         'Host': 'qz.meituan.com',
 34         'Referer': 'https://qz.meituan.com/s/%E6%B3%89%E5%B7%9E%E4%BF%A1%E6%81%AF%E5%AD%A6%E9%99%A2/'
 35         
 36     }
 37 
 38 
 39 #开始拼接url
 40 
 41 url1='https://www.meituan.com/meishi/api/poi/getMerchantComment?uuid=0bb11f415036498cae5a.1585902206.1.0.0&platform=1&partner=126&originUrl=https%3A%2F%2Fwww.meituan.com%2Fmeishi%2F114865734%2F&riskLevel=1&optimusCode=10&id=114865734&userId=&offset='
 42 url2='&pageSize=10&sortType=1'
 43 
 44 #我们不妨把它拆分为两部分,把offset=xx的数字部分单独取出,通过for循环更改后再将url1和url2拼接
 45 
 46 
 47 #我们爬取前10页数据进行分析
 48 
 49 for set in range(10):
 50     url=url1+str(set*10)+url2
 51     
 52     #注意要使用str将数字变为字符,再拼接
 53     
 54     print('正在爬取第{}页数据'.format(set+1))
 55     #print(url),检查url是否拼接正确
 56     html=requests.get(url=url,headers=headers)
 57 
 58     #使用json.loads函数让数据转换为可处理的json格式
 59     a=json.loads(html.text)
 60 
 61 
 62     #可以在该数据中发现我们想要的用户,评论,评分,星级都在["data"]["comments"]中
 63     #那我们可以用for循环去遍历这个json数据
 64     for x in a["data"]["comments"]:
 65         #将我们想要的数据都赋值给一个变量
 66         o=x["comment"]
 67         p=x["userLevel"]
 68         q=x["userName"]
 69         s=int(x["star"]/10) #除以10是因为星级的评判只有0~5星,再用int使它变为整形
 70 
 71 
 72         #将数据都添加进我们先前生成的4个数组当中
 73         pl.append(o)
 74         pf.append(p)
 75         yh.append(q)
 76         xj.append(s)
 77         #print('用户:'+str(q)+'评分:'+str(p)+'分'+'星级'+str(s)+'星')
 78         #这里检查是否提取正确
 79 
 80         #使用pandas的DataFrame函数创建匹配列名并存放数据
 81         df = pd.DataFrame({'用户':yh,'评论':pl,'评分':pf,'星级':xj})
 82 
 83         #将数据保存为excel文件,存放在F:\\python\\PL中并命名为pl.xlsx
 84         df.to_excel('F:\\python\\PL//pl.xlsx',index=False)
 85 
 86 
 87 
 88 #保存完excel文件后,再将评论数据单独提取出,保存为一个文本
 89 
 90 #因为我们需要通过jieba、wordcloud分词对文本数据进行分析并呈现
 91 
 92 
 93 
 94 fos = open("评论文本.txt", "w", encoding="utf-8")
 95 for i in pl:
 96     fos.write(str(i))
 97 fos.close()
 98 
 99 #保存完毕
100 
101 #在进行分词之前,为了让我们可以更直观地看到用户评分和用户评星所占的比例
102 
103 #我们通过合计评分分值和星级数量来绘制饼图,查看5分和5星所占的比例
104 
105 #合计所有评分中0,1,2,3,4,5分的数量
106 m=collections.Counter(pf)
107 
108 #合计所有星级中0,1,2,3,4,5星的数量
109 x=collections.Counter(xj)
110 
111 
112 #先看看它们数量有多少
113 
114 print('=========评分分值总计如下=========')
115 print('评0分的总计为:',m[0],'\n'
116       '评1分的总计为:',m[1],'\n'
117       '评2分的总计为:',m[2],'\n'
118       '评3分的总计为:',m[3],'\n'
119       '评4分的总计为:',m[4],'\n'
120       '评5分的总计为:',m[5],'\n'
121       )
122 
123 
124 
125 
126 print('=========星级数量总计如下=========')
127 print('评0分星总计为:',x[0],'\n'
128       '评1分星总计为:',x[1],'\n'
129       '评2分星总计为:',x[2],'\n'
130       '评3分星总计为:',x[3],'\n'
131       '评4分星总计为:',x[4],'\n'
132       '评5分星总计为:',x[5],'\n'
133       )
134 
135 plt.rcParams['font.sans-serif']=['SimHei']  # 用来正常显示中文标签
136 plt.rcParams['axes.unicode_minus'] = False
137 
138 
139 
140 #在将dict转为DataFrame时会报错 需要在尾部添加参数:index = [0]
141 
142 #我们将统计好的评分数据保存在一个excel中
143 df = pd.DataFrame({'0分总计':m[0],'1分总计':m[1],'2分总计':m[2],'3分总计':m[3],'4分总计':m[4],'5分总计':m[5]},index = [0])
144 df.to_excel('pfzj.xlsx',index=False)
145 
146 
147 
148 #我们开始绘制评分分值总计的饼图
149 plt.figure(figsize=(10,10))#将画布设定为正方形,则绘制的饼图是正圆
150 label=['0分总计','1分总计','2分总计','3分总计','4分总计','5分总计']#定义饼图的标签,标签是列表
151 explode=[0,0,0,0,0,0.1]    #设定各项距离圆心n个半径
152 #绘制饼图
153 values=[m[0],m[1],m[2],m[3],m[4],m[5]] #加入数值
154 plt.pie(values,explode=explode,labels=label,autopct='%1.1f%%')#绘制饼图的参数
155 plt.title('评分分值总计图')
156 plt.savefig('./评分分值总计图')
157 plt.show()
158 
159 
160 
161 #我们将统计好的星级数据保存在另一个excel中
162 dm = pd.DataFrame({'0星总计':x[0],'1星总计':x[1],'2星总计':x[2],'3星总计':x[3],'4星总计':x[4],'5星总计':x[5]},index = [0])
163 dm.to_excel('xjzj.xlsx',index=False)
164 
165 
166 
167 #我们开始绘制星级数量总计的饼图
168 plt.figure(figsize=(10,10))#将画布设定为正方形,则绘制的饼图是正圆
169 label=['0星总计','1星总计','2星总计','3星总计','4星总计','5星总计']#定义饼图的标签,标签是列表
170 explode=[0,0,0,0,0,0.1]#设定各项距离圆心n个半径
171 #绘制饼图
172 values=[x[0],x[1],x[2],x[3],x[4],x[5]]#加入数值
173 plt.pie(values,explode=explode,labels=label,autopct='%1.1f%%')#绘制饼图的参数
174 plt.title('星级数量总计图')
175 plt.savefig('星级数量总计图')
176 plt.show()
177 
178 
179 
180  
181 
182 
183 
184 
185 
186 
187 
188  
189 #接下来我们要对评论数据进行数据清洗,将特殊符号全部删除掉
190 #以便我们更好地分词和呈现数据
191 
192 
193 #这里我们定义一个clearSen函数,用于将将特殊符号全部删除
194 
195 def clearSen(comment):
196     comment = comment.strip()
197     comment = comment.replace('', '')
198     comment = comment.replace('', '')
199     comment = comment.replace('', '')
200     comment = comment.replace('', '')
201     comment = comment.replace('', '')
202     comment = comment.replace('', '')
203     comment = comment.replace('\r', '')
204     comment = comment.replace('\t', ' ')
205     comment = comment.replace('\f', ' ')
206     comment = comment.replace('/', '')
207     comment = comment.replace('', ' ')
208     comment = comment.replace('/', '')
209     comment = comment.replace('', '')
210     comment = comment.replace('', '')
211     comment = comment.replace('', '')
212     comment = comment.replace('_', '')
213     comment = comment.replace('?', ' ')
214     comment = comment.replace('', ' ')
215     comment = comment.replace('', '')
216     comment = comment.replace('', '')
217     comment = comment.replace('', '')
218     return comment
219 
220  
221 #打开数据文件进行jieba.cut处理,使它生成一个生成器
222 text = (open('评论文本.txt','r',encoding='utf-8')).read()
223 segs=jieba.cut(text)
224 
225 #定义一个新的数组,用于存放清洗后地数据
226 mytext_list=[]
227  
228 #对其进行文本清洗
229 for x in segs:
230     cs=clearSen(x)
231     mytext_list.append(cs)
232 
233 
234 #将清洗后的数据放入即将用于生成的词云中
235 cloud_text=",".join(mytext_list)
236 
237 
238 #为了使生成的词云更加精美有趣,我使用了最近很火的瑞幸咖啡的LOGO
239 
240 
241 #加载背景图片
242 cloud_mask = np.array(Image.open("瑞幸.jpg"))
243 
244 
245 #对生成的词云图片进行设置
246 wc = WordCloud(
247     background_color="white", #背景颜色
248     mask=cloud_mask,
249     max_words=100000, #显示最大词数
250     font_path="simhei.ttf",  #使用字体,我使用的是黑体
251     min_font_size=10, #字体最小字号
252     max_font_size=50, #字体最大字号
253     width=1000,  #图幅宽度
254     height=1000
255     #图幅高度
256     )
257 
258 
259 #调用词云数据
260 wc.generate(cloud_text)
261 #生成词云图片,名称为2.jpg
262 wc.to_file("词云.jpg")
263 
264 
265 
266 
267 
268 
269 
270 #通过jieba、wordcloud分词对文本数据进行分析并呈现后,我们开始分析评分和星级的数据关系
271 
272 
273 #将pl.xlsx读取给mt变量
274 
275 mt=pd.read_excel('F:\\python\\PL//pl.xlsx')
276 
277 #这里我们定义一个shujuqingli的函数,用于对评分和星级的数据清理
278 def shujuqingli(mt):
279     
280     #查看统计空值情况
281     print(mt.isnull())
282     #查看重复值情况
283     print(mt.duplicated())
284     #查看空值情况
285     print(mt['评分'].isnull().value_counts())
286     print(mt['星级'].isnull().value_counts())
287     #查看异常值处理情况
288     print(mt.describe())
289 
290 #将mt放入shujuqingli函数中进行清理
291 shujuqingli(mt)
292 
293 #检查后发现数据无异常
294 
295 
296 #接下来我们对它进行数据分析与可视化(例如:数据柱形图、直方图、散点图、盒图、分布图)
297 plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
298 plt.rcParams['axes.unicode_minus']=False
299 
300 
301 #使用numpy中的random.rand函数返回一组服从标准正态分布的随机样本值。
302 x=np.random.rand(50)
303 y=np.random.rand(50)
304 
305 #设置x轴的标签文本
306 plt.xlabel("评分")
307 #设置y轴的标签文本
308 plt.ylabel("星级")
309 
310 
311 
312 #画出散点图
313 plt.scatter(x,y,100,color='g',alpha=1)
314 
315 #这里我们使用sns.jointplot函数
316 #kind的值 必须是 'scatter', 'reg', 'resid', 'kde', 或者 'hex'种类
317 
318 
319 
320 #散点图 + 分布图
321 
322 sns.jointplot(x="评分",y="星级",data=mt,kind='scatter')
323 
324 #联合分布图
325 
326 sns.jointplot(x="评分",y="星级",data=mt,kind='reg')
327 
328 #密度图
329 
330 sns.jointplot(x="评分",y="星级",data=mt,kind="kde",space=0,color='b')
331 
332 #残差模块图
333 
334 sns.jointplot(x="评分",y="星级",data=mt,kind='resid')
335 
336 #六边形图
337 
338 sns.jointplot(x="评分",y="星级",data=mt,kind='hex')
339 
340 
341 #调用corr方法,计算每个列两两之间的相似度
342 
343 print(mt.corr())
344 
345 #调用corr方法,计算该序列与传入序列之间的相关度
346 
347 print(mt['评分'].corr(mt['星级']))
348 
349 
350 
351 
352 
353 
354 
355 
356 
357 #这里开始对评分和星级数据进行分析和可视化
358 pldict={'评分':pf,'星级':xj}
359 
360 
361 #转换为DataFrame的数据格式
362 pldf = DataFrame(pldict)
363  
364 #绘制散点图
365 plt.scatter(pldf.评分,pldf.星级,color = 'b',label = "Exam Data")
366  
367 #添加图的标签(x轴,y轴)
368 plt.xlabel("评分")
369 plt.ylabel("星级")
370 #显示图像
371 plt.savefig("pldf.jpg")
372 plt.show()
373  
374  
375 
376  
377 #我们通过回归方程 y = a + b*x (模型建立最佳拟合线)
378 
379 
380 #使用pandas的loc函数显示索引,并赋值给exam_X,csY
381 csX  =  pldf.loc[:,'星级']
382 csY  =  pldf.loc[:,'评分']
383  
384 
385 #实例化一个线性回归的模型
386 model = LinearRegression()
387  
388 
389  
390 #使用values.reshape(-1,1)更改数据的行列数目
391 zzX = csX.values.reshape(-1,1)
392 zzY = csY.values.reshape(-1,1)
393 
394 
395 #建立模型拟合 
396 model.fit(zzX,zzY)
397  
398 jieju  = model.intercept_#截距
399  
400 xishu = model.coef_#回归系数
401  
402 print("最佳拟合线:截距",jieju,",回归系数:",xishu)
403  
404 
405  
406 plt.scatter(zzX, zzY, color='blue', label="train data")
407  
408 #训练数据的预测值
409 xunlian = model.predict(zzX)
410 
411 
412 #绘制最佳拟合线
413 plt.plot(zzX, xunlian, color='black', linewidth=3, label="best line")
414  
415 
416  
417 #添加图标标签
418 plt.legend(loc=2)
419 plt.xlabel("评分")
420 plt.ylabel("星级")
421 #显示图像
422 plt.savefig("最终.jpg")
423 plt.show()
424  

 

  

 

爬取美团平台古乐牛香牛杂火锅评论及评分数据分析与可视化处理 Python 第23张

 

五、总结

结论:经过对数据的分析和可视化,从不同的数据团和拟合曲线可以看出用户评分和用户评星之间没有太大的联系,再从评论中看,用户体验受着诸多因素影响,不过总体来说,用户对这家店的评析还是不错的,有机会一定去品尝品尝泉州的风味美食。

小结:在这次对美团古乐牛香的数据进行分析的过程中,不仅巩固了之前学过的一些知识,而且还扩大了自己对python库的认识和应用。通过官方文档的介绍,并结合实际案例,我掌握python各种强大的第三方库的使用,对python这门语言变得更加热爱,也提升了个人对数据分析与可视化的操作能力,果然人生苦短,我用python!

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄