欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定!

对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tsaiedu,并注明消息来源,邀请你进入数据爱好者交流群,数据爱好者们都在这儿。

作者:胡萝卜酱
公众号:经管人学数据分析

国庆7天长假,就问你们激不激动!

可是,出门游玩,走哪里都是人,人,人,人……。你的脑海里是否出现了以下画面:

image

image

image

为了方便大家的出游选择,小编爬取了去哪儿网上面的6000多个景点数据,包含景点评级、热度、销量等等数据,汇总成这篇出游参考指南。

爬虫


爬虫继续用的是胡萝卜酱最近的心头爱selenium,用法可以参考爬虫神器selenium之猫眼电影榜单实例。打开去哪儿网站,右键,分析网页。

image.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:

image.gif

大熊猫不愧为国宝,最热门就是它。其次是故宫,郑州动物园,峨眉山,秦始皇兵马俑等等。因为小编没有去过多少地方玩,也不知道为啥郑州动物园能排到第三,大家知道的可以告诉小编一下它的特色吗?

省份与评级:

image.gif

说实话,这个图的配色真的是太丑了,主要是小编过于懒惰,不想好好配色了

image.gif

热力图:

热力图根据省份和城市分别作图,其次在根据销量和热度两类图,这里采用的是Python调用高德地图API实现经纬度换算、地图可视化一文的方式,调用高德地图API完成。

首先是省份和景区热度:

image.gif

然后是省份和销量:

image

接下来是城市和景区热度:

image

最后是城市和景区销量:

image

值得注意的是,城市和销量一图热力范围不明显,原因为景区之间销量天差地别,一些太少的的统计下来,作图非常的不明显了。若大家不喜欢用高德地图API作图,那么人生苦短,我要用pyecharts画图的方法也非常适合做热力图,比如这里小编做了一张省份和销量的图:

image

综合来看,北京,四川,沿海等地都是旅游的热门省份。建议大家尽量避免去这些省份游玩。

推荐景区:

知道了需要避免的景区和省份城市,那么可以去哪些人少的地方呢?这里胡萝卜酱根据景区分级,分别推荐15个人少的景区:

image

image

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爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

image

福利:文末扫码立刻关注公众号,“Python爱好者社区”,开始学习Python课程:

关注后在公众号内回复课程即可获取:

小编的Python入门免费视频课程****!!!

【最新免费微课】小编的Python快速上手matplotlib可视化库!!!

崔老师爬虫实战案例免费学习视频。

陈老师数据分析报告制作免费学习视频。

玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。

image

6000+个景点数据可视化,国庆出游避免拥挤,这一篇就够了相关推荐

  1. 2016年研究数据可视化最不应该错过的10篇文章

    2016年是数据可视化渐趋成熟的一年,越来越多的领域开始认识到数据可视化的重要性.同样在这一年,涌现出了大量关于数据可视化的文章,其中不乏富有创见性的观点和研究.我们选出了以下10篇最具启发性的文章, ...

  2. 原创 | R的基础及进阶数据可视化功能包介绍

    R 作为入门级编程语言,被经常运用在数据整理.数据可视化.以及机器学习中. 本篇文章将主要介绍在R中如何可视化数据 (基础+进阶). R绘图的原理 使用R绘图,我们需要在脑海中明确几个必要元素.首先, ...

  3. echart雷达图文字挤在一起_【数据可视化·图表篇】雷达图

    数据可视化基础图表系列的最后一篇终于跟大家见面了!今天小数将带大家走进雷达图. (之前关于柱状图.折线图.饼图和散点图的分享文章,感兴趣的小伙伴可以查看历史文章哦) 为方便大家理解,本文生成图表所使用 ...

  4. 大数据可视化的优点有哪些

    在大数据分析中,人们可以从数据中获取大量的信息,但数据的分析结果需要以易于理解.内容简单的方式呈现在我们面前,这就要求数据可视化操作.数据可视化是指以饼图等图形的形式表示数据.这有助于用户更快地识别模 ...

  5. 大屏数据可视化 B端UI设计后台PC网页UI设计U3D+可视化落地教程

    近年来,数据可视化是一个热度比较高的词,数据可视化大屏投放的需求也越来越多. 数据可视化是指将数据以视觉形式来呈现,如图表或地图,以帮助人们了解这些数据的意义. 数据可视化大屏是当前可视化领域的一项热 ...

  6. Python数据可视化之Matplotlib-基础详细篇

    Python数据可视化-Matplotlib 上一篇文章大概介绍了数据可视化-Matplotlib之基础知识.这篇文章我们学习一下常用图形的绘制方法. 常用平面图形 普通图 常用函数可以直接用 plt ...

  7. 爬取去哪儿网 6000 多个景点数据告诉你,国庆哪里不是人山人海!

    国庆长假已经过去一半啦,朋友们有多少是堵在了景区和路上? 为了方便大家的出游选择,笔者爬取了去哪儿网上面的 6000 多个景点数据,包含景点评级.热度.销量等等数据,汇总成这篇出游参考指南. 爬虫 爬 ...

  8. 【pyecharts数据可视化】python爬取去哪儿网景点数据,做交互式数据可视化

    写在前面 在网易云课堂看到城市数据团大鹏老师讲的<Python数据可视化利器:Pyecharts!>[传送门],于是把前一篇南京的景点数据做一个可视化. 1.还是去哪儿网景点爬取 具体可以 ...

  9. Python 获取旅游景点信息及评论并作词云、数据可视化

    正所谓:有朋自远方来,不亦乐乎?有朋友来找我们玩,是一件很快乐的事情,那么我们要尽地主之谊,好好带朋友去玩耍!那么问题来了,什么时候去哪里玩最好呢,哪里玩的地方最多呢? 今天将手把手教你使用线程池爬取 ...

最新文章

  1. Intellij Idea:导入Gradle项目 - 尚未定义JAVA_HOME
  2. JavaScript中的地图与对象
  3. admin——django自带数据库管理工具
  4. 招聘APP如何搭建信用体系以避免求职者被骗
  5. 在 Windows下使用 fastText
  6. 《机器学习Python实践》第3章——第一个机器学习项目
  7. Day11 JaseSE File类的使用
  8. PostgreSQL导入导出CSV
  9. netty报错Force-closing a channel whose registration task was not accepted by an event loop处理办法
  10. python 转换图片大小,并保存
  11. 服务器安装操作系统失败,安装程序配置服务器失败怎么办
  12. 任务的同步与通信_读书笔记_6
  13. Golang学习日志 ━━ gin-vue-admin实现多数据库db-list
  14. 凝思磐石linux系统怎么切双屏_linux (ubuntu) 下双屏显示解决?
  15. matlab数字图像处理:时空域图像增强
  16. 华为NBlot物联网学习内
  17. Springboot整合redis从安装到FLUSHALL
  18. java soa是什么_什么是SOA呢
  19. 【U8】固定资产新年度第一月份期初和期末对不上
  20. 《庄子·外篇·知北游第二十二》

热门文章

  1. 原码,反码,补码的转换
  2. 计算机软件保护条例的历史,计算机软件保护条例
  3. 杂谈:饮水思源与Java仍在但Sun已死
  4. 学生信息管理系统(数据库设计)
  5. 团队作业9——测试与发布(Beta版本)
  6. java跑动d小人_Java课堂练习5
  7. 解决论文写作排版中,两端对齐导致文字间距被word补过大的问题
  8. 中国女排世界排名跌至第二,为何排名下跌?郎平这样回答
  9. 待飞的蒲公英---拔剑四顾心茫然
  10. EPLPrinter Emulator SDK for .NET Standard