千家信息网

python如何爬取美团1024家烤肉店数据

发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,这篇文章主要介绍python如何爬取美团1024家烤肉店数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!分析真实URLhttps://apimobile.meituan.co
千家信息网最后更新 2024年11月11日python如何爬取美团1024家烤肉店数据

这篇文章主要介绍python如何爬取美团1024家烤肉店数据,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

分析真实URL

https://apimobile.meituan.com/group/v4/poi/pcsearch/30?uuid=你的&userid=-1&limit=32&offset=32&cateId=-1&q=%E7%83%A4%E8%82%89

主要参数:

  1. 30:城市id(30代表深圳)

  2. limit:每页店铺数量

  3. offset:翻页参数(每增加32翻页一次)

  4. q:关键字(本例为烤肉)

按上述接口爬取只能获得1024个店铺数据,为了获得更全面数据,还需找到areaId参数(子地区),然后遍历子地区,即可获得完整数据。限于篇幅,仅给出核心代码。

def get_meituan():    try:        for areaId in areaId_list:           for x in range(0, 2000, 32):                time.sleep(random.uniform(2,4)) #设置睡眠时间                print('正在提取areadId为%d的'%areaId,'第%d页'%int((x+32)/32))  #打印爬取进度                url = 'https://apimobile.meituan.com/group/v4/poi/pcsearch/30?uuid=你的&userid=-1&limit=32&offset={0}&cateId=-1&q=%E7%83%A4%E8%82%89&areaId={1}'.format(x,areaId)                print(url)                headers = {                    'Accept': '*/*',                    'Accept-Encoding': 'gzip, deflate, br',                    'Accept-Language': 'zh-CN,zh;q=0.9',                    'Connection': 'keep-alive',                    'Cookie':'你的',                    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36',                    'Host': 'apimobile.meituan.com',                    'Origin': 'https://sr.meituan.com',                    'Referer': 'https://sr.meituan.com/s/%E7%83%A4%E8%82%89/'                }                response = requests.get(url, headers=headers)                print(response.status_code)

数据处理

短短几分钟就爬下了2万多个烤肉店信息,为了方便可视化分析,还需要对爬取的数据进行简单清洗。

导入数据

导入数据并添加列名,用sample()方法随机抽取5个样本数据预览。

import pandas as pdimport numpy as npdf = pd.read_csv('/Users/wangjia/Documents/技术公号/公号项目/2.spider/美团/深圳烤肉1.csv',                names = ['店铺名称', '店铺地址', '人均消费', '店铺评分', '评论人数', '所在商圈', '图片链接','店铺类型','联系方式'])df.sample(5)

删除重复数据

df = df.drop_duplicates()

缺失值处理

由上文可知,仅联系方式字段含有缺失值,用文本填充。

df = df.fillna('暂无数据')

店铺地址清洗

通过店铺地址字段截取所属区县,另外,"南澳大"属于龙岗区,直接用replace()方法替换。

df['所属区县'] = df['店铺地址'].str[:3].str.replace('南澳大','龙岗区')

店铺评分清洗

根据美团评分方法,对店铺评分字段进行切分,获得评分类型列。

cut = lambda x : '一般' if x <= 3.5 else ('不错' if x <= 4.0 else('好' if x <= 4.5 else '很好'))df['评分类型'] = df['店铺评分'].map(cut)

描述性统计

查看基本统计量

df.describe()

绘制回归图

import matplotlib.pyplot as pltimport seaborn as sns%matplotlib inlineplt.rcParams['font.sans-serif'] = ['SimHei']  # 设置加载的字体名plt.rcParams['axes.unicode_minus'] = False   # 解决保存图像是负号'-'显示为方块的问题fig,axes=plt.subplots(2,1,figsize=(12,12))sns.regplot(x='人均消费',y='店铺评分',data=df,color='r',marker='+',ax=axes[0])sns.regplot(x='评论人数',y='店铺评分',data=df,color='g',marker='*',ax=axes[1])

通过绘制回归图,我们发现人均消费与店铺评分具有正相关,评论人数和店铺评分具有正相关。这与我们的常识也较为接近。

数据分析

本文数据可视化主要用到pyecharts库,它能轻松实现酷炫的图表效果。

地区分布

深圳烤肉店主要分布在龙岗区、龙华区、南山区和福田区,盐田区和坪山区烤肉店较少。烤肉店的选址一个重要因素就是人流量,龙岗区和龙华区为深圳主要的生活居住区,而南山区和福田区为深圳的核心商业聚集地,巨大的需求为烤肉店的布局奠定了基础。

from pyecharts.charts import *from pyecharts import options as optsfrom pyecharts.globals import ThemeType  #引入主题df1 = df.groupby('所属区县')['店铺名称'].count() #按所属区县分组,对店铺名称计数df1 = df1.sort_values(ascending=False) #降序regions = df1.index.to_list()values = df1.to_list()c = (    Map(init_opts=opts.InitOpts(theme = ThemeType.WONDERLAND)) #PURPLE_PASSION    .add(        "",        zip(regions, values),        maptype="深圳"    )    .set_global_opts(        title_opts=opts.TitleOpts(title="深圳烤肉店分布",subtitle="数据来源:美团",pos_top="-1%", pos_left = 'center' ),        visualmap_opts=opts.VisualMapOpts(max_=1000)    )    )c.render_notebook()

所在商圈

仅仅知道烤肉店行政区分布,对于烤肉店选址作用其实不大。于是,我们进一步细化到商圈,看看哪些商圈的烤肉店较多。在深圳所有商圈中,龙华区的民治和龙华、光明区的公明烤肉店数量都超过了150家。

df2 = df.groupby('所在商圈')['店铺名称'].count()df2 = df2.sort_values(ascending=True)[-10:]df2 = df2.round(2)c = (    Bar(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))    .add_xaxis(df2.index.to_list())    .add_yaxis("",df2.to_list()).reversal_axis() #X轴与y轴调换顺序    .set_global_opts(title_opts=opts.TitleOpts(title="商圈烤肉店数量top10",subtitle="数据来源:美团",pos_left = 'center'),                       xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改横坐标字体大小                       yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改纵坐标字体大小                       )    .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right'))    )c.render_notebook()

评分排行

烤肉店的评分在一定程度上反映了消费者对烤肉店的态度和看法。通过计算各个行政区烤肉店平均评分,我们发现,深圳烤肉店普遍评分不高,都在3分以下,且各地区评分差异不大。

df3 = df.groupby('所属区县')['店铺评分'].mean()df3 = df3.sort_values(ascending=False)df3 = df3.round(2)c = (    Bar(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))    .add_xaxis(df3.index.to_list())    .add_yaxis("",df3.to_list())    .set_global_opts(title_opts=opts.TitleOpts(title="各地区平均评分",subtitle="数据来源:美团",pos_left = 'center'),                       xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改横坐标字体大小                       yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改纵坐标字体大小                       )    .set_series_opts(label_opts=opts.LabelOpts(font_size=16))    )c.render_notebook()

评分类型

根据不同评分类型绘制饼图,我们发现深圳评分为"一般"的烤肉店数量占比高达73.9%。评分类型为"不错"的烤肉店仅占6.52%。烤肉店较低的评分意味着,作为市场的进入者,如果新开烤肉店能够提供较好的质量和服务,且获得消费者好评,将比较容易在众多烤肉店中脱颖而出。

df4 = df.groupby('评分类型')['店铺名称'].count()df4 = df4.sort_values(ascending=False)regions = df4.index.to_list()values = df4.to_list()c = (        Pie(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))        .add("", zip(regions,values))        .set_global_opts(title_opts=opts.TitleOpts(title="不同评分类型店铺数量",subtitle="数据来源:美团",pos_top="-1%",pos_left = 'center'))        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}:{d}%",font_size=18))    )c.render_notebook()

我们继续将评分类型分析细化到深圳的各个行政区,罗湖区评分为"一般"的烤肉店占比相对低一些。其他地区占比都超过了一半。这进一步反映了深圳烤肉店评分的整体情况,排除了某个或某几个行政区评分异常值的影响。

h = pd.pivot_table(df,index=['评分类型'],values=['店铺名称'],               columns=['所属区县'],aggfunc=['count'])k = h.droplevel([0,1],axis=1)  #删除指定的索引/列级别c = (    Polar(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))    .add_schema(angleaxis_opts=opts.AngleAxisOpts(data=k.columns.tolist(), type_="category"))    .add("一般",h.values.tolist()[0], type_="bar", stack="stack0")    .add("不错",h.values.tolist()[1], type_="bar", stack="stack0")    .add("好", h.values.tolist()[2], type_="bar", stack="stack0")    .add("很好", h.values.tolist()[3], type_="bar", stack="stack0")    .set_global_opts(title_opts=opts.TitleOpts(title="不同地区评分情况",subtitle="数据来源:美团")))c.render_notebook()

人均消费

从深圳各行政区烤肉店人均消费来看,南山区和福田区人均消费较高,坪山区和光明区人均消费较低。在消费量一致的假设下,人均消费的多少取决于烤肉的价格。南山区和福田区高昂的开店成本以及消费者较强的消费能力,是烤肉人均消费较高的重要动因。

df5 = df.groupby('所属区县')['人均消费'].mean()df5 = df5.sort_values(ascending=True)df5 = df5.round(2)c = (    Bar(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))    .add_xaxis(df5.index.to_list())    .add_yaxis("",df5.to_list()).reversal_axis() #X轴与y轴调换顺序    .set_global_opts(title_opts=opts.TitleOpts(title="各地区人均消费",subtitle="数据来源:美团",pos_left = 'center'),                       xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改横坐标字体大小                       yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改纵坐标字体大小                       )    .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right'))    )c.render_notebook()

由上图可知,深圳各行政区烤肉人均消费普遍低于50元,那是不是意味着如果要开烤肉店的话,定价不能太高。为此,我们可以筛选出人均消费大于1000元的烤肉店,看下消费者的评价情况。由下表可知,虽然三家烤肉店定价很高,却获得了消费者较高的评价。因此,烤肉的定价还需根据你的市场定位来,如果定位高端人群,那么较高的价格消费者也是可以接受的。

df_1 = df[df['人均消费']>1000]df_1[['店铺名称','人均消费','评分类型','所在商圈']]

店铺类型

从深圳烤肉店店铺类型来看,烤串、烧烤和融合烤肉最多,韩式烤肉、日式烤肉等店铺相对更少一些。

df6 = df.groupby('店铺类型')['店铺名称'].count()df6 = df6.sort_values(ascending=False)[:10]df6 = df6.round(2)regions = df6.index.to_list()values = df6.to_list()c = (        Pie(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))        .add("", zip(regions,values),radius=["40%", "75%"])        .set_global_opts(title_opts=opts.TitleOpts(title="不同店铺类型店铺数量",pos_top="-1%",pos_left = 'center'))        .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}",font_size=18))    )c.render_notebook()

从评分来看,串串香、牛排和怀石料理的烤肉评分较高。另外,日式自助烤肉评分也排到了前十名,日式烤肉对肉要求比较高,日式肉类也会稍微腌制,但是总体以体现肉的鲜美为主。精致的日式烤肉,博得了众多深圳消费者的青睐。

df6 = df.groupby('店铺类型')['店铺评分'].mean()df6 = df6.sort_values(ascending=True)df6 = df6.round(2)df6 = df6.tail(10)c = (    Bar(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))    .add_xaxis(df6.index.to_list())    .add_yaxis("",df6.to_list()).reversal_axis() #X轴与y轴调换顺序    .set_global_opts(title_opts=opts.TitleOpts(title="不同店铺类型评分",subtitle="数据来源:美团",pos_left = 'center'),                       xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改横坐标字体大小                       yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改纵坐标字体大小                       )    .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right'))    )c.render_notebook()

评论人数

从评论人数来看,综合自助和韩式烤肉店评论人数均在10万左右,而评论人数在一定程度上反映了烤肉店的热度。不同的综合自助烤肉店一般价格和肉质差异较大,获得较多的评论也不足为奇。而韩式烤肉通常会对肉类进行腌制,口感偏重,也被深圳消费者广泛讨论。

df7 = df.groupby('店铺类型')['评论人数'].sum()df7 = df7.sort_values(ascending=True)df7 = df7.tail(10)c = (    Bar(init_opts=opts.InitOpts(theme=ThemeType.WONDERLAND))    .add_xaxis(df7.index.to_list())    .add_yaxis("",df7.to_list()).reversal_axis() #X轴与y轴调换顺序    .set_global_opts(title_opts=opts.TitleOpts(title="不同店铺类型评论人数",subtitle="数据来源:美团",pos_left = 'center'),                       xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改横坐标字体大小                       yaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(font_size=16)), #更改纵坐标字体大小                       )    .set_series_opts(label_opts=opts.LabelOpts(font_size=16,position='right'))    )c.render_notebook()

店铺取名

当然,开烤肉店除了要了解消费者的偏好以及竞争对手的优劣势,还一个重要步骤就是给自己开的烤肉店取名了。一个响亮的烤肉店名字,能够给消费者留下较深的记忆度,同时也能带来品牌效应。于是,J哥对深圳所有烤肉店名进行分词并绘制了词云图,发现除了烧烤、烤肉等字样,词频较高的还有音乐、木屋和炭火等。差异化市场定位,给烤肉搭配多样化的元素,在店名中凸显出来,不失为一个不错的选择。

import jiebaimport stylecloudfrom IPython.display import Image# 定义分词函数def get_cut_words(content_series):    # 读入停用词表    stop_words = []        with open("./stop_words.txt", 'r', encoding='utf-8') as f:        lines = f.readlines()        for line in lines:            stop_words.append(line.strip())    # 添加关键词    my_words = ['', '']        for i in my_words:        jieba.add_word(i)    # 自定义停用词    my_stop_words = ['东北', '福田','公园','车公庙','梅林','购物']    stop_words.extend(my_stop_words)    # 分词    word_num = jieba.lcut(content_series.str.cat(sep='。'), cut_all=False)    # 条件筛选    word_num_selected = [i for i in word_num if i not in stop_words and len(i)>=2]        return word_num_selected# 绘制词云图text1 = get_cut_words(content_series=df['店铺名称'])stylecloud.gen_stylecloud(text=' '.join(text1), max_words=1000,                          collocations=False,                          font_path='字酷堂清楷体.ttf',                          icon_name='fas fa-shopping-bag',                          size=653,                          output_name='./烤肉.png')Image(filename='./烤肉.png')

以上是"python如何爬取美团1024家烤肉店数据"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

0