大概是产品经理的职业习惯,写文档前一定要说一下背景。
地图poi数据查询工具EasyPoi上线后,有些同学私信问我如何获取一个城市的小区数据。
这个问题好简单啊,因为EasyPoi就是为专门解决这类问题而生的,你只需要直接在EasyPoi中根据小区的关键词来搜索就可以解决了。
但又有同学提出来,他们想要小区的房价和户数等数据,那EasyPoi就无能为力了……
因为问的同学比较多,而且都是出于比较合理的理由:用于科研或者论文。
基于这个问题,我做了一些调研和研究,最终找到了解决方案,在这里,给大家分享一下。
术业有专攻,想要小区的房价数据,自然是要到一些做的比较大的房产中介类的互联网公司去找了。
在先后对比了链家、安居客、诸葛找房以及房天下等房产中介平台后,最后选择了链家,原因是链家的小区数据最全,房价数据也相对比较准确一些。
进而根据链家找房选择了贝壳找房,可能有的同学还不清楚贝壳找房和链家找房之间的关系,我在这里大致说一下。
贝壳找房是一个房产中介服务平台,除了自定的链家品牌外,里面入驻了许多其他的房产中介品牌如德佑、富房等加盟品牌。
打个比方,贝壳找房类似于京东平台,链家找房就等同于京东自营,其他的加盟品牌就相当于一些第三方卖家。
贝壳的地图找房和链家的地图找房无论是前端页面还是后端的技术架构几乎都是一样的。来看看贝壳的地图找房长什么样子,除了聚合的球形小气泡颜色链家找房不同,看起来没有什么不一样。
选择了贝壳找房做为数据源后,新问题就来了:如何从贝壳找房上获取一个城市全部的小区名称和房价数据?
很多同学应该都想到了,使用爬虫。
是的,从网页上获取数据,目前似乎只有借助爬虫的方式了。
爬虫采集数据的方式有两种:第一,直接解析网页这是最简单粗暴的方式,通过这种方式,理论上来说你在网页上能够看到的所有元素(文字、图片、视频等)都可以被采集到。第二,通过网站提供的api接口来获取数据
可能还有同学还会追问,API是什么?
API是Application Programming Interface的简称,计算机专业术语为应用程序编程接口。
是不是有点难理解,打个比方吧。
你去超市买了杯酸奶,你付完钱后迫不及待地想喝了它。
于是你熟练地撕掉酸奶上的吸管包装袋,将吸管插进牛奶盒,美美地喝了起来。
在这个过程中,吸管就相当于是一个API,它提供了一个你和牛奶进行交互的通道或者服务,通过这个吸管你就可以喝到牛奶了。
就像,百度地图拥有丰富的poi数据,他提供了一个名称为place api的服务,你只需要调用这个服务,就可以获取到百度地图的poi数据了。
贝壳的示例接口,感兴趣的同学可以将以下链接复制到浏览器地址栏里查看一下返回的数据;
https://map.ke.com/proxyApi/i.c-pc-webapi.ke.com/map/bubblelist?cityId=110000&dataSource=ESF&condition=&id=&groupType=district&maxLatitude=40.07452554285216&minLatitude=39.75487666921912&maxLongitude=116.73445042767183&minLongitude=116.07329757232806
cityId: 城市的adcode
dataSource: ESF,默认参数,不用管
condition: 默认参数,不用管id: 默认参数,不用管
groupType: 聚合数据的类型,三级枚举值,district表示返回城市的区县聚合气泡数据,bizcircle表示返回区县内商圈的气泡数据,community表示返回商圈内的小区数据
maxLatitude: 当前可见的网页矩形范围内的最大纬度
minLatitude: 当前可见的网页矩形范围内的最小纬度
maxLongitude: 当前可见的网页矩形范围内的最大经度
minLongitude: 当前可见的网页矩形范围内的最小经度
确定了使用贝壳后台的api接口后,我们来看下如何获取整个城市的小区数据,直接说分析结论了:通过以上分析我们可以看出来,每次通过地图找房进行缩放时,就会获取可视的矩形区域范围内的小区数据,每次最多返回100条。
有的同学这会应该就明白过来了,这和EasyPoi获取全部城市的原理是一样的了:将整个城市看做一个矩形区域,然后分成一个个矩形区域,直到矩形区域内返回的小区数量小于等于100个。有的同学可能 还没有看明白,再来放一张图,图中数字皆为示例:
04
根据以上的原理,再来说明一下程序实现的步骤:
1 获取目标城市的行政区域边界坐标例如以下是四川省成都市的行政区域坐标,是一个不规则的多边形,我们需要获取到多边形边界上的坐标点;目前高德地图、百度地图都有提供行政区域边界坐标查询功能;
2 根据行政区域坐标获取多边形边界的外切矩形在地理区域中矩形区域,只需要左下角坐标和右上角坐标即可确定;
3 将获取到的矩形区域使用递归程序进行分割,直到分割完成的矩形区域内的小区数据数量小于等于100个这里我不在重复放矩形区域分割的图片了,可以参考上面的图片。
4 在最终获取到的矩形区域内采集小区数据,并本地化存储;运行截图:
最终获取到的数据部分截图:
上面已经毫无保留地将采集原理和技术方案讲清楚了,有编程基础的同学,不管你使用python,go、ruby还是r语言应该都能轻松实现了。
也可能确实会有一些不懂编程的同学需要这些数据,但这是一个爬虫程序,而且是一个非常大规模采集的爬虫程序,示例中天津的小区采集到了近2.2万个小区,如果全国的各个城市都跑下来的话,肯定是百万级别的数据了,如果被滥用了,后果还是挺严重的。
所以源码不会公开,这里仅做技术探讨。
公司名称: 亚游-亚游娱乐-注册登录站
手 机: 13800000000
电 话: 400-123-4567
邮 箱: admin@youweb.com
地 址: 广东省广州市天河区88号