全國41611個景點,程序員用Python告訴你哪些地方最值得一游!
經常聽到別人說「世界那麼大,我想去看看」。在有機會走出國門之前,還是先把祖國走一圈吧。都知道中國地廣人不稀,旅遊資源非常豐富,古文化遺址、抗戰遺址、山川、河流等等,在選擇目的地的時候,不少人都會非常糾結,不知道去哪更好。為了以後不再糾結,筆者打算深度解析全國的旅遊景點分布。
以下進入正題。
1.數據抓取
去哪兒網有著非常豐富的旅遊信息,不但幾乎涵蓋了全國所有景點,而且使用去哪兒網購買景區門票的人也非常多,所以筆者將爬取去哪兒網全國 32 個省市的所有景點數據。(沒有抓取香港和澳門的數據,這邊的景點並沒有分 5A、4A)
去哪兒網的門票服務中暫時還沒有開通 API 服務,所以只能對網頁解析爬取。要抓取的數據有:景點名、景區等級、地點、景區簡述、價格、銷量以及熱度。
將需要的數據進行定位,一層一層解析,就可以把所需的全部內容抓取下來了。但並不是每一個景點的信息都是全的,所以筆者加了一個 try/except 進去,雖然代碼有變長,但是整個程序變得更加健壯。最終,一共抓取了 41611 條景點信息。
for i in s:
inf = {}
try:
inf["level"] = i.find("span", class_="level").text[0]
except Exception as e:
inf["level"] = "0"
try:
inf["price"] = i.find("span", class_="sight_item_price").find("em").text
except Exception as e:
inf["price"] = ""
try:
inf["name"] = i.find("a", class_="name").text
except Exception as e:
inf["name"] = ""
try:
inf["num"] = i.find("span", class_="hot_num").text
except Exception as e:
inf["num"] = ""
try:
inf["add_pro"] = i.find("span", class_="area").find("a").text.split("·")[0]
inf["add_city"] = i.find("span", class_="area").find("a").text.split("·")[1]
except Exception as e:
inf["add_pro"] = i.find("span", class_="area").find("a").text
inf["add_city"] = i.find("span", class_="area").find("a").text
try:
inf["hot"] = i.find("span", class_="product_star_level").find("em").get("title").split(":")[1]
except Exception as e:
inf["hot"] = ""
try:
inf["descri"] = i.find("div", class_="intro color999").text
except Exception as e:
inf["descri"] = ""
2.數據分析
5A 級景區
上圖為 5A 景區的銷量排行,可以看出秦始皇兵馬俑遙遙領先,是第二名長隆歡樂世界的 5/3 倍。讓筆者沒有想到的是歡樂谷遊樂園等在前二十名中佔了六個席位,所以對於那些想發展旅遊業但是沒有美麗風景或者歷史古迹的城市而言,大力發展遊樂園行業是一個不錯的選擇。廣州長隆就是一個鮮活的例子。
江蘇省是全國 5A 級景區最多的一個省,有 41 個之多;其次是浙江省和廣東省有 21 個。總體而言,東部地區的 5A 景區數量是遠高於西部的,雖然西部的美景非常多,但是整體經濟不行,對景區的開發力度不夠,拉了不少後退。
如果大家想去人少景美的地方,可以參考上圖。比如武漢的東湖磨山、紅旗渠、野三坡等等(其實筆者都沒有聽過。)雖然它們的銷量低,但好歹也是 AAAAA 級風景區。
def huati(name,num,k):
kk=[]
for i in range(len(name)):
if not numpy.isnan(num[i]):
q = []
q.append(name[i])
q.append(num[i])
kk.append(q)
hh=sorted(kk,key=lambda i:i[1],reverse=True)
page=Page()
att,val=[],[]
for i in hh[:20]:
att.append(i[0])
val.append(i[1])
bar1 = Bar("", k+"A景區銷量排行", title_pos="center", width=1200, height=600)
bar1.add("",att,val, is_visualmap=True, visual_text_color="#fff", mark_point=["average"],
mark_line=["average"],
is_more_utils=True, is_label_show=True, is_datazoom_show=True, xaxis_rotate=45)
page.add_chart(bar1)
att, val = [], []
for i in hh[-20:]:
att.append(i[0])
val.append(i[1])
bar2 = Bar("", k+"A景區銷量排行", title_pos="center", width=1200, height=600)
bar2.add("", att, val, is_visualmap=True, visual_text_color="#fff", mark_point=["average"],
mark_line=["average"],
is_more_utils=True, is_label_show=True, is_datazoom_show=True, xaxis_rotate=45)
page.add_chart(bar2)
page.render(k+"A景區銷量bar.html")
def sum_pro(pro,k):#每個省有多少個景點
p=[]
c=[]
for i in set(pro):
"""
q={}
q[i]=pro.count(i)
p.append(q)"""
p.append(i)
c.append(pro.count(i))
map= Map("各省"+k+"A景點分布", width=1200, height=600)
map.add("", p,c, is_visualmap=True, visual_range=[min(c), max(c)],
visual_text_color="#000", is_map_symbol_show=True, is_label_show=True)
map.render( "各省"+k+"A景點分布.html")
4A 景區
在 4A 景區里,成都熊貓基地的銷量是最高的,大熊貓最為國寶,這吸引力真是杠杠的。和 5A 景區一樣,歡樂谷遊樂園等佔了四成,我想這也是南京雖然是六朝古都,又是中華民國的首都,可是景區無論銷量還是人氣都不高的原因吧,希望在南京可以多造幾個大型遊樂園!
在上圖中可以看到山東省是 4A 景區最多的省,有 167 個之多。而浙江省、江蘇省、廣東省、河北省、四川省、安徽省的 4A 景區數量均超過了 100。4A 景區最少的省是西藏,只有 6 個。
3A 景區
3A 景區銷量最高的是竹林長壽山景區,但也只有 1326,在 4A 景區的中上游。
山東省的 3A 景區數量全國第一,高達 211 個,而河南省、安徽省、遼寧省、黑龍江省、新疆省 3A 景區均在 100 個以上。
綜合對比
從各等級景區人氣值可以看出,人氣值為 1 的 5A 景區佔了將近三成,而 4A 和 3A 景區連一成都沒有;相反,人氣值為 0 的 3A 景區差不多有六成,看來這個 3A 景區不是一點點水呢?5A 景區也並非每一個都稱得上 5A 這個名號,不然也不會有近兩成人氣值為 0。
def hottt(fivhot,fouhot,thrhot):
fiv, fou, th = [], [], []
atts = ["0", "0.7", "0.8", "0.9", "1"]
for i in zip(fivhot,fouhot,thrhot):
fiv.append(round(i[0], 1))
fou.append(round(i[1], 1))
th.append(round(i[2], 1))
levels = ["5A", "4A", "3A"]
data = {}
data["att"] = atts
data["5A"], data["4A"], data["3A"] = [], [], []
for i in range(len(atts)):
data["5A"].append(round(fiv.count(float(atts[i])) / len(fiv) * 100, 3))
data["4A"].append(round(fou.count(float(atts[i])) / len(fou) * 100, 3))
data["3A"].append(round(th.count(float(atts[i])) / len(th) * 100, 3))
print(data)
output_file("bars.html") # 輸出文件名
x = [(att, level) for att in atts for level in levels]
counts = sum(zip(data["5A"], data["4A"], data["3A"]), ())
source = ColumnDataSource(data=dict(x=x, counts=counts))
p = figure(x_range=FactorRange(*x), plot_height=250, title="各等級景區人氣值佔比",
toolbar_location=None, tools="")
p.vbar(x="x", top="counts", width=0.9, source=source)
show(p)
從各級景點的箱型圖可以看出,5A 景區人氣值是遙遙領先的,整體在 0.7 以上。4A 景區人氣均值中位數在 0.7 左右,不過高於 0.7 的景區實在太少了。3A 景區就更不用說,整體人氣值非常低。
從景區銷量箱型圖可以看到:5A 景區的銷量是遠超過了 4A 和 3A 景區,5A 景區的 3/4 分為點達到了 400,而 4A 景區的僅為 82;而 4A 景區的箱型圖和 3A 的非常類似;看來大家對 4A 景區和對 3A 景區興趣都一致的不大。
def box(q,w,e,l):
a = go.Box(y=q, name="5A景區")
b = go.Box(y=w, name="4A景區")
c = go.Box(y=e, name="3A景區")
g = go.Box(y=l, name="所有景區")
data = [a, b, c,g]
layout = go.Layout(legend=dict(font=dict(size=16)), orientation=270)
fig = go.Figure(data=data, layout=layout)
plotly.offline.plot(data)
將所有景點的概述用 R 生成了一個詞雲圖:位於,文化,休閑,旅遊,體驗,景區,公園,歷史,娛樂等等這些詞是不是很熟悉呢。看來商家對景區的概括都差不多。
對比完各級景點,下面來給各位看官排排雷。
上圖是 4A 級景區銷量排名的最後 20 位,全中國有 2193 個 4A 級景區,這 20 個還排在最後,在對比一下大家對 4A 級景區的人氣評分,想想還是不要去了。
首先,如果說 3A 級景區不太推薦大家去遊玩,因為人氣值實在低的可怕;那上面列出的這 20 個景點那就是完全不建議遊玩了。全國一共 1933 個 AAA 級景區,這 20 個排在最後,可想而知去了會多麼震驚了。
高德地圖可視化
高德地圖的 API 真的非常好,它提供各種和地圖有關的功能。其中有一項是 WEB 服務里的地理/逆地理編碼。將去哪兒爬取到的景點地址數據通過地理編碼轉變為對應的經緯度。比如:北京市方恆國際中心 A 座將它經過地理編碼後其經緯度為 116.480656,39.989677。它的 URL:
https://restapi.amap.com/v3/geocode/geo?address=地址&output=XML&key=<用戶的key>&city=城市
其中 output 是輸出個格式,一共有兩種,XML 和 JSON;address 是要地理編碼的地址,city 是所在的城市。
Word is cheap,show me the code!
def trans(city,name,pro,level):
for i in range(len(name)):
x = pandas.DataFrame()
t={}
add = name[i]
chengshi=city[i]
parameters = { "address": add, "key": "","city":chengshi }
html = requests.get("https://restapi.amap.com/v3/geocode/geo",
params=parameters).json()
try:
t["jingwei"] = html["geocodes"][0]["location"]
except IndexError:
t["jingwei"]="0,0"
finally:
t["n"] = name[i]
t["level"]=level[i]
t["pro"]=pro[i]
t["city"]=city[i]
x = x.append(t, ignore_index=True)
x.to_csv("55543.csv", encoding="utf-8", index=False, mode="a", header=False)
全國各級景區分布圖
全國各級景區分布六邊形熱力圖
在六邊形熱力圖中可以看到,北京是一個旅遊資源及其豐富的城市,如果大家只想去一個城市轉一轉,可以優先選擇北京。重慶、廣州、天津、蘇州等也是不錯的選擇。
全國景區分布熱力圖
筆者做了一個全國旅遊景點分布軌跡的動畫,鏈接如下:
lbs.amap.com/dev/mapdata/share/7b986430c10e197fcb5babbddd510c67
最後來看看筆者的家鄉,湖南。如果大家去湖南遊玩的話,長沙一定要去!其次張家界、永州、懷化和郴州也值得一去。
相關代碼和數據已經上傳到GitHub:https://github.com/zuobangbang/qunaer
聲明:本文為作者投稿,文章僅用於學習交流,不得用於其他途徑。作者:左伊雅,目前在南京某 211 大學讀研二,喜歡數據挖掘和爬蟲。
「徵稿啦」
CSDN 公眾號秉持著「與千萬技術人共成長」理念,不僅以「極客頭條」、「暢言」欄目在第一時間以技術人的獨特視角描述技術人關心的行業焦點事件,更有「技術頭條」專欄,深度解讀行業內的熱門技術與場景應用,讓所有的開發者緊跟技術潮流,保持警醒的技術嗅覺,對行業趨勢、技術有更為全面的認知。
如果你有優質的文章,或是行業熱點事件、技術趨勢的真知灼見,或是深度的應用實踐、場景方案等的新見解,歡迎聯繫 CSDN 投稿,聯繫方式:微信(guorui_1118,請備註投稿+姓名+公司職位),郵箱(guorui@csdn.net)。
※iOS 12 真的能讓舊款 iPhone 速度飛起嗎?
※在操作系統、晶元領域跌倒的中國程序員,如何崛起?|暢言
TAG:CSDN |