我用Python采集了6万多家火锅店数据,好吃的火锅在哪里!
大家好,我是菜鸟哥,最近太冷太冷了,取暖基本靠抖,通讯基本靠吼!不过天冷了,可以涮火锅吃羊肉,补一补!反正菜鸟哥很喜欢吃火锅,可以开始搞起来!那么,今天我们就用Python爬取某点评网站的火锅数据,一起找找好吃的火锅在哪里吧~~
目录:
1.说明
2.北京火锅店基础数据
3.北京火锅店评分数据
4.评价数及人均消费
5.都有哪些连锁店
6.爬虫过程
7.其他
接下来,我们来看看北京好吃的火锅都在哪里吧~
1.说明
环境
!! 环境
Windows:Windows-10
Python版本:3.7.9
IDE:Spyder 4.1.5
绘图库:matplotlib
数据
!! 数据
数据来源:大众点评-美食-北京-火锅
表单字段:['地区', '火锅类型', 'id', '商家名称', '商家评分', '评价数', '人均消费', '口味', '环境', '服务', '地址', '推荐菜']
表单数量:6416条有效数据(另有4000余条无评价等的店铺数据,记为无效数据,已删除)
2.北京火锅店基础数据
In [1]: df.id.nunique() #有效火锅店铺数:店铺id非重复计数
Out[1]: 5319
北京一共有5319家有评分的有效火锅店铺。
2.1. 火锅分类
算不上吃货的我,只知道两种火锅:火锅和铜锅。仔细一看,发现有接近小30种火锅种类,咱中国人真讲究。
在北京品类最多的有老北京火锅高达1020家,其次是川味麻辣火锅、羊蝎子火锅及串串香等。
以下是绘图代码:
# 获取数量前10的火锅类型
df_type = df.groupby('火锅类型')['id'].nunique().to_frame('数量').reset_index().sort_values('数量',ascending=False)
df_type.reset_index(drop=True,inplace=True)
df_type.head(10)
df_type10 = df_type.head(10) #前10
# 绘制柱状图
fig = df_type10.plot(kind='barh',x='火锅类型',y='数量',title="各类火锅店铺数量",color='orange',figsize=(18,9),fontsize=16,)
fig.axes.title.set_size(22) #设置标题字体大小
fig.legend(fontsize=16) #设置图例字体大小
fig.set_ylabel('火锅类型',fontdict={'fontsize':20}) #设置y轴名称及字体大小
for index, num in enumerate(df_type10['数量']): #添加数据标签fig.text(num, index,s = num, ha = 'left', fontsize = 16)
2.2. 各地区火锅分类
以才哥在的海淀区为例,火锅类型最多的是川味麻辣,其次是老北京火锅、串串香和重庆火锅。不得不说,这些都是我爱吃的。
以下是制作代码:
df_loc_type = pd.pivot_table(df, values='id', index='火锅类型', columns='地区', aggfunc=pd.Series.nunique)
cm =sns.light_palette("red", as_cmap=True)
df_loc_type.fillna(0).astype(int).style.background_gradient(cmap=cm) #创建热力图背景(列)
2.3. 各地区火锅店数量
不得不说朝阳区也太牛了,接近1200家店,占总店的20%+。其次是咱们海淀、昌平这种打工人聚集的地方~
3.北京火锅店评分数据
从大众点评上爬取的店铺数据中,我们可以看到评分相关的数据指标有 商家评分(4.97)、口味、环境和服务评分共5类。
3.1. 评分直方图
组合四类评分绘制叠加直方图,可以看见基本上各项评分的分布基本一致,大部分分布在4分以下或者4.5分以上,两级分化比较明显。以下是绘图代码:
# 叠加直方图
plt.figure(figsize=(16,9))
plt.hist(x =df['商家评分'], color='orange', bins= 15, alpha=0.5) #橙色
plt.hist(x =df['口味'], color='red', bins= 15, alpha=0.5) # 红色
plt.hist(x =df['环境'], color='blue', bins= 15, alpha=0.5) # 蓝色
plt.hist(x =df['服务'], color='white', bins= 15, alpha=0.5) # 白色
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
3.2. 各地区商家评分箱线图
如图我们可以发现,东城区、朝阳区、西城区和海淀区是商家评分较高普遍较高,而密云和延庆等郊区除了个别火锅店评分较高之外整体普通较低。当然,这个其实是地理位置影响优质店铺选址,从而呈现这种表现。以下是绘图代码:
# 箱线图-商家评分
fig = df.boxplot(column='商家评分',by='地区', figsize=(18,9), color ='red',fontsize = 16)
fig.axes.title.set_size(22) #设置标题字体大小
fig.set_xlabel('地区',fontdict={'fontsize':20}) #设置y轴名称及字体大小
商家评分最高前5
3.3. 各地区口味评分箱线图
对比商家评分的箱线图,我们发现东城区火锅店的口味评分有超过一半以上的店面超过了4.5分,基本上口味好的火锅店也都在北京的中心城区。口味评分最高前5
3.4. 各地区环境评分箱线图
环境评分整体较好的在东城区和朝阳区环境评分最高前5
3.5. 各地区服务评分箱线图
服务评分整体较好的也是在东城区和朝阳区服务评分最高前5
3.6. 各地区各项评分
我们查看四项评分之间的散点图矩阵,各地区的火锅店,商家评分和口味,环境与服务关联更强。口味好的一般评分应该不会太差,环境好的服务也一般不错。
以下是绘图代码:
# 散点图矩阵
plt.rcParams["axes.labelsize"] = 16 # 设置全局轴标签字体大小
score = df[['商家评分','口味','环境','服务','地区']]
sns.pairplot(score, hue='地区',height=3)
4.评价数及人均消费
我在大众点评找店子的时候,除了看评分之外,评价数和人均消费也是极其重要的考量。当看到评价数极高的时候,内心会不由的表示惊叹“哇塞,这么多人写评价啊”;当看到人均消费极高的时候,也会想着啥时候我也要去吃一次,哈哈~
4.1. 整体评价数分布
先用描述统计看,发现评价数最多的有3.2万个,最少的仅1个,75%的火锅店评价在900以下,更有25%的火锅店评价不到23个。
In [1]:df.评价数.describe()
Out[1]:
count 6416.000000
mean 831.874065
std 1846.721435
min 1.000000
25% 23.000000
50% 211.000000
75% 881.000000
max 32099.000000
Name: 评价数, dtype: float64
一定程度上,评价数能反应一家店在广大吃货中的火爆度,我们发现最火的前5家有3家来自西城区,海淀区和东城区各1家。
以下是2家评价数破3万的热门火锅店~
4.2.人均消费情况
一共有人均消费数据的店铺4129家,其中均值100元,中位数也是95元,最高的是1220元(我的天,这是啥火锅?)。
4.2.1.人均消费最贵的都有谁
人均消费最贵第1名是一家日韩火锅,推荐菜基本都是日料类。其次,人均消费较高的都是海鲜火锅一类,你看那些推荐菜都是帝王蟹、澳龙啥的,想吃了,哈哈!!
以下是2家人均消费破千的火锅店~
4.2.2.人均消费分布
大部分的火锅店人均消费低于100元,其次是100-150元区间。极少数在200+,虽然能吃的主很容易吃出200+的其实!!以下是绘图代码:
plt.figure(figsize = (12,12))#将画布设定为正方形,绘制的饼图是正圆
plt.rcParams['font.size']=16 #设置字体大小为16
label = df_cost.index.tolist()#定义饼图的标签
explode = [0.01,0.01,0.01,0.01,0.01]#设定各项距离圆心n个半径
values = df_cost.数量.tolist()
plt.pie(values,explode = explode,labels = label,autopct = '%1.1f%%')#饼图
plt.title('人均消费分布',fontdict={'fontsize':20})#标题
我们经常听的海底捞火锅店的人均消费大概在130左右。
5.都有哪些连锁店
一共有349家品牌火锅有分店。
5.1.火锅分店前10品牌
果然是哪都有的呷哺呷哺(找了半天发音)以多大289家分店稳居第一!看着这些品牌,基本都是比较常见熟悉的,基本上都吃过来着。
5.2.火锅分店前10品牌人均消费
海底捞 人均消费 基本都在120以上,玩儿串串是一家什么店呀,人均基本都低于40,其次就是开了快300家店的呷哺呷哺也是人均消费比较合适。
5.3.火锅分店前10品牌商家评分
好吧,又是海底捞 评分表现最佳,可恶的海底捞。不过各家品牌大部分评分还是都不错,在4.25分以上。玩儿串串作为小吃摊位放在这群雄里显得有点格格不入了,哈哈!
玩儿串串原来是这种,在购物中心的美食中心里的偏快餐式的串串儿~
6.爬虫过程
这里不介绍详细的爬虫过程,详细的见后续推送哈(主要是篇幅有限 写不完)。
咱们简单说说在爬虫过程中遇到的一些问题及解决方案。
FAQ
①大众点评的搜索结果最多只显示50页,如果获取全部数据?
解:搜索有多级选择,以北京火锅为例就是 子分类+地区,我们看到一页15家店铺最多50页就有750家,加上诸多级选择基本可以覆盖全部店铺。
②未登录情况下无法查看下一页获取地址规律
解:直接登录账号然后点击下一页查看地址变化规律呗。
③爬着爬着很快就被封ip了
解:嗯,而且不是说爬慢点就行,我就被封了2个ip貌似都是封1天以上,最后买了1000个ip代理,被封了就自动换解决。
④部分店铺信息对应字典为方框无法解析
解:网上有很多这种css字体加密解密的文章,边看边学吧(反正作为菜鸟的我是这么来的)
以下代码为简单的解析 北京火锅 子分类的脚本
import re
import requestsheader = {"Accept-Encoding": "Gzip", # 使用gzip压缩传输数据让访问更快"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0",
}url_beijing = 'http://www.dianping.com/beijing/ch10' #北京菜系
rep_beijing = requests.get(url_beijing, headers= header)
html_beijing = rep_beijing.text
location_html = re.findall('<div id="region-nav" class="nc-items">([\s\S]*?)</div>',html_beijing)[0] #获取地区的数据内容
location_name = re.findall('data-click-title="(.*?)"', location_html) #获取地区名称列表
location_id = re.findall('<a href="http://www.dianping.com/beijing/ch10/(.*?)"',location_html) #获取地区编号id
dic_location = dict(zip(location_name,location_id)) #组合成字典备用url_huoguo = 'http://www.dianping.com/beijing/ch10/g110' #火锅
rep_huoguo = requests.get(url_huoguo, headers= header)
html_huoguo = rep_huoguo.text
type_html = re.findall('<div id="classfy-sub" class="nc-items nc-sub">([\s\S]*?)</div>',html_huoguo)[0] #获取火锅类型的数据内容
type_name = re.findall('<span>(.*?)</span>', type_html) #获取火锅类型名称列表
type_name = type_name[1:] #第一个是不限,需要去掉
type_id = re.findall('data-cat-id="(.*?)"',type_html) #获取火锅类型id
dic_type = dict(zip(type_name,type_id)) #组合成字典备用
7.如何获取代码
需要本文的数据和代码,可以在公众号后台输入:小助手,找他领取,备注暗号:北京火锅
大家可以捣鼓更多的数据关联表现,虽然可能并没有实际的啥作用,哈哈!喜欢吃火锅的同学可以在文末留言评论区说说你最喜欢吃的火锅,经常来留言,我们月底会统计,送书的哦!
免责声明: 那个,咱们爬虫仅用于简单交流,切勿用做任何商业用途
推荐阅读:
入门: 最全的零基础学Python的问题 | 零基础学了8个月的Python | 实战项目 |学Python就是这条捷径
量化: 定投基金到底能赚多少钱? | 我用Python对去年800只基金的数据分析
干货:爬取豆瓣短评,电影《后来的我们》 | 38年NBA最佳球员分析| 从万众期待到口碑扑街!唐探3令人失望 | 笑看新倚天屠龙记灯谜答题王 |用Python做个海量小姐姐素描图碟中谍这么火,我用机器学习做个迷你推荐系统电影
趣味:弹球游戏 | 九宫格 | 漂亮的花 | 两百行Python《天天酷跑》游戏!
AI: 会做诗的机器人给图片上色 | 预测收入 | 碟中谍这么火,我用机器学习做个迷你推荐系统电影
小工具: Pdf转Word,轻松搞定表格和水印! | 一键把html网页保存为pdf!| 再见PDF提取收费! | 用90行代码打造最强PDF转换器,word、PPT、excel、markdown、html一键转换 | 制作一款钉钉低价机票提示器! |60行代码做了一个语音壁纸切换器天天看小姐姐!|
年度爆款文案
1).卧槽!Pdf转Word用Python轻松搞定!
2).学Python真香!我用100行代码做了个网站,帮人PS旅行图片,赚个鸡腿吃
3).首播过亿,火爆全网,我分析了《乘风破浪的姐姐》,发现了这些秘密
4).80行代码!用Python做一个哆来A梦分身
5).你必须掌握的20个python代码,短小精悍,用处无穷
6).30个Python奇淫技巧集
7).我总结的80页《菜鸟学Python精选干货.pdf》,都是干货
8).再见Python!我要学Go了!2500字深度分析
9).发现一个舔狗福利!这个Python爬虫神器太爽了,自动下载妹子图片
点阅读原文,看Python全套!
我用Python采集了6万多家火锅店数据,好吃的火锅在哪里!相关推荐
- 我用Python采集了6万多家火锅店数据,告诉你哪家的火锅最好吃。
大家好,最近太冷太冷了,取暖基本靠抖,通讯基本靠吼!不过天冷了,可以涮火锅吃羊肉,补一补!反正菜鸟哥很喜欢吃火锅,可以开始搞起来!那么,今天我们就用Python爬取某点评网站的火锅数据,一起找找好吃的 ...
- Python采集全国各地百度地图上店铺POI数据(母婴、美食等)
Python采集全国各地百度地图上店铺POI数据 1. 注册百度地图开放平台账号 先注册百度地图开发平台账号,创建应用,获得AK 2. 通过Python批量检索不同城市店铺POI数据 2.1 大致思路 ...
- 谁还不爱吃肉?现在就教你采集一座城市里的烤肉店数据(附完整代码)
文章目录 前言 正文 准备环境 了解爬虫最基本的思路 一. 数据来源分析 二. 代码实现过程 代码实现过程 发送请求 2.获取数据 3.解析数据 4.解析数据 5.翻页 运行代码得到数据 完整代码 前 ...
- Python:爬了下链家的小区数据,为数据分析弄素材~
前言:最近在学数据分析,包括主成分分析.因子分析.聚类...等等,没有数据可不行啊,所以就把链家的小区数据给爬了一下,为后续的分析实战弄素材~ 2019年7月18日修正: 因为高德和百度对于GPS的加 ...
- python带你采集桌游、剧本杀游戏店数据信息~
前言 嗨喽~大家好呀,这里是魔王呐 ! 又是学习的一天,让我们开始叭~ 环境使用: Python 3.8 Pycharm 模块使用: requests >>> pip install ...
- Python获取拥有100万+关注的CSDN公众数据, 发现最关心的竟不是技术,而是…
从工业时代进入到信息服务时代,互联网行业逐渐兴起,传统行业逐渐没落.现如今,很多人混迹于互联网+的时代,人人都要学习编程已经逐渐被重视起来. 作为一个入行五年的老鸟,回首看看这五年的经历,恍若隔世. ...
- 打造最全皮肤,Python采集英雄联盟(LOL)官网数据!
环境: Python3.6.5 Windows pycharm 模块: import requests import jsonpath from urllib.request import urlre ...
- 用python爬取网贷之家p2p平台数据
网贷之家中的p2p平台数据比较容易获取,重要的就是如何分析网页的源代码然后从里面提取自己需要的信息,也不需要用户登录,该网站的爬虫比较简单,主要用了urllib包来获取网页信息,用BeautifulS ...
- Python探秘大众点评北京火锅店第①期:好吃的火锅在哪里?
文章目录 1. 说明 2. 北京火锅店基础数据 2.1. 火锅分类 2.2. 各地区火锅分类 2.3. 各地区火锅店数量 3. 北京火锅店评分数据 3.1. 评分直方图 3.2. 各地区商家评分箱线图 ...
最新文章
- oracle dba_tables各字段含义
- 在数据显示页面增加按姓名查询功能
- 寒武纪上市:AI芯片和普通芯片有何不同?全球AI芯片公司大全都在这里了
- Java笔记:成员变量,局部变量,类变量,实例变量以及注意事项
- vim配置python代码提示,VIM配置成Python IDE
- Java FilePermission getActions()方法与示例
- Java多线程编程系列-实例变量和线程安全
- jQuery LigerUI 使用教程表格篇(1)
- 第三篇 层次类非线性表的编程实验 第10章 应用经典二叉树编程
- JSK-388 等差数列【入门】
- 重写ArrayAdapter
- 关于今天zcash4win钱包出错的解决方案Error in updating status 怎么解决
- etl mysql 到sqkserver_从SQL Server到MySQL的ETL实现
- html5 3D地球转动动画js特效
- 电脑系统重装出现蓝屏解决方法
- VMware vCenter Server 7.0 U2b/6.7 U3n/6.5 U3p 修复高危安全漏洞
- 印度软件与信息服务业发展经验及启示
- 为学日益,为道日损——编程的学与做
- Gunicorn-配置详解
- Python学习笔记_多张图片生成马赛克图