爬蟲大眾點評—杭州美食圈

最近接觸了解了一點關於爬蟲的知識,然後就想著實踐一下,考慮自己來杭州也有一年多了,但是也沒怎麼逛吃逛吃,所以這次就想著把杭州的美食爬一遍,說不定能找到幾家自己喜歡吃的呢,那爬哪呢——大眾點評唄。

一、爬蟲

先說一下爬大眾點評遇到的一些坑吧:

1、當你打開大眾點評的網頁進入杭州美食之後就發現一頁頁店鋪的信息,顯示有50頁,但是實際上是遠不止50頁的,我第一次爬的時候還單純的在想這麼大的杭州怎麼只有750家店鋪上了大眾點評,所以要想法子獲取更多的頁面鏈接

2、第一次爬下750家店鋪的數據時發現總是會少2條左右的數據,而且抽取幾家店鋪核對數據發現數據對不上,這就尷尬了,說明爬取的過程出了問題,比如我要的數據是店名、菜系、區劃分、地址、評論條數、評級、服務評分、環境評分、口味評分、人均價格,但是並不是所有的店家都有這個數據的,甲店鋪可能沒有人均價格,乙店鋪可能沒有服務評分的內容,那麼在爬取的過程中就會用後面店鋪的數據來填補,導致數據錯亂,所以怎麼辦呢?換個思路重新寫咯

3、在觀察店鋪的信息的時候發現還有暫停營業和尚未營業的標籤,所以這個還要區分,要不然後面的分析半天還不知道這家店鋪是不是在營業就尷尬了

把這些坑理順規避之後就開始爬蟲,整體思路也比較簡單:

1、構建爬取的鏈接,上面說到大眾點評最多只顯示50頁,所以你要獲得更多的鏈接,我的做法是通過設置人均價格的區間來循環,然後拼接字元串生成鏈接

2、解析網頁鏈接

3、提取所需的店鋪信息

4、寫入本地文件(因為還要拿這些數據來分析)

最後的過程還是比較順利的,拿到了6393條完整的數據

這裡說明一下我在設置人均價格的時候最低設置的是50,其實50以下的還有很多店鋪,甚至比50以上的還要多,但是考慮這些店鋪裡面大部分都是小吃快餐、麵包甜點、水果飲料之類的,所以對這部分數據進行了捨去,最終的核心代碼如下:

infos = soup.select("#shop-all-list > ul > li > div.txt") #獲取商鋪列表n for info in infos:n yield {n 店名: info.h4.get_text(),n 是否營業: info.find(class_="istopTrade").string if info.find(class_="istopTrade") else None,n 評級: info.find(name=div, attrs={class: comment}).span.get(title),n 評論: info.find(name=div, attrs={class: comment}).a.get_text().strip()[:5],n 均價: info.find(name=a, attrs={class:mean-price, target: _blank}).b.get_text(),n 口味: info.select(.comment-list b)[0].string if info.select(.comment-list b) else None,n 環境: info.select(.comment-list b)[1].string if info.select(.comment-list b) else None,n 服務: info.select(.comment-list b)[2].string if info.select(.comment-list b) else None,n 菜系: info.find(class_="tag").string if info.find(class_="tag") else None,n 區劃分: info.select(.tag-addr a)[1].string if info.select(.tag-addr a) else None,n 地址: info.find(class_="addr").get_text() if info.find(class_="addr") else None,n }n

得到最終的數據如下:

現在有了數據就來分析看看有沒有什麼比較好玩的。

二、可視化分析

備註:所有圖都是用tableau完成的

1、店鋪的營業情況

尚未營業和暫停營業的比例很低,加起來一共280家店鋪左右

正在營業的店鋪佔比高達95.65%

接下來的分析都是基於正在營業的店鋪進行的

2、菜系的分布

備註:圈越大表示店鋪數越多

從圖中可以明顯的發現杭州的店鋪中杭幫/江浙菜的數量最多,遠遠多於其他的菜系,其次是火鍋。八大菜系的川湘粵三類的店鋪數量是比較多的,如果是喜歡其他四個菜系口味的可能就需要自己去發掘了。對於喜愛國外菜品的顧客來說可選擇的種類的還是比較多的,西餐、日本料理、韓國料理、東南亞菜的店鋪數量也是比較多的,對於喜歡吃宵夜燒烤和小龍蝦的顧客來說杭州的選擇也是很多的,當然也還有一些比較小眾的,比如台灣菜、西北菜,由於店鋪數量較少就沒在圖上顯示菜系名。

3、評級分布

准四星和四星的商戶佔據了近70%的比例,絕大部分的用戶都是在這個級別的。五星商戶只有177家,佔比僅為2.8%,說明顧客的各方面要求還是比較高的,如果五星的選擇相對較少,那准五星的選擇還是比較多的,有639家商戶。最下面還有26家慘不忍睹的二星商戶,不知道這26家商戶現在每天的生意怎麼樣了。

4、人均消費分布

這個應該也是大家比較關心的,從圖中可以看出這些店鋪的價格還是比較親民的,三分之二的商戶的消費都是在50-99元之間,當然如果你想吃點好的,在100-149之間可選擇的也是很多的,再往上的話可能選擇就少了很多,如果你是要和對象約會呢,或者請比較重要的朋友吃飯那就需要好好的選一選了,最後對於人均消費500以上的那30家店,我就看看吧。

5、商圈店鋪情況

把大眾點評的數據爬下來之後發現杭州居然有這麼多商圈,不過稍微觀察一下就發現這裡面包括了千島湖、桐廬、淳安、青山一些縣的商戶信息,商戶數量最多的十個商圈依次是:下沙、龍井/虎跑、開發區/高教園、千島湖風景區、餘杭區、高新文教區、西湖北線/黃龍、湖濱、臨平、古墩路沿線。

6、top10商戶對比分析

備註:這裡的top10商戶數量可能比實際的要少一到兩家,因為有的商家的人均消費低於50就不會被我爬取到

門店數top商戶依次是:必勝客、兩岸咖啡、樓外樓、外婆家、胖哥兩肉蟹煲、澳門豆撈、弄堂里、新白鹿、扇貝王、老頭兒油爆蝦(其中剔除了零零食和元祖食品)

必勝客排名第一可以理解,畢竟隨便一個商場基本上都會有的,至於為什麼沒有麥當勞和肯德基呢,因為他們的人均消費不到50,所以最終的數據是不包括他倆的。第二的兩岸咖啡不了解,也沒怎麼聽周邊的小夥伴說過,至於其他的七家店基本上都是杭州知名度很高的。十家店裡面樓外樓的人均消費一枝獨秀,緊隨其後的是澳門豆撈和扇貝王,另外的七家店的人均消費還是很親民的。評論數這一項杭州的三大土著飯店新白鹿、外婆家、弄堂里是遙遙領先,其他的店基本上就跟在後面跑就行了。

再來看看這十家店用戶的評分情況:口味最好的是胖哥倆和油爆蝦,最差的是新浪有約扇貝王和樓外樓,不做評價,自己喜歡的才是最好的;服務這一項得分最高的是胖哥倆、油爆蝦和新白鹿,最差的是扇貝王,都沒去過,不做評價;環境最好的是肉蟹煲和新白鹿,最差的是新浪有約扇貝王,也都沒去過不做評價。對於這些店多多少少可能存在刷評論的情況,其實可以通過爬取用戶的評論打分再來進一步的詳細分析一下,但是在我第一次測試成功爬取用戶的評論之後,大眾點評把我的IP封了,由於暫時沒空來處理這個問題,所以這一項分析就沒進行,等後面有空了再來處理,對於大眾點評我只想說一句話:我還會回來的

7、菜系對比分析

這裡選取了11個菜系來做對比分析的,本來是選商戶數量top10,但是第11是小龍蝦,所以也放進來做分析了。

人均消費top3菜系分別是日本料理、西餐、海鮮,其他的8個菜系的人均消費還是較低的,而在口味、服務、環境三項的評分中日本料理都是遙遙領先的,在杭州隨便選擇一家日料店的話基本上都是會讓你滿意而歸的,當然如果真的運氣比較差選了一家這個菜系裡面評分最低的那也是點背了,三項數據裡面評分低的明顯的是小吃快餐,都是不及格的分數,慘不忍睹啊,商戶數量最多的杭幫/江浙菜的三項評分也不是很高,排在中等靠後的水平,特意加上的小龍蝦怎麼樣呢?三項得分跟其他10個菜系做對比也只是處於中等的水平,最重要的口味的得分也不是很高,所以每個菜系裡面要找到最好吃最合適的店鋪還是需要你耐心的去發現的。

8、商圈對比分析

商圈數量較多,此處選擇一些比較常見的來對比分析

人均消費最高的商圈是龍井/虎跑,畢竟是在西湖景區裡面,其次是錢江新城,對於錢江新城我只有一個印象:土豪聚集地,人均消費超過一百的商圈有西湖北線/黃龍、湖濱、鳳起路沿線、星光大道、西溪、城戰火車站、城西銀泰、湖墅南路,大部分都是離西湖風景區比價近的,或者就是一個區比較集中的商業圈,比如城西銀泰、西溪、星光大道。如果你是第一次到杭州玩,在西湖邊逛累了就可以就近選擇鳳起路沿線和湖濱的店鋪吃頓飯,基本上都是會讓你滿意的,如果是在城西的話,城西銀泰也是一個不錯的選擇。另外來說一下千島湖風景區,人均消費還是比較親民的,但是三項的評分有點低,當然千島湖景區是有一些不錯的五星商戶,評分也比較高,但是更多的是一些得分較低的商戶拉低了整個商圈的的評分,所以如果去玩的話對於吃飯這一項還需要仔細選擇。

9、五星商戶對比分析

出去吃飯的話肯定希望能吃到一頓好吃滿意的飯菜,那麼這些五星的商戶就是你的首選了,如果想低消費的話那韓國料理、農家菜裡面的選擇還是可以的,如果你的預算再提高一點,那麼火鍋海鮮的選擇也是比較多的,火鍋類別中海底撈有6家店,撈王鍋物料理有5家店。這裡對西餐說明一下,西餐裡面有14家必勝客,而必勝客的人均消費是70元,所以拉低了整體的人均消費,實際上五星的西餐的消費是遠遠高於人均169的。人均消費200以上的話日料就是一個不錯的選擇了,在這34家店中御牛道日式料理炭火烤肉有6家店都是五星,而且人均消費只有150元左右,性價比還是不錯的。

10、五星商戶地圖分布

這一步真的很麻煩,首先從大眾點評上爬取到的數據都是商戶的地址,而且他們的地址寫的也不是都很規範,要把這些地址轉化為經緯度才行,技術上自己解決不了只能網上百度咯,找到了一個轉化的軟體,成功識別轉化率還是不錯的,但是6393家還是有難度,於是我就偷懶把五星商鋪篩選出來然後投放到地圖上,看著最後的結果還是比較滿意的,雖然沒有6393家那麼壯觀了。這裡有一點需要說明就是tableau上面杭州的道路圖和實際的位置是有一點偏差的,大概是往東偏北10度的方向移動了一小段距離,所以在圖裡你會看見錢江新城的五星商鋪和道路都跑到錢塘江裡面去了。這裡只是做一個可視化就不細究了,從圖中也可以看出五星商鋪主要還是集中在西湖附近的一些商業中心地段。

11、推薦

逛了一圈,那麼最終有哪些店可以推薦呢?

人均消費50-99:

1)杭幫/江浙菜:聚一閣桐廬農家菜,解放路89-5號,綜合評分:27.10

2)火鍋:落端雲串串香,黃姑山路38-2號,綜合評分:27.40

3)日本料理:月瀧軒(萬達店),祥泰街萬達金街東區一樓商鋪3-2-139號,綜合評分:27.30

4)韓國料理:晌熏歐巴年糕(和達城店),經濟開發區2號大街與5號交叉口和達城4層,綜合評分:27.90

5)海鮮:蒸小鮮(西溪新座店),西溪路550號西溪新座7幢一層,綜合評分:27.20

6)川菜:魚躍青春,文一路128號-1,綜合評分:27.40

7)小龍蝦:蝦匠龍蝦,錢塘之星2幢122商鋪,綜合評分:27.10

8)西餐:SAN CASTLE城堡西餐廳,艮山西路102創意設計中心A-126,綜合評分:27.50

人均消費100-199:

1)杭幫/江浙菜:梅子青酒店·綠如藍餐廳,湖州街599號天邑國際2幢,綜合評分:27.10

2)火鍋:辣哆哆美蛙魚頭火鍋,慶春路235號2樓,綜合評分:27.60

3)日本料理:漁竹精緻料理,中山北路145號,綜合評分:27.40

4)東南亞菜:Thai Square 泰渡泰國料理,教工路26世貿麗晶城歐美中心D座二樓,綜合評分:27.00

5)海鮮:臻貨(西湖店),保俶路2號,綜合評分:27.10

6)小龍蝦:黃尚煌小龍蝦.面,武林路277號皇后公園內,綜合評分:27.20

7)西餐:雅覓餐廳酒吧(Yummy),環城東路23-1號一樓,綜合評分:27.60

人均消費200以上:

1)杭幫/江浙菜:天倫里餐廳,西溪路550號西溪新座7號樓1樓東邊,綜合評分:27.20

2)火鍋:錢席海鮮火鍋(五星路店),錢江新城五星路198號瑞晶國際大廈35樓,綜合評分:27.20

3)日本料理:江戶前壽司(黃龍店),曙光路49號黃龍飯店對面,綜合評分:27.20

4)燒烤:宜之蘭燒肉,景曇路9號501城市廣場5F-04,綜合評分:27.40

5)西餐:mamala 西餐廳,通益路111號LOFT49藝術倉庫12號,綜合評分:27.60

以上推薦的店鋪都是基於數據分析的,不夾雜個人的感情色彩和口味(說的好像我有錢去吃似的),所以最終的好不好吃還是需要你自己實地去品嘗一番。

希望對你有幫助,來杭州吃的開心玩的開心!

推薦閱讀:

國內在線圖表工具,你能說出幾個?
文本分析及可視化
中國的獨角獸和那些聰明的投資者
怎樣分析烘焙店客戶滿意度數據,怎樣撰寫研究報告?
作為一個Pythoner,不會SQLAlchemy都不好意思跟同行打招呼!

TAG:Python | 数据分析 | 爬虫 |