我用Python采集了6萬多家火鍋店數(shù)據(jù),好吃的火鍋在哪里!
大家好,我是菜鳥哥,最近太冷太冷了,取暖基本靠抖,通訊基本靠吼!不過天冷了,可以涮火鍋吃羊肉,補(bǔ)一補(bǔ)!反正菜鳥哥很喜歡吃火鍋,可以開始搞起來!那么,今天我們就用Python爬取某點(diǎn)評(píng)網(wǎng)站的火鍋數(shù)據(jù),一起找找好吃的火鍋在哪里吧~~
目錄:
1.說明
2.北京火鍋店基礎(chǔ)數(shù)據(jù)
3.北京火鍋店評(píng)分?jǐn)?shù)據(jù)
4.評(píng)價(jià)數(shù)及人均消費(fèi)
5.都有哪些連鎖店
6.爬蟲過程
7.其他
接下來,我們來看看北京好吃的火鍋都在哪里吧~
1.說明
環(huán)境
!! 環(huán)境
Windows:Windows-10
Python版本:3.7.9
IDE:Spyder 4.1.5
繪圖庫:matplotlib
數(shù)據(jù)
!! 數(shù)據(jù)
數(shù)據(jù)來源:大眾點(diǎn)評(píng)-美食-北京-火鍋
表單字段:['地區(qū)', '火鍋類型', 'id', '商家名稱', '商家評(píng)分', '評(píng)價(jià)數(shù)', '人均消費(fèi)', '口味', '環(huán)境', '服務(wù)', '地址', '推薦菜']
表單數(shù)量:6416條有效數(shù)據(jù)(另有4000余條無評(píng)價(jià)等的店鋪數(shù)據(jù),記為無效數(shù)據(jù),已刪除)
2.北京火鍋店基礎(chǔ)數(shù)據(jù)
In?[1]:?df.id.nunique()?#有效火鍋店鋪數(shù):店鋪id非重復(fù)計(jì)數(shù)
Out[1]:?5319
北京一共有5319家有評(píng)分的有效火鍋店鋪。
2.1. 火鍋分類
算不上吃貨的我,只知道兩種火鍋:火鍋和銅鍋。仔細(xì)一看,發(fā)現(xiàn)有接近小30種火鍋種類,咱中國(guó)人真講究。
在北京品類最多的有老北京火鍋高達(dá)1020家,其次是川味麻辣火鍋、羊蝎子火鍋及串串香等。
以下是繪圖代碼:
#?獲取數(shù)量前10的火鍋類型
df_type?=?df.groupby('火鍋類型')['id'].nunique().to_frame('數(shù)量').reset_index().sort_values('數(shù)量',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='數(shù)量',title="各類火鍋店鋪數(shù)量",
?????????????????????color='orange',figsize=(18,9),fontsize=16,
????????????????????)
fig.axes.title.set_size(22)?#設(shè)置標(biāo)題字體大小
fig.legend(fontsize=16)?#設(shè)置圖例字體大小
fig.set_ylabel('火鍋類型',fontdict={'fontsize':20})?#設(shè)置y軸名稱及字體大小
for?index,?num?in?enumerate(df_type10['數(shù)量']):?#添加數(shù)據(jù)標(biāo)簽
????fig.text(num,?index,s?=?num,?ha?=?'left',?fontsize?=?16)
2.2. 各地區(qū)火鍋分類
以才哥在的海淀區(qū)為例,火鍋類型最多的是川味麻辣,其次是老北京火鍋、串串香和重慶火鍋。不得不說,這些都是我愛吃的。

以下是制作代碼:
df_loc_type?=?pd.pivot_table(df,?values='id',?index='火鍋類型',?columns='地區(qū)',?aggfunc=pd.Series.nunique)
cm?=sns.light_palette("red",?as_cmap=True)
df_loc_type.fillna(0).astype(int).style.background_gradient(cmap=cm)?#創(chuàng)建熱力圖背景(列)
2.3. 各地區(qū)火鍋店數(shù)量
不得不說朝陽區(qū)也太牛了,接近1200家店,占總店的20%+。其次是咱們海淀、昌平這種打工人聚集的地方~
3.北京火鍋店評(píng)分?jǐn)?shù)據(jù)
從大眾點(diǎn)評(píng)上爬取的店鋪數(shù)據(jù)中,我們可以看到評(píng)分相關(guān)的數(shù)據(jù)指標(biāo)有 商家評(píng)分(4.97)、口味、環(huán)境和服務(wù)評(píng)分共5類。
3.1. 評(píng)分直方圖
組合四類評(píng)分繪制疊加直方圖,可以看見基本上各項(xiàng)評(píng)分的分布基本一致,大部分分布在4分以下或者4.5分以上,兩級(jí)分化比較明顯。
以下是繪圖代碼:
#?疊加直方圖
plt.figure(figsize=(16,9))
plt.hist(x?=df['商家評(píng)分'],?color='orange',?bins=?15,?alpha=0.5)?#橙色
plt.hist(x?=df['口味'],?color='red',?bins=?15,?alpha=0.5)?#?紅色
plt.hist(x?=df['環(huán)境'],?color='blue',?bins=?15,?alpha=0.5)?#?藍(lán)色
plt.hist(x?=df['服務(wù)'],?color='white',?bins=?15,?alpha=0.5)?#?白色
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
3.2. 各地區(qū)商家評(píng)分箱線圖
如圖我們可以發(fā)現(xiàn),東城區(qū)、朝陽區(qū)、西城區(qū)和海淀區(qū)是商家評(píng)分較高普遍較高,而密云和延慶等郊區(qū)除了個(gè)別火鍋店評(píng)分較高之外整體普通較低。當(dāng)然,這個(gè)其實(shí)是地理位置影響優(yōu)質(zhì)店鋪選址,從而呈現(xiàn)這種表現(xiàn)。
以下是繪圖代碼:
#?箱線圖-商家評(píng)分
fig?=?df.boxplot(column='商家評(píng)分',by='地區(qū)',?figsize=(18,9),?color?='red',fontsize?=?16)
fig.axes.title.set_size(22)?#設(shè)置標(biāo)題字體大小
fig.set_xlabel('地區(qū)',fontdict={'fontsize':20})?#設(shè)置y軸名稱及字體大小
商家評(píng)分最高前5
3.3. 各地區(qū)口味評(píng)分箱線圖
對(duì)比商家評(píng)分的箱線圖,我們發(fā)現(xiàn)東城區(qū)火鍋店的口味評(píng)分有超過一半以上的店面超過了4.5分,基本上口味好的火鍋店也都在北京的中心城區(qū)。
口味評(píng)分最高前5
3.4. 各地區(qū)環(huán)境評(píng)分箱線圖
環(huán)境評(píng)分整體較好的在東城區(qū)和朝陽區(qū)
環(huán)境評(píng)分最高前5
3.5. 各地區(qū)服務(wù)評(píng)分箱線圖
服務(wù)評(píng)分整體較好的也是在東城區(qū)和朝陽區(qū)
服務(wù)評(píng)分最高前5
3.6. 各地區(qū)各項(xiàng)評(píng)分
我們查看四項(xiàng)評(píng)分之間的散點(diǎn)圖矩陣,各地區(qū)的火鍋店,商家評(píng)分和口味,環(huán)境與服務(wù)關(guān)聯(lián)更強(qiáng)。口味好的一般評(píng)分應(yīng)該不會(huì)太差,環(huán)境好的服務(wù)也一般不錯(cuò)。
以下是繪圖代碼:
#?散點(diǎn)圖矩陣
plt.rcParams["axes.labelsize"]?=?16??#?設(shè)置全局軸標(biāo)簽字體大小
score?=?df[['商家評(píng)分','口味','環(huán)境','服務(wù)','地區(qū)']]
sns.pairplot(score,?hue='地區(qū)',height=3)
4.評(píng)價(jià)數(shù)及人均消費(fèi)
我在大眾點(diǎn)評(píng)找店子的時(shí)候,除了看評(píng)分之外,評(píng)價(jià)數(shù)和人均消費(fèi)也是極其重要的考量。當(dāng)看到評(píng)價(jià)數(shù)極高的時(shí)候,內(nèi)心會(huì)不由的表示驚嘆“哇塞,這么多人寫評(píng)價(jià)啊”;當(dāng)看到人均消費(fèi)極高的時(shí)候,也會(huì)想著啥時(shí)候我也要去吃一次,哈哈~
4.1. 整體評(píng)價(jià)數(shù)分布
先用描述統(tǒng)計(jì)看,發(fā)現(xiàn)評(píng)價(jià)數(shù)最多的有3.2萬個(gè),最少的僅1個(gè),75%的火鍋店評(píng)價(jià)在900以下,更有25%的火鍋店評(píng)價(jià)不到23個(gè)。
In?[1]:df.評(píng)價(jià)數(shù).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:?評(píng)價(jià)數(shù),?dtype:?float64
一定程度上,評(píng)價(jià)數(shù)能反應(yīng)一家店在廣大吃貨中的火爆度,我們發(fā)現(xiàn)最火的前5家有3家來自西城區(qū),海淀區(qū)和東城區(qū)各1家。
以下是2家評(píng)價(jià)數(shù)破3萬的熱門火鍋店~
4.2.人均消費(fèi)情況
一共有人均消費(fèi)數(shù)據(jù)的店鋪4129家,其中均值100元,中位數(shù)也是95元,最高的是1220元(我的天,這是啥火鍋?)。
4.2.1.人均消費(fèi)最貴的都有誰
人均消費(fèi)最貴第1名是一家日韓火鍋,推薦菜基本都是日料類。其次,人均消費(fèi)較高的都是海鮮火鍋一類,你看那些推薦菜都是帝王蟹、澳龍啥的,想吃了,哈哈?。?/span>
以下是2家人均消費(fèi)破千的火鍋店~
4.2.2.人均消費(fèi)分布
大部分的火鍋店人均消費(fèi)低于100元,其次是100-150元區(qū)間。極少數(shù)在200+,雖然能吃的主很容易吃出200+的其實(shí)??!
以下是繪圖代碼:
plt.figure(figsize?=?(12,12))#將畫布設(shè)定為正方形,繪制的餅圖是正圓
plt.rcParams['font.size']=16?#設(shè)置字體大小為16
label?=?df_cost.index.tolist()#定義餅圖的標(biāo)簽
explode?=?[0.01,0.01,0.01,0.01,0.01]#設(shè)定各項(xiàng)距離圓心n個(gè)半徑
values?=?df_cost.數(shù)量.tolist()
plt.pie(values,explode?=?explode,labels?=?label,autopct?=?'%1.1f%%')#餅圖
plt.title('人均消費(fèi)分布',fontdict={'fontsize':20})#標(biāo)題
我們經(jīng)常聽的海底撈火鍋店的人均消費(fèi)大概在130左右。
5.都有哪些連鎖店
一共有349家品牌火鍋有分店。
5.1.火鍋分店前10品牌
果然是哪都有的呷哺呷哺(找了半天發(fā)音)以多大289家分店穩(wěn)居第一!看著這些品牌,基本都是比較常見熟悉的,基本上都吃過來著。
5.2.火鍋分店前10品牌人均消費(fèi)
海底撈 人均消費(fèi) 基本都在120以上,玩兒串串是一家什么店呀,人均基本都低于40,其次就是開了快300家店的呷哺呷哺也是人均消費(fèi)比較合適。
5.3.火鍋分店前10品牌商家評(píng)分
好吧,又是海底撈 評(píng)分表現(xiàn)最佳,可惡的海底撈。不過各家品牌大部分評(píng)分還是都不錯(cuò),在4.25分以上。玩兒串串作為小吃攤位放在這群雄里顯得有點(diǎn)格格不入了,哈哈!
玩兒串串原來是這種,在購(gòu)物中心的美食中心里的偏快餐式的串串兒~
6.爬蟲過程
這里不介紹詳細(xì)的爬蟲過程,詳細(xì)的見后續(xù)推送哈(主要是篇幅有限 寫不完)。
咱們簡(jiǎn)單說說在爬蟲過程中遇到的一些問題及解決方案。
FAQ
①大眾點(diǎn)評(píng)的搜索結(jié)果最多只顯示50頁,如果獲取全部數(shù)據(jù)?
解:搜索有多級(jí)選擇,以北京火鍋為例就是 子分類+地區(qū),我們看到一頁15家店鋪?zhàn)疃?0頁就有750家,加上諸多級(jí)選擇基本可以覆蓋全部店鋪。
②未登錄情況下無法查看下一頁獲取地址規(guī)律
解:直接登錄賬號(hào)然后點(diǎn)擊下一頁查看地址變化規(guī)律唄。
③爬著爬著很快就被封ip了
解:嗯,而且不是說爬慢點(diǎn)就行,我就被封了2個(gè)ip貌似都是封1天以上,最后買了1000個(gè)ip代理,被封了就自動(dòng)換解決。
④部分店鋪信息對(duì)應(yīng)字典為方框無法解析
解:網(wǎng)上有很多這種css字體加密解密的文章,邊看邊學(xué)吧(反正作為菜鳥的我是這么來的)
以下代碼為簡(jiǎn)單的解析 北京火鍋 子分類的腳本
import?re
import?requests
header?=?{
????"Accept-Encoding":?"Gzip",??#?使用gzip壓縮傳輸數(shù)據(jù)讓訪問更快
????"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('([\s\S]*?)',html_beijing)[0]?#獲取地區(qū)的數(shù)據(jù)內(nèi)容
location_name?=?re.findall('data-click-title="(.*?)"',?location_html)?#獲取地區(qū)名稱列表
location_id?=?re.findall(',location_html)?#獲取地區(qū)編號(hào)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('([\s\S]*?)',html_huoguo)[0]?#獲取火鍋類型的數(shù)據(jù)內(nèi)容
type_name?=?re.findall('(.*?)',?type_html)?#獲取火鍋類型名稱列表
type_name?=?type_name[1:]?#第一個(gè)是不限,需要去掉
type_id?=?re.findall('data-cat-id="(.*?)"',type_html)?#獲取火鍋類型id
dic_type?=?dict(zip(type_name,type_id))?#組合成字典備用
7.如何獲取代碼
免責(zé)聲明: 那個(gè),咱們爬蟲僅用于簡(jiǎn)單交流,切勿用做任何商業(yè)用途
推薦閱讀:
入門:?最全的零基礎(chǔ)學(xué)Python的問題? |?零基礎(chǔ)學(xué)了8個(gè)月的Python??|?實(shí)戰(zhàn)項(xiàng)目?|學(xué)Python就是這條捷徑
量化:?定投基金到底能賺多少錢?? |?我用Python對(duì)去年800只基金的數(shù)據(jù)分析??
干貨:爬取豆瓣短評(píng),電影《后來的我們》?|?38年NBA最佳球員分析?|? ?從萬眾期待到口碑撲街!唐探3令人失望? |?笑看新倚天屠龍記?|?燈謎答題王?|用Python做個(gè)海量小姐姐素描圖?|碟中諜這么火,我用機(jī)器學(xué)習(xí)做個(gè)迷你推薦系統(tǒng)電影
趣味:彈球游戲? |?九宮格? |?漂亮的花?|?兩百行Python《天天酷跑》游戲!
AI:?會(huì)做詩的機(jī)器人?|?給圖片上色?|?預(yù)測(cè)收入?|?碟中諜這么火,我用機(jī)器學(xué)習(xí)做個(gè)迷你推薦系統(tǒng)電影
小工具:?Pdf轉(zhuǎn)Word,輕松搞定表格和水??!?|?一鍵把html網(wǎng)頁保存為pdf!|??再見PDF提取收費(fèi)!?|?用90行代碼打造最強(qiáng)PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換?|?制作一款釘釘?shù)蛢r(jià)機(jī)票提示器!?|60行代碼做了一個(gè)語音壁紙切換器天天看小姐姐!|
年度爆款文案
2).學(xué)Python真香!我用100行代碼做了個(gè)網(wǎng)站,幫人PS旅行圖片,賺個(gè)雞腿吃
9).發(fā)現(xiàn)一個(gè)舔狗福利!這個(gè)Python爬蟲神器太爽了,自動(dòng)下載妹子圖片
點(diǎn)閱讀原文,看Python全套!


