经常听到别人说“世界那么大,我想去看看”。在有机会走出国门之前,还是先把祖国走一圈吧。都知道中国地广人不稀,旅游资源非常丰富,古文化遗址、抗战遗址、山川、河流等等,在选择目的地的时候,不少人都会非常纠结,不知道去哪更好。为了以后不再纠结,笔者打算深度解析全国的旅游景点分布。
以下进入正题。
01、数据抓取
去哪儿网有着非常丰富的旅游信息,不但几乎涵盖了全国所有景点,而且使用去哪儿网购买景区门票的人也非常多,所以笔者将爬取去哪儿网全国 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'] = '' |
02、数据分析
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) |
上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。