1. 程式人生 > >6000+個景點資料視覺化,國慶出遊避免擁擠,這一篇就夠了

6000+個景點資料視覺化,國慶出遊避免擁擠,這一篇就夠了

歡迎關注天善智慧,我們是專注於商業智慧BI,人工智慧AI,大資料分析與挖掘領域的垂直社群,學習,問答、求職一站式搞定!

對商業智慧BI、大資料分析挖掘、機器學習,python,R等資料領域感興趣的同學加微信:tsaiedu,並註明訊息來源,邀請你進入資料愛好者交流群,資料愛好者們都在這兒。

作者:胡蘿蔔醬
公眾號:經管人學資料分析

國慶7天長假,就問你們激不激動!

可是,出門遊玩,走哪裡都是人,人,人,人……。你的腦海裡是否出現了以下畫面:

3901436-a872d31bb0e4a249 image 3901436-b0737bdb85e4e2fd image 3901436-afacab97a17e745c image

為了方便大家的出遊選擇,小編爬取了去哪兒網上面的6000多個景點資料,包含景點評級、熱度、銷量等等資料,彙總成這篇出遊參考指南。

爬蟲

爬蟲繼續用的是胡蘿蔔醬最近的心頭愛selenium,用法可以參考爬蟲神器selenium之貓眼電影榜單例項。開啟去哪兒網站,右鍵,分析網頁。

3901436-ae9fd2b0de23c96c.gif image.gif

我們需要的資料非常的清晰:

3901436-2fb38737307e7f13.gif image.gif

話不多說,只要定位到自己想要的資訊,那麼程式碼非常簡單。

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box; word-wrap: break-word !important; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: 0.544000029563904px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; font-size: 16px; color: rgb(62, 62, 62); line-height: inherit; background-color: rgb(255, 255, 255);">

1from tqdm import tqdm
2import time
3from selenium import webdriver
4from selenium.common.exceptions import TimeoutException, WebDriverException
5import pandas as pd
6import numpy as np
7position = ["北京","天津","上海","重慶","河北","山西","遼寧","吉林","黑龍江","江蘇","浙江","安徽","福建","江西","山東","河南","湖北","湖南","廣東","海南","四川","貴州","雲南","陝西","甘肅","青海","臺灣","內蒙古","廣西","西藏","寧夏","新疆","香港","澳門"]
8
9name,level,hot,address,num=[],[],[],[],[]
10def get_one_page(key,page):
11 try:
12 #開啟瀏覽器視窗
13 option_chrome = webdriver.ChromeOptions()
14 option_chrome.add_argument('--headless')
15
16 driver = webdriver.Chrome(chrome_options=option_chrome)
17 time.sleep(1)
18
19 url = "

http://piao.qunar.com/ticket/list.htm?keyword="+str(key)+"&region=&from=mpl_search_suggest&page="+str(page)
20 driver.get(url)
21 infor = driver.find_elements_by_class_name("sight_item")
22 for i in range(len(infor)):
23 #獲取景點名字
24 name.append(infor[i].find_element_by_class_name("name").text)
25 #獲取景點評級
26 try:
27 level.append(infor[i].find_element_by_class_name("level").text)
28 except:
29 level.append("")
30 #獲取景點熱度
31 hot.append(infor[i].find_element_by_class_name("product_star_level").text[3:])
32 #獲取景點地址
33 address.append(infor[i].find_element_by_class_name("area").text)
34 #獲取景點銷量
35 try:
36 num.append(infor[i].find_element_by_class_name("hot_num").text)
37 except:
38 num.append(0)
39
40 driver.quit()
41 return
42 except TimeoutException or WebDriverException:
43 return get_one_page()
44
45for key in tqdm(position):
46 print ("正在爬取{}".format(key))
47 #取前10頁
48 for page in range(1,14):
49 print ("正在爬取第{}頁".format(page))
50 get_one_page(key,page)
51
52sight = {'name': name, 'level': level, 'hot': hot, 'address': address, 'num':num}
53sight = pd.DataFrame(sight, columns=['name', 'level', 'hot', 'address', 'num'])
54sight.to_csv("sight.csv",encoding="utf_8_sig")

</pre>

本文僅爬取國內的資料,由於景點資料眾多,每個省份僅取了前13頁。獲得景點個數6630個。

資料視覺化

熱門景區top30:

3901436-e173ec4a49b662de.gif image.gif

大熊貓不愧為國寶,最熱門就是它。其次是故宮,鄭州動物園,峨眉山,秦始皇兵馬俑等等。因為小編沒有去過多少地方玩,也不知道為啥鄭州動物園能排到第三,大家知道的可以告訴小編一下它的特色嗎?

省份與評級:

3901436-571b8ef5545af9d5.gif image.gif 說實話,這個圖的配色真的是太醜了,主要是小編過於懶惰,不想好好配色了 3901436-ef70c6a2ec4b3701.gif image.gif

熱力圖:

熱力圖根據省份和城市分別作圖,其次在根據銷量和熱度兩類圖,這裡採用的是Python呼叫高德地圖API實現經緯度換算、地圖視覺化一文的方式,呼叫高德地圖API完成。

首先是省份和景區熱度:

3901436-860118c0d5fd932f.gif image.gif

然後是省份和銷量:

3901436-296cc913734669e5 image

接下來是城市和景區熱度:

3901436-6baf8a082afdbe69 image

最後是城市和景區銷量:

3901436-4ebba4af91f2bf7b image

值得注意的是,城市和銷量一圖熱力範圍不明顯,原因為景區之間銷量天差地別,一些太少的的統計下來,作圖非常的不明顯了。若大家不喜歡用高德地圖API作圖,那麼人生苦短,我要用pyecharts畫圖的方法也非常適合做熱力圖,比如這裡小編做了一張省份和銷量的圖:

3901436-a76297da8f4e6575 image

綜合來看,北京,四川,沿海等地都是旅遊的熱門省份。建議大家儘量避免去這些省份遊玩。

推薦景區:

知道了需要避免的景區和省份城市,那麼可以去哪些人少的地方呢?這裡胡蘿蔔醬根據景區分級,分別推薦15個人少的景區:

3901436-2b83171d6e3a71b7 image 3901436-d5b23db4d8fcbcb0 image 3901436-c44dba958eb5ba4f image

最後兩張圖是根據熱度做的圖,沒有條形的則是熱度為0,那麼大家可以選擇上述景點中熱度較高的進行遊玩。

視覺化程式碼:

<pre style="margin: 0px; padding: 0px; max-width: 100%; box-sizing: border-box; word-wrap: break-word !important; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: 0.544000029563904px; orphans: auto; text-align: justify; text-indent: 0px; text-transform: none; widows: 1; word-spacing: 0px; -webkit-text-stroke-width: 0px; font-size: 16px; color: rgb(62, 62, 62); line-height: inherit; background-color: rgb(255, 255, 255);">

1data = pd.read_csv("sight.csv")
2data = data.fillna(0)
3data = data.drop(columns=['Unnamed: 0'])
4
5#將地址分為省,市,區
6data["address"] = data["address"].apply(lambda x: x.replace("[","").replace("]",""))
7data["province"] = data["address"].apply(lambda x: x.split("·")[0])
8data["city"] = data["address"].apply(lambda x: x.split("·")[1])
9data["area"] = data["address"].apply(lambda x: x.split("·")[-1])
10
11#銷量最多的前30景點
12num_top = data.sort_values(by = 'num',axis = 0,ascending = False).reset_index(drop=True)
13import seaborn as sns
14import matplotlib.pyplot as plt
15plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']#指定預設字型
16plt.rcParams['axes.unicode_minus'] =False # 解決儲存影象是負號'-'顯示為方塊的問題
17sns.set(font='SimHei') # 解決Seaborn中文顯示問題
18sns.set_context("talk")
19fig = plt.figure(figsize=(15,10))
20sns.barplot(num_top["name"][:30],num_top["num"][:30])
21plt.xticks(rotation=90)
22fig.show()
23
24#省份與景區評級
25data["level_sum"] =1
26var = data.groupby(['province', 'level']).level_sum.sum()
27var.unstack().plot(kind='bar',figsize=(35,10), stacked=False, color=['red', 'blue','green','yellow'])
28
29#根據省、市統計銷量和
30pro_num = data.groupby(['province']).agg('sum').reset_index()
31city_num = data.groupby(['city']).agg('sum').reset_index()
32#基於資料做熱力圖
33import requests
34def transform(geo):
35 key = 'bb9a4fae3390081abfcb10bc7ed307a6'
36 url="http://restapi.amap.com/v3/geocode/geo?key=" +str(key) +"&address=" + str(geo)
37 response = requests.get(url)
38 if response.status_code == 200:
39 answer = response.json()
40 try:
41 loc = answer['geocodes'][0]['location']
42 except:
43 loc = 0
44 return loc
45
46pro_num["lati"] = pro_num["province"].apply(lambda x: transform(x))
47city_num["lati"] = city_num["city"].apply(lambda x: transform(x))
48pro_num.to_csv("pro_num.csv",encoding="utf_8_sig")
49city_num.to_csv("city_num.csv",encoding="utf_8_sig")
50
51from pyecharts import Map
52map=Map("省份景點銷量熱力圖", title_color="#fff", title_pos="center", width=1200, height=600, background_color='#404a59')
53map.add("",pro_num["province"], pro_num["num"], maptype="china", visual_range=[5000, 80000], is_visualmap=True, visual_text_color='#000', is_label_show=True)
54map.render(path="pro_num.html")
55map=Map("省份景點熱度熱力圖", title_color="#fff", title_pos="center", width=1200, height=600, background_color='#404a59')
56map.add("",pro_num["province"], pro_num["hot"], maptype="china", visual_range=[25,80], is_visualmap=True, visual_text_color='#000', is_label_show=True)
57map.render(path="pro_hot.html")
58
59#人少的5A景點,4A景點,3A景點
60top_5A = data[data["level"] == "5A景區"].sort_values(by = 'num',axis = 0,ascending = True).reset_index(drop=True)
61top_4A = data[data["level"] == "4A景區"].sort_values(by = 'num',axis = 0,ascending = True).reset_index(drop=True)
62top_3A = data[data["level"] == "3A景區"].sort_values(by = 'num',axis = 0,ascending = True).reset_index(drop=True)
63fig = plt.figure(figsize=(15,15))
64plt.pie(top_5A["num"][:15],labels=top_5A["name"][:15],autopct='%1.2f%%')
65plt.title("人少的5A景區")
66plt.show()
67fig = plt.figure(figsize=(15,15))
68ax = sns.barplot(top_4A["hot"][:15],top_4A["name"][:15])
69ax.set_title("人少的4A景區")
70fig.show()
71fig = plt.figure(figsize=(15,10))
72ax = sns.barplot(top_3A["name"][:15],top_3A["hot"][:15])
73ax.set_title("人少的3A景區")
74plt.xticks(rotation=90)
75fig.show()

</pre>

結語

爬蟲採集與2018.9.27,可能因為採集時間不同,結果會有偏差。需要注意的是,若採用pyecharts做城市和景區熱度、銷量的圖時,需要考慮pyecharts無法獲得一些景區位置,解決辦法可以參考《狄仁傑之四大天王》影評分析(爬蟲+詞雲+熱力圖)一文。

分析完了之後,胡蘿蔔醬反正決定國慶節都呆在家裡了,不想出門,只想當快樂的肥仔。最後,祝大家國慶快樂!!!

[圖片上傳失敗...(image-60dc5b-1539151567608)]

Python愛好者社群歷史文章大合集

3901436-e3c414879b92df8e image

福利:文末掃碼立刻關注公眾號,“Python愛好者社群”,開始學習Python課程:

關注後在公眾號內回覆課程即可獲取:

小編的Python入門免費視訊課程****!!!

【最新免費微課】小編的Python快速上手matplotlib視覺化庫!!!

崔老師爬蟲實戰案例免費學習視訊。

陳老師資料分析報告製作免費學習視訊。

玩轉大資料分析!Spark2.X+Python 精華實戰課程免費學習視訊。

3901436-483828a921330817 image