查看原文
其他

【爬虫实战】喜茶的门店都开在了哪里?

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:戴   雯,中南财经政法大学金融学院

本文编辑:王子一

技术总编:张馨月 

爬虫俱乐部云端课程

  爬虫俱乐部于2020年暑期在线上举办的Stata与Python编程技术训练营和Stata数据分析法律与制度专题训练营已经圆满结束啦~应广大学员需求,我们的课程现已在腾讯课堂全面上线,且继续提供答疑服务。现在关注公众号并在朋友圈转发推文《来腾讯课堂学Stata和Python啦》或《8月Stata数据分析法律与制度专场来啦!》,即可获得600元课程优惠券,集赞50个再领200元课程优惠券!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元

引言

前段时间,茶颜悦色落地武汉,这杯排队超8小时、跑腿费上百元的奶茶引起了大家的热议,也不禁让人联想到另一款深受大家喜爱的奶茶店——喜茶。经过数年的发展,喜茶的门店在全国的分布情况如何?今天,小编就直奔喜茶官网,爬取了喜茶在全国的门店分布数据并进行了可视化整理。大家一起往下看吧~
1.爬虫步骤讲解
首先,进入喜茶官网(https://www.heytea.com/),下滑找到地址所在页面,在开发者工具中找到存储网页信息的真实链接(https://go.heytea.com/api/service-sale/openapi/shop?_=1608542272379)。
在添加请求头信息后,通过requests.get()获取源代码,程序如下:
import requests
url = "https://go.heytea.com/api/service-sale/openapi/shop?_=1607760181552"headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36'}html = requests.get(url, headers = headers)print(html.text)
获取到的源代码信息部分展示如下,从图中可以看出,源代码是json格式,而我们所需要的信息则是键data对应的值,类似于用Xpath提取XML文档的信息,对于json文件,我们可以用jsonpath来提取信息。

通过使用jsonpath,我们提取了城市、每个城市对应的喜茶店名、每个门店对应的经度和纬度四个信息,并写入csv文件,程序如下:
#JsonPath语法规则字符串一定是以 `$` 开头;#`..` 表示深层扫描,不管位置,选择所有符合条件的信息。import jsonpathnull = ''page = eval(html.text) #eval()函数用来执行一个字符串表达式,并返回表达式的值。#print(page)with open(r'D:\喜茶.csv','w') as fp: fp.write('%s,%s,%s,%s\n' % ('城市','店名','纬度','经度')) #写入变量名
for i in range(59): # 使用jsonpath提取信息 # $代表查询根元素,..代表深层扫描。$..area等同于xpath中的//area area_list = jsonpath.jsonpath(page['data'][i], "$..area") name_list = jsonpath.jsonpath(page['data'][i], "$..name") dataX_list=jsonpath.jsonpath(page['data'][i], "$..dataX") dataY_list=jsonpath.jsonpath(page['data'][i], "$..dataY")
for city in area_list: for name, dataX, dataY in zip(name_list,dataX_list,dataY_list): print(city,name, dataX, dataY) with open(r'D:\喜茶.csv','a') as fp: fp.write('%s,%s,%s,%s\n' % (city,name,dataX,dataY))
由于官网的源代码中没有涉及省份,所以需要将爬取的城市与省份匹配,以便更好地进行数据分析。(行政区划表可以通过在公众号后台回复“行政区划”获取哦~)
import pandas as pd#读入喜茶文件path = 'D:/喜茶.csv'data = pd.read_csv(path, encoding= "ANSI") #由于此处的csv文件是ANSI编码的,故要加入encoding选项#读入行政区划文件path1='D:/行政区划.xls'data1 = pd.read_excel(path1)#将这两个文件通过“城市”这一关键变量进行匹配data2=pd.merge(data1,data,on="城市")file = "D:/喜茶(城市与省份对应版).xlsx"data2.to_excel(file, index = None)
得到的结果格式如下图所示,这里以西安市为例展示爬取的部分数据:

2.数据可视化展示

下面,小编使用了Python中的绘图高手pyecharts库,为大家更直观地展示爬取的结果。
  • 柱状图

from pyecharts.charts import Barfrom pyecharts import options as optsresult=data2['省份'].value_counts()result=result.reset_index()result.columns = ['省份','数量']provinces = result['省份'].values.T.tolist()numbers = result['数量'].values.T.tolist()
bar=Bar() #创建Bar实例bar.add_xaxis(provinces)# 添加x轴数据bar.add_yaxis("门店数量",numbers) # 添加y轴数据bar.set_global_opts(title_opts=opts.TitleOpts(title = "喜茶门店数量全国分布",subtitle = "柱状图展示"),xaxis_opts=opts.AxisOpts(axislabel_opts={"rotate":45}))bar.render_notebook() #直接在notebook中渲染
从图中可以看出,广东的喜茶门店数量位居榜首,有255家,作为喜茶的发源地,数量最高也在情理之中。此外,喜茶在上海北京江苏浙江的分布数量较多,均超过50家,也进一步反映了这些省份及直辖市的奶茶需求较高,年轻群体受众较多。
  • 地理图之全国图(连续型)

为了让大家更形象地看出喜茶在各省份的门店分布情况,地理图闪亮登场了。我们在add中将图例设置为"",借助zip函数传入省份与各省门店数,并添加"china" 表示地图类型为中国地图。为了让图像更为美观,在TitleOpts中利用pos_left="center"将标题设为居中。此外,视觉映射配置项VisualMapOpts提供了通用的视觉映射,比如组件颜色,组件距离,是否分段等等,这里的is_piecewise设定是否为分段型,False表示设置为连续型。具体程序如下:
from pyecharts.charts import Mapfrom pyecharts import options as opts
Map_China = ( Map() .add("",[list(z) for z in zip(provinces,numbers)],"china") )Map_China.set_global_opts( title_opts=opts.TitleOpts(title="喜茶全国门店数量分布图",pos_left="center"), visualmap_opts=opts.VisualMapOpts(max_=260,pos_left="15%",pos_bottom="10%",is_piecewise=False))Map_China.render_notebook() #直接在notebook中渲染
由于大部分省份的门店数量都集中在20家以下,因此自动生成的地图大部分省份颜色区分度不明显,这时我们可以选择分段型,自定义每一段的范围、文字和样式。

  • 地理图之全国图(分段型)

is_piecewise=True 表示设定为分段型,每个省份(provinces)对应的等级1~5(levels)与视觉映射配置项pieces中的value值是一一对应的,label表示分段名称,color表示颜色。所以,{"value":"5", "label": "100+", "color":"red"} 就表明广东的填充颜色为红色,相对于的分段名为100+。具体程序如下:
from pyecharts.charts import Mapfrom pyecharts import options as optsresult['sort'] = result['数量'].map(lambda a : 5 if a>100 else 4 if a>50 else 3 if a>10 else 2 if a>5 else 1) levels=result['sort'].tolist()
Map_China = ( Map() .add("",[list(z) for z in zip(provinces,levels)],"china") .set_global_opts( title_opts=opts.TitleOpts(title="喜茶全国门店数量分布图",pos_left="center"), visualmap_opts=opts.VisualMapOpts( pos_left="10%", pos_bottom="10%", is_piecewise=True, pieces=[# 自定义分段名称和颜色 {"value":"5", "label": "100+", "color":"red"}, {"value":"4", "label": "51-100", "color":"orange"}, {"value":"3", "label": "11-50", "color":"yellow"}, {"value":"2", "label": "6-10", "color":"pink"}, {"value":"1", "label": "1-5", "color":"gray"} ] ) ) )Map_China.render_notebook() #直接在notebook中渲染
自定义分段后再看各省份数量分布情况是不是清晰很多~

  • 地理图之省份图

从上面的分析中可以看出,广东省的门店数量远超过其他省份,那广东省内各城市的喜茶门店分布情况究竟是什么样的呢?我们在add选项中,把地图类型换成"广东",其他选项跟全国地图的绘制方法类似。
from pyecharts.charts import Mapfrom pyecharts import options as opts#城市名city=['东莞市','佛山市','广州市','惠州市','江门市','揭阳市','茂名市','汕头市','深圳市','阳江市','湛江市','镇江市','中山市','珠海市']#每个城市对应的门店数量numbers=[14,19,69,8,7,1,1,5,110,1,2,2,9,7]Map_guangdong = ( Map() .add("", [list(z) for z in zip(city,numbers)], "广东") .set_global_opts( title_opts=opts.TitleOpts(title="喜茶广东省门店数量分布图",pos_left="center"), visualmap_opts=opts.VisualMapOpts(max_=110,pos_left="15%",pos_bottom="10%") ))Map_guangdong.render_notebook()
得出的结果也是一目了然,深圳的门店数量最多,广州位居第二。
以上就是本期推文的全部内容了,我们下期再见~




对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐
import delimited | 再也不用担心读入网页源代码“乱七芭蕉”了

如何简洁地列出指定属性的变量?ds命令来了!

如何在Python中进行描述性统计分析?

分析师和他们的雇主重视与管理层接触吗?——分析师参与盈余电话会议的研究

繁忙的董事与公司业绩:来自并购的证据
使用Python接口读取CSMAR数据
列表生成式|让你的代码简洁又美观
Stata中变量观测值的亲密伙伴——levelsof命令

爬虫俱乐部开发的命令更新及常见问题说明

Seminar | 道德培训真的有用吗?

网络爬虫入门之requests 库的基本使用——以亚马逊图书界面为例
reduce()函数和filter()函数闪亮登场
“环环”入扣之foreach命令

统计年鉴数据整理小技巧

Seminar | 作为飞行员,我比别的CEO多了什么?

利用TensorFlow构建前馈神经网络

推文合集(1)| Stata学习者必看的n篇推文!

Seminar | 诚信的价值

利用tushare获取股票数据及实现可视化

从Excel到Stata的“摆渡车”——import excel命令

光阴十载,见证了《经济研究》中的“高被引”

关于我们


微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存