酒店分布数据的爬取与分析
前言
一个物理学院核工程与核技术专业的学生,对Python爬虫和数据分析技术的痴迷,完成一项全样本数据爬取、清洗和分析的整个数据分析过程,本项目重点体现:在海量数据的获取和清洗,而Python正是你手中的利剑,帮你斩断繁杂的体力劳动。
本案例通过API和网页分析实现了对百度地图POI数据的爬取,获取了成都市地区的POI数据,并且重点分析了爬取得到的酒店数据,分析酒店分布特点给出了统计分析的结果以及实现了数据的可视化。
酒店数据的爬取
01
1.1 主要使用的库
Request:用于http请求访问,主要使用get/post方法完成网络请求获取返回的网页信息。
BeautifulSoup:用于DOM文档解析比如html文档的快速分析提取目标信息。
Json:实现JSON数据格式的访问操作,这是网络通信中常用的数据格式。
1.2 爬取方法与思路
主要是通过百度地图官方提供的API接口进行访问(在官网上注册开发者获取ak密钥),另外辅助以百度地图网页端的详细信息数据爬取完成对成都地区的数据POI(Place Of Interest)的获取。
1.1.1 关键问题
百度地图官方对开发者的地点查询访问次数每天有一定限制。
查询信息方式每次最多400条且每次仅返回一页数据(最多20条信息)。
访问连接次数过多百度地图会对访问连接进行主动关闭,防止资源占用和外部攻击。
POI详细信息在百度地图的网页端为JS动态加载数据,不能直接获得。
1.1.2 爬取方法
通过矩形选区访问方式逐渐缩小访问范围以获得尽量多的数据绕开400条数据的限制,通过适当的延时和避免过度连接同时建立访问,在发生错误时更新连接访问来避免百度的封杀。
通过调用浏览器开发者模式分析每次访问数据的返回特点,找出百度地图的实际数据的二次跳转访问地址。
02
酒店数据实际爬取
2.1 爬取的区域:
由于百度地图数据访问方式的限制,我们每次访问只能得到最多400个数据,且以矩形选区方式返回对应区域的数据,因此我们需要对成都市进行大致的选区划分,以大致的矩形框选成都市并且对成都市进行更加细致的网格划分以实现数据的完整获取。
具体的选区可以通过百度地图上拾取对应的矩形顶点的经纬度完成框取:
![a2ecc25d19931f81f651dc953aec7a58.png](https://i-blog.csdnimg.cn/blog_migrate/02f06796aff408d15fcdfdc633fb2cfd.jpeg)
图 1 爬取范围
![495359d114dacf6fc7571790521448a9.png](https://i-blog.csdnimg.cn/blog_migrate/106ff52b5056decf84772c2f9036aea9.jpeg)
图 2 爬取区域矩形切割划分
![76c930c335a25f71a6a5854b59ccaf1b.png](https://i-blog.csdnimg.cn/blog_migrate/8522b4f5de2dfdda7de72a92438fcefa.png)
图 3 使用4*4网格切分返回数据量分布
图3中每个矩形单元格表示一个矩形选区,对应的数字表示该选区内的返回POI数目。通过上图3可以知晓,对1成都市的矩形访问选区内,使用4X4切割得到的数据分布情况,在选区中部数据大多为400,说明该部分数据还没有完全返回,该部分地区酒店较为集中。单次切割不能返回全部数据全部。
2.2 运行结果
![15b891fdfbda707aa341d86463f96f07.png](https://i-blog.csdnimg.cn/blog_migrate/959783cccb4888917ec4a4dd88768044.png)
![9c0ad676c7c19524d1e57e2be4f1b448.png](https://i-blog.csdnimg.cn/blog_migrate/1ae22bed2002cb4377c913f15ba44791.jpeg)
图 5 爬取数据的存储结构
将爬取的数据以npy格式存储在本地中便于后续的清洗和可视化处理,单项数据的展开如上图所示
2.3 详细信息的爬取
通过在浏览器开发者模式中对详细页面的分析,我们可以提取出关键的信息的访问地址:
1. url_get = 'http://api.map.baidu.com/place/v2/detail?\
2.uid=%s&output=json&scope=2&ak=%s'('7c5e480b91e5e4c9acb22aaa',_data['ak'])
对上面地址的访问(不同地点可以替换特定地点的标识符UID)就可以获取特定地点的详细信息,如营业时间、评论、评分和联系方式等等。
![7d5924b266779e3f9fc561b32d577bf6.png](https://i-blog.csdnimg.cn/blog_migrate/2cab24aab355b0c0ac6b72dc2a4a00d6.jpeg)
数据清洗与分析
03
![6a2a77b5ada50f0d122e873104f5bee1.png](https://i-blog.csdnimg.cn/blog_migrate/24ed5c7580e2bf87e6d930d75a9edf78.jpeg)
3.1 主要使用的第三方库
Pandas:主要用于数据的分析。
Numpy:主要用于一些需要使用的数据处理和格式转换,比如本地存储下来的POI数据就是一numpy数组格式存储,需要使用numpy进行数据的读取分析。
3.2 全体数据的简单分析
通过对原始数据进行初步的清洗,选取酒店名称、酒店所在区域、所属类型等进行初步的数据分析。
清洗后数据的格式,数据一共有三列,第一列表示酒店对应的区域即具体所在哪个区,第二行表示酒店的名称,第三列表示酒店的分类(粗略分类)。
![3a3c0287714d80ed04608bb5448dda29.png](https://i-blog.csdnimg.cn/blog_migrate/76fef27495c30bab1c22f5e25570c919.png)
图 7 数据列表部分
3.3 分析结果
![a6da832a3fc32820c31542d7fc955658.png](https://i-blog.csdnimg.cn/blog_migrate/07c0129af59570ad8398df3fe4cf2093.png)
图 8 酒店的分布情况
![4cd820d8b3e8307f6a57c8828da4a858.png](https://i-blog.csdnimg.cn/blog_migrate/17f7b66108865da73e7c841e64e48d6c.png)
图 9 酒店的种类
【注,全部区域包括:双流区、武侯区、金牛区、龙泉驿区、新都区、成华区、青白江区、温江区、新津县、崇州市、锦江区、郫都区、青羊区、简阳市。】
![355cb51cea83be0766c946df858923c1.png](https://i-blog.csdnimg.cn/blog_migrate/284a58e5c1fd8625bbd90e3ae43ecb8d.png)
图 10 酒店名称
经过初步的数据分析我们可以看到成都市区的酒店分布情况如下:
武侯区的酒店数目最多,此外二环以内的青羊、锦江、金牛等也有较多的酒店分布。
在全部酒店中,成都陆客精品民宿、如家、七天优品等数量较多。
04
![6a2a77b5ada50f0d122e873104f5bee1.png](https://i-blog.csdnimg.cn/blog_migrate/24ed5c7580e2bf87e6d930d75a9edf78.jpeg)
成都全部酒店的可视化
![070a7ca75eb5ceacdf5851b7aab9d82e.png](https://i-blog.csdnimg.cn/blog_migrate/7cb5092ff0702b2e7cb5d417625d836f.jpeg)
图11 酒店数据分布地图可视化
由上面的图11可以看出爬取的所有酒店的分布情况按照区域以不同颜色的散点进行了区分,我们可以大致区分出不同区域的酒店的分布集中与稀疏情况,此外可以对整个成都市的酒店的酒店的分布有一个直观的认识。
另外,将酒店的具体价格(推荐的价格)进行了显示,当鼠标悬浮在具体的酒店上面时,我们就可以获取对应酒店的名称以及对应的价格,还能获取酒店所在的经纬度。
这样对于成都市酒店的分布信息我们就有了一个较为全面且直观的了解。
注:本项目所有程序为Python完成,需要数据和code的可以在微信公众号中留言。