使用python及百度API对百度poi数据进行爬取(一)

来源:互联网 发布:快听小说显示网络异常 编辑:程序博客网 时间:2024/05/22 19:26

档案系统初期算是告一段落了,利用一点时间继续爬取POI。和领导聊聊,受益匪浅。之前我的想法是爬取一份poi数据,直接能用;而领导听了之后,觉得更好的方式是爬取多个渠道来源的POI数据,然后做一个数据比较融合(最终事情能不能成不好说,但是经过这么一回,细节技术上有所提高,宏观把控整体项目流程能力有所长进,更重要的是通过和能人交流,以更高的眼界更宏观的看待数据、应用以及问题,这就是成长)。 我之前采用的方式,可以满足需求,但是POI数据获取效率差一些(虽然已经很快,但是相比本文这种还是慢一些)、数据现势性不好,高德数据和百度数据虽然是两套,但是仅仅是坐标不同(所以显然还是一套)。所以,我加一种方式来爬取百度poi。

一  调研: 百度API提供了一个叫Place API获取poi的接口,有个城市内检索 实例为

http://api.map.baidu.com/place/v2/search?query=银行&page_size=10&page_num=0&scope=1&region=北京&output=json&ak={您的密钥}
它返回的是个json类型数据,一个区域最大返回数为400,每页最大返回数为20。显然一个城市内不管什么类别的poi,不可能只有400个,会遗漏数据,故舍去

还有一个矩形区域检索,实例为

http://api.map.baidu.com/place/v2/search?query=美食&page_size=10&page_num=0&scope=1&bounds=39.915,116.404,39.975,116.414&output=json&ak={您的密钥}
只要区域划分得当,这个可以使用二 要解决的问题1 区域划分 网上有人通过递归写代码的方式来划分,这样划分有问题,第一,划分的区域不能完全对应一个城市的市区;第二,算法设计比较麻烦。解决办法,后面详细说。2 类别问题  百度API的接口必须要指定query的类别,那么如果类别指定不准,或者类别不全,根本无法完成爬取一个城市所有poi的任务。解决办法,说实话,这个问题在我做这件事情的时候,十分棘手,不过我最终找到了这个网页,http://lbsyun.baidu.com/index.php?title=lbscloud/poitags,一切都不是问题了三 整体流程1 区域划分,2km*2km的区域基本可以满足需求,获取每个区域的对角坐标(经纬度),逐行写入一个txt文本里2 爬虫程序编写  读取1中的txt文本,逐行循环;调用百度API接口,爬取json;将爬取的数据存入数据库中; 每个类别跑一次程序3 爬下的POI数据处理  poi显示,投影坐标转换,与地图叠加 后文将详细介绍流程