1. 程式人生 > >全國 41611 個景點,用 Python 告訴你哪些地方最值得一遊!

全國 41611 個景點,用 Python 告訴你哪些地方最值得一遊!

本文轉載自:https://mp.weixin.qq.com/s?__biz=MzA3OTAxMDQzNQ==&mid=2650617111&idx=1&sn=3120d94c0fc61eec3bbc1689fb062767&chksm=87b39afbb0c413ed3f182b77ea5ad212612deb9cf25a2e4de3d38957ccf73f54b958703a7c72&mpshare=1&scene=1&srcid=1127mvkSF1JIX3vvZYP9utVT#rd

資料抓取

去哪兒網有著非常豐富的旅遊資訊,不但幾乎涵蓋了全國所有景點,而且使用去哪兒網購買景區門票的人也非常多,所以筆者將爬取去哪兒網全國 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'] = ''

資料分析

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

最後來看看筆者的家鄉,湖南。如果大家去湖南遊玩的話,長沙一定要去!其次張家界、永州、懷化和郴州也值得一去。
在這裡插入圖片描述

更多案例請關注“思享會Club”公眾號或者關注思享會部落格:http://gkhelp.cn/

在這裡插入圖片描述