(转,感谢作者)零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(基础篇)
实现目的:爬取昆明市范围内的全部中学数据,包括名称、坐标。
先进入基础篇,本篇主要讲原理方面,并实现步骤分解,为python代码编写打基础。
因为是0基础开始,所以讲得会比较详细。
如实现目的所讲,爬取昆明市全部中学数据,就是获取百度地图上昆明市范围内所有关键字带中学的地理信息数据(兴趣点)。
怎么把百度地图上的数据抓取下来呢?
以下是教程:
本篇目录如下:
1. 百度地图开放平台注册,AK获取
2.关于ak的说明
3.请求URL说明
4.百度地图坐标拾取器
5.以坐标范围获取兴趣点POI
6.用excel完成URL阵列
1.百度地图开放平台注册,AK获取。
(1)
如果想获取POI数据,首先要登陆百度地图开放平台(http://lbsyun.baidu.com/),完成注册。
这个平台是百度地图为开发者提供接口用的,有很多其他的功能,这里只讲POI爬取相关。
当然,有百度账号的话,直接登陆就可以。
这个界面很熟悉,不多说。
(2)登陆百度地图开放平台后,按照图面上的序号操作。
一、点击进入控制台;
二、点击进入创建应用;
三、起个应用名称;
四、如果有必要,设置个IP白名单啥的,限制调用ak的电脑;
五、提交。
六、其他默认,不用改。
然后你就能看到自己创建的ak了。
2.关于ak的说明。
关于这部分的解释,详细的可以看开发文档——web服务API部分。
这里说一下配额方面的问题。
首先百度不支持你创建了一个ak就可以随便用,对于大多数未认证用户,每天的配额是有限的,不能超过十万次,每分钟不能超过6千次。
当然这个配额主要是触发定位功能的。
在爬取POI上,用一次ak生成的URL页面只能显示20个兴趣点的信息,而一个坐标范围内,最多能生成20个URL页面。
也就是说,一个坐标范围内,用ak生成的URL页面最多能爬取到400个兴趣点的信息。
如果昆明市中学不超过400个,那么一个坐标范围就够了,但是如果超过400个,那就不够用了。
关于ak配额的说明先到这里,下面的步骤详解中还会涉及到。
3.请求URL说明。
把下面这个网址复制到浏览器里看看。
http://api.map.baidu.com/place/v2/search?query=中学®ion=昆明&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
是不是生成了下面的一个页面?
这就是爬取到的一页昆明中学的信息。
然后我们分段解释这行URL。
http://api.map.baidu.com/place/v2/search?query=中学®ion=昆明&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
http://api.map.baidu.com/place/v2/search? 这个前缀就是在百度地图(API)上寻找。
query=中学 查询关键字是中学。
region=昆明 查询地区是昆明。
output=json 以json格式来输出。
ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO ak是9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO。(这个就是刚才申请的ak,图上打了马赛克,我为了写教程便于理解,没有给它设置IP白名单,就放在这里了,大家练习用吧。)
这行URL很好理解,照猫画虎,如果我要找北京的饭店,其URL就是:http://api.map.baidu.com/place/v2/search?query=饭店®ion=北京&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
但我们发现,网页上呈现的数据一共就四五条,昆明的中学,北京的饭店,不可能就这么几个。
接着以昆明的中学为例,对这个URL进行改进。
http://api.map.baidu.com/place/v2/search?query=中学®ion=昆明&page_size=20&page_num=0&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
把这个URL复制到浏览器里看一看,仔细数一下网页上爬下来的中学数量,20个。
从这个实践中能理解上文中提到的,每个URL页面只能显示20个兴趣点的信息了吧!
然后把两个URL仔细对比一下:
第一个:
http://api.map.baidu.com/place/v2/search?query=中学®ion=昆明&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
第二个:
http://api.map.baidu.com/place/v2/search?query=中学®ion=昆明&page_size=20&page_num=0&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
看看这两个有什么不同?
第二个多了一个page_size=20&page_num=0,这个是什么意思呢?一共能生成20个URL页面,这个是第0个,我们知道,程序语言的排号,一般都是从0开始的。
把page_size=20&page_num=0改成page_size=20&page_num=1,试一试,看看第二个页面生成了什么,再改成page_size=20&page_num=2……
改成page_size=20&page_num=19的时候,URL是http://api.map.baidu.com/place/v2/search?query=%E4%B8%AD%E5%AD%A6®ion=%E6%98%86%E6%98%8E&page_size=20&page_num=19&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO。
改成page_size=20&page_num=20试一试,URL是http://api.map.baidu.com/place/v2/search?query=%E4%B8%AD%E5%AD%A6®ion=%E6%98%86%E6%98%8E&page_size=20&page_num=20&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO。
显示的是下图,没有兴趣点,这回好理解上文中提到的,一个坐标范围内,最多能生成20个URL页面了吧!
这回我们知道了URL最多就能爬取400个兴趣点,那我们要获取的兴趣点数量远远超过400个,可怎么办呢?
别急,接着往下看。
4.百度地图坐标拾取器
在回答上面的问题之前,我们先了解一个工具,就是坐标拾取器。
进入开发文档——工具支持——坐标拾取器。
打开坐标拾取器,进入百度地图坐标拾取系统。
在这个拾取坐标系统上,一,先设定范围;二,在地图上点一下;三,看到当前坐标点如下,复制一下,就可以得到这点的百度坐标了。
自己估摸着一个矩形范围,拾取一个左下角坐标,再拾取一个右上角坐标。
要是实在估摸不好,找一张全国行政区划图看看。
这个稍微有点麻烦,我以后会再写一个教程介绍怎么获取行政区域范围。
拾取一个昆明范围的矩形坐标。
左下角:102.174112,24.390894
右上角:103.678942,26.548645
(获取矩形左下角和右上角坐标值的简捷方式在进阶篇中。)
5.以坐标范围获取兴趣点POI。
我们现在已经知道昆明的坐标范围了。
那么把上面的URL改一改。
这个是上文中的URL:http://api.map.baidu.com/place/v2/search?query=中学®ion=昆明&page_size=20&page_num=0&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
改动后的URL:http://api.map.baidu.com/place/v2/search?query=中学& bounds=24.390894,102.174112,26.548645,103.678942&page_size=20&page_num=0&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
对比一下,有什么不一样的!
之前的范围属性是:region=昆明
改动后的范围属性是:bounds=24.390894,102.174112,26.548645,103.678942
注意,经纬度范围是bounds=左下角纬度,左下角经度,右上角纬度,右上角经度。
其他的都没有变化,以坐标范围爬取,也只能最多爬400个兴趣点。
好了,回答之前提出的问题,如果兴趣点数量远超过400个,怎么办?
可以把矩形范围分割啊!
把昆明市的范围换成经纬度,左下角和右上角构成了一个矩形,如果一块矩形中的兴趣点超过了400个,那么我们可以把这个矩形切分,变成四个矩形。分别获取四个小矩形范围内的兴趣点,然后汇总。
四个不够的话,切分成八个,八个不够的话,切分成十六个,只要保证每个矩形内兴趣点不超过400个就行。
至于应该切分多少个,怎么切分,靠经验,自己估摸。
说到这里,这就是后续python编程的思路了。
6.用excel完成URL阵列。
这个算是为之后的python爬虫脚本编写预热了。
我们用excel强化一下编码思路。
目的:
爬取昆明市中学的兴趣点POI。
关键词:中学
已有ak:9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
昆明市坐标范围:
左下角:24.390894,102.174112
右上角:26.548645,103.678942
URL模板:
http://api.map.baidu.com/place/v2/search?query=中学& bounds=24.390894,102.174112,26.548645,103.678942&page_size=20&page_num=0&output=json&ak=9s5GSYZsWbMaFU8Ps2V2VWvDlDlqGaaO
把坐标范围输入到excel中,计算4个矩形的范围,然后4个矩形对应4列URL(page_num值0到19),用excel函数生成了4列共80个URL。
在这些URL中,只有两个属性是有变动的,既是bounds(边界范围),page_num(页码0-19),其他都是不变化的。
URL的生成是有规律可循的。
这就是编程的思路,代码篇讲解。