APP下载

基于Python的互联网POI数据爬取

2021-09-27邓晓斌

地理空间信息 2021年9期
关键词:电子地图数据量南昌

邓晓斌

(1.江西水利职业学院,江西 南昌 330013)

随着互联网和移动通信的高速发展,人们可以轻松访问网络上的大量数据,其中兴趣点(POI)数据尤其受到大家的喜爱,如在滴滴打车上可实时查询附近的滴滴车辆POI信息,百度地图上可查询周边的美食店POI信息等。POI数据是由真实地理实体抽象成的点,其分布与城市的经济活跃度呈正相关,大多数分布在经济活跃度较高的区域[1]。由于其获取成本低、属性信息量大等特点,POI数据被很多行业所采用,如曹芳洁[2]等利用POI数据研究了城市的空间结构;赵智勇[3]利用POI数据对城市的功能区位进行了划分;徐智邦[4]等则利用POI数据对城市道路进行了自动化提取。由此可见,POI数据具有重要的实际价值,因此如何获取POI数据成为一个重要问题。

Python是一种面向对象、解释型的计算机程序设计语言,是一种功能强大的通用型语言[5],已被广泛应用于图形处理、网络编程、网络爬虫、数据分析挖掘、机器学习等领域。鉴于Python在网络爬虫和数据分析方面的强大功能,本文采用Python对互联网POI数据进行爬取和挖掘。

1 POI的概念

对于POI的概念,国内外学者给出了不同的论述,李霖[6]等认为POI作为一种代表真实地理实体的点状地理空间大数据,是地理空间中具有标志意义的地理对象;Maceachren A M[7]等则认为POI数据集合不仅具有传统大数据5V(数据量大、处理速度快、多样性、准确性、蕴含价值)特点,而且单体POI数据包含了实体的名称、经纬度、地址、类型、电话、行政区等信息[8];综合国内外的表述,本文认为,POI是点状数据,具有丰富的属性信息,广泛地分布在互联网中,是人们日常生活中非常感兴趣的一种空间 位置。

POI以多种形式存在,最常见的是电子地图上与社会经济密切相关的地理实体点要素,如图1所示,通过百度地图检索出某地区的旅游景点POI信息。在某些情形下,POI也泛指一切受关注程度高于普通点要素的地理点[8]。互联网上很多论坛、博客、社交软件等可进行用户签到,形成了多种多样的POI数据。另外,人们日常生活中形成的活动轨迹也是一种POI数据,如乘车GPS轨迹、手机位置定位等。

图1 旅游景点 POI实例

POI主要通过电子地图平台(百度地图、高德地图、腾讯地图等)获取,其数据信息量大且精度较高、更新及时。这些电子地图的网站可通过检索接口或网页爬取技术获得POI。还有一些非电子地图的网站存在很多POI数据,如微博、大众点评网、美团网等,同样可通过网页爬取技术获得POI。

2 研究方法

本文的主要目的是通过对互联网中的POI数据进行爬取,获得有价值的POI信息,从而为POI增值业务提供数据基础。由于电子地图是POI数据来源的重要途经,且百度地图在人们日常生活中的使用频率较高,因此本文选择爬取百度地图POI数据。

硬件设备主要为电子计算机,软件设备主要包括Python2.7、Excel、txt记事本以及百度地图开放平台。本文以百度地图为平台,构建百度地图POI数据爬取框架,如图2所示,以Excel和txt记事本数据格式输出成果。

图2 基于百度地图的POI数据爬取框架

3 实例分析

由于POI数据类型众多,不可能爬取互联网上所有类型的POI数据,因此本文以爬取南昌餐馆POI数据为例,根据模型框架,详细介绍了POI数据爬取的过程。

3.1 注册用户

使用百度地图开放的各种功能和数据前,必须先成为百度的用户,可下载百度App进行扫码注册,也可采用QQ或微信等形式注册登入。

3.2 AK密钥获取

进入百度地图开放平台,登录“控制台”,在“应用管理”中创建应用。百度对于每个用户的AK密钥配额是有限度的,大多数未认证过的用户每天不能超过10万次,每min不能超过6 000次。

3.3 POI数据爬取

由于使用一次AK密钥生成的URL最多能显示 20个POI数据,同时在特定的坐标范围内,一次只能生成20个URL,因此采用AK生成的URL页面最多可爬取400个POI数据。如果POI数据量超过400,则需对区域进行裁剪分割,使每个子区域的POI数据量不超过400个,再分别对每个子区域进行页面爬取。

3.3.1 小数据量

在爬取POI数据量≤400的情况下,可直接在URL地址栏里输入以下信息:http://api.map.baidu.com/place/v2/search?query=餐馆®ion=南昌&page_size=20&page_num=0&output=json&ak=3kHNz4jtBc2t Ar8RMAQZAyBgEa4vWtsa,其中query代表查询“餐馆”,region代表查询的区域为“南昌”, page_size代表每个页面显示20个POI数据,page_num代表查询的页面,output代表输出的数据格式为JSON,ak为密钥。将page_num依次设置为1、2、…、19,可得到不同页面的POI数据。该类POI数据包含餐馆名称、餐馆位置(经纬度)、地址、省份、城市、辖区、街道号、电话等大量重要信息。南昌餐馆POI数据的JSON样式为:

当把page_num设置为20时发现,JSON文件内容变成以下情况,里面没有POI数据,说明用一次AK只能显示20个页面。

JSON数据格式类似于Python中的数字字典形式,因此利用Python语言能非常方便地将其转换为CSV或Excel文件。利用Python语言将POI的JSON数据格式转换为CSV格式的代码为:

南昌餐馆POI数据的CSV格式如图3所示。

图3 POI数据的CSV格式

3.3.2 大数据量

针对POI数据量超过400的情况,需将该范围划分为多个小区域,使每个小区域内的POI数据量不超过400。若需要寻找百度地图中南昌市范围内所有的餐馆POI数据,则首先需将南昌市的地理位置范围确定下来,可通过百度的坐标拾取功能来获得。南昌市地图的左下角的纬度为28.163 652、经度为115.447 208,右上角的纬度为29.127 212、经度为116.572 405。

从上述URL地址信息中可知bounds(相当于 region)和page_num两个重要变量,其中bounds={左下角纬度,左下角经度,右上角纬度,右上角经度},代入南昌市的范围数据bounds={28.163 652, 115.447 208,29.127 212,116.572 405},整个南昌市包含的餐馆POI超过400个,因此需对该范围进行切割。如图4所示,对bounds范围进行矩形分割,得到4个小矩形,若小矩形范围仍过大,则需进一步切割,以此类推,直到每个小矩形内的POI数据量不超过400。page_num的取值范围为0~19。一个矩形坐标范围内包含20个page_num,做一次切割就有4×20=80个page_num,每个page_num里存放20个POI,则一次切割后一共能爬取80×20=1 600个POI;若将4个小矩形再做切割,产生更小的矩形,则两次切割后一共能爬取1 600×4=6 400个POI。

图4 地图范围切割

爬取整个页面的POI数据,需要执行多个循环,Bounds=[rectangle1,rectangle2,rectangle3,rectangle4],Page_nums=[0,1,2,…,19]。其伪代码为:

根据上述原理,可把POI的爬取过程分为3个阶段:①生成bounds列表;②生成URL列表;③将爬取的POI数据保存到txt文件。其中,生成bounds列表的完整代码为:

’这段代码生成的是矩形分割后的多个矩形范围坐标具体运行结果为:

生成bounds列表后,再对page_num从0~20进行遍历,即可得到URL列表,具体代码为:

运行结果中的一个例子为:

将爬取的POI数据保存到txt文件,具体代码为:

代码执行后生成的南昌餐馆POI的txt文件格式如图5所示。

图5 南昌餐馆POI数据的txt文件格式

4 结 语

POI数据不仅具有空间位置信息,而且具有丰富的属性信息,能为众多行业提供数据支撑。本文详细介绍了百度地图中南昌餐馆POI数据的爬取过程,采用功能强大的Python语言进行开发,取得了良好效果,下一步将对爬取的数据进行深入分析,从而挖掘出有用的商业价值。

猜你喜欢

电子地图数据量南昌
我在南昌 你在哪
南昌是我 南昌是你
基于大数据量的初至层析成像算法优化
计算Lyapunov指数的模糊C均值聚类小数据量法
高刷新率不容易显示器需求与接口标准带宽
基于灵活编组的互联互通车载电子地图设计及动态加载
宽带信号采集与大数据量传输系统设计与研究
南昌护桥记
基于Mapserver的增强现实电子地图的设计与实现
电子地图在初中地理教学中的应用实践