其他
【爬虫实战】喜茶的门店都开在了哪里?
本文作者:戴 雯,中南财经政法大学金融学院
本文编辑:王子一
技术总编:张馨月
爬虫俱乐部云端课程
引言
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)
data
对应的值,类似于用Xpath提取XML文档的信息,对于json文件,我们可以用jsonpath来提取信息。#JsonPath语法规则字符串一定是以 `$` 开头;
#`..` 表示深层扫描,不管位置,选择所有符合条件的信息。
import jsonpath
null = ''
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.数据可视化展示
pyecharts
库,为大家更直观地展示爬取的结果。柱状图
from pyecharts.charts import Bar
from pyecharts import options as opts
result=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 Map
from 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中渲染
地理图之全国图(分段型)
is_piecewise=True
表示设定为分段型,每个省份(provinces)对应的等级1~5(levels)与视觉映射配置项pieces中的value值是一一对应的,label表示分段名称,color表示颜色。所以,{"value":"5", "label": "100+", "color":"red"}
就表明广东的填充颜色为红色,相对于的分段名为100+。具体程序如下:from pyecharts.charts import Map
from pyecharts import options as opts
result['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 Map
from 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()
如何简洁地列出指定属性的变量?ds命令来了!
如何在Python中进行描述性统计分析?
分析师和他们的雇主重视与管理层接触吗?——分析师参与盈余电话会议的研究
爬虫俱乐部开发的命令更新及常见问题说明
Seminar | 道德培训真的有用吗?
统计年鉴数据整理小技巧
Seminar | 作为飞行员,我比别的CEO多了什么?
利用TensorFlow构建前馈神经网络
推文合集(1)| Stata学习者必看的n篇推文!
Seminar | 诚信的价值
利用tushare获取股票数据及实现可视化
从Excel到Stata的“摆渡车”——import excel命令
光阴十载,见证了《经济研究》中的“高被引”
微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。