前言: 我们使用高德开放平台高德开放平台上的WebAPI服务,获取POI数据,严格说来不算爬虫,就是调数据接口获取数据而已。
1.获取兰州的范围。
2.将兰州范围拆分成设定步长的网格,用每个网格矩形搜索小区数据,如果搜索到的数据量大于阈值,则将网格拆分成四个,如此递归,直到矩形搜索到的数据量小于阈值。
3.用获取的网格调用接口,获取小区数据,把所有网格的数据汇总到一起就可以了。
总的思路:网格拆分的递归
1.获取兰州的范围 高德地图开放平台——开发指南——行政区划查询。 行政区划查询 根据请求参数说明,拼接出如下一个url,就可以获取北京范围的数据了,当然,用户key自己申请一个。
第一步,申请”Web服务API”密钥(Key);
第二步,拼接HTTP请求URL,第一步申请的Key需作为必填参数一同发送;
第三步,接收HTTP请求返回的数据(JSON或XML格式),解析数据。
如无特殊声明,接口的输入参数和输出数据编码全部统一为UTF-8。
行政区域查询:
行政区域查询API服务地址:
URL https://restapi.amap.com/v3/config/district?parameters
请求方式 GET
parameters代表的参数包括必填参数和可选参数。所有参数均使用和号字符(&)进行分隔。
请求参数
返回结果参数说明 服务示例:
https://restapi.amap.com/v3/config/district?keywords=兰州&subdistrict=0&extensions=all&key=<用户的key>
polyline就是北京边界坐标点串,拷贝下来,留着备用,把polyline:后面跟着那一串,复制保存在polyline.txt文件中,双引号不用留。
2.递归拆分网格 为了便于理解,我们把拆分网格和获取数据分开写。
先看说明: 高德地图开放平台——开发指南——搜索POI——多边形搜索:多边形搜索示例
https://restapi.amap.com/v3/place/polygon?
polygon=116.460988,40.006919|116.48231,40.007381|116.47516,
39.99713|116.472596,39.985227|116.45669,39.984989|116.460988,
40.006919&keywords=kfc&output=xml&key=<用户的key>
根据多边形搜索条目下的请求参数说明,可以知道,在URL中,我们需要拼接几个参数,才能获取数据。
1.key,需要在高德地图开放平台上申请,既key=用户的key
2.polygon,图简单,我们使用矩形,传左下右上两个顶点坐标对,既polygon=minlng,minlat|maxlng,maxlat
3.types,查询的POI类型,这个查《POI分类编码》,能看到(大类)商务住宅——(中类)住宅区——
(小类)住宅小区的NEW-TYPE是120302,中类住宅区的NEW-TYPE是120300,既types=12302。
4.offset,每页记录数据,offset=20。
5.page,当前页数,这个需要根据返回的POI总量算,从1开始。
6.extensions,返回结果控制,多多益善,extensions=all。
7.output,返回数据格式类型,output=json。
根据offset和page的说明,offset是强烈建议不超过25,若超过25可能造成访问报错,page是最大翻页数100,这表明,每次矩形搜索最多返回2500条记录。
我们继续看返回参数说明,count,搜索方案数目(最大值为1000)。
按照官方文档,矩形搜索,最多返回1000条数据,为了获取足够的数据,我们只能把搜索的矩形不断细分变小。理论上,在同一个地方,范围越小,内含的数据就越少。
假设说,一个矩形覆盖整个兰州,通过这个矩形调接口,返回count=1000,那我们就要把这个矩形拆分一下,横一刀,竖一刀,变成0、1、2、3四个小矩形,再通过这四个小矩形调接口,如果0返回的count小于1000,那它不用再拆分了,如果1返回的count=1000,那它需要继续拆分,如此递归下去,直到所有的矩形调接口,返回的count都小于1000。 虽然按官方说明,阈值选1000是正确的,但按照实践来看,这个阈值选800正好,因为我发现,挺大个矩形,返回的count是800多,拆成4个,每个小矩形也返回count是800多,这就有点不太合理了,实践出真知,那就用800做阈值吧。
示例: 1.先根据北京范围拆分基础的矩形网格。 2.根据这个基础的矩形网格,去调用高德多边形搜索服务,如果搜索出的小区小于800个,则保留矩形,否则拆分矩形,直到矩形搜索出的小区小于800个。 3.将处理好的矩形写入文件备用。
需要的包是requests和shapely,其实基础的矩形网格拆分得足够小,就都不用递归了,如果想看看递归效果,可以把步长d设置得大一些。也可以把代码改一改,获取其他类型的POI等。
三.获取小区数据 一个很简单的脚本,获取所有小区的name、id、address、location,保存在xiaoqu.txt中。