1个机会
很可能是产品经理的职业习惯。写文档前一定要说清楚背景。
地图poi数据查询工具EasyPoi上线后,有同学问我如何获取一个城市的社区数据。
这个问题如此简单,因为EasyPoi致力于解决这类问题,你只需要在EasyPoi中根据单元格的关键词直接搜索就可以解决。
但也有同学提出,想要小区里的房价、住户等数据,这样EasyPoi就无能为力了……
因为问的学生很多,而且都是出于合理的理由:为了科研或者论文。
基于这个问题,我做了一些调研和研究,最终找到了解决方案。在这里,我将与大家分享。
2选择数据源
行业有专攻。想要小区的房价数据,自然要去找一些做房地产中介比较大的互联网公司。
在对比了链家、安居客、诸葛找房、企名网等房产中介平台后,最终选择了链家,因为链家的社区数据最全,房价数据也相对准确。
然后按照链家的说法,选择贝壳找房。有的同学可能不知道贝壳找房和链家找房的关系。我在这里简单地谈一下。
贝壳找房是一家房地产中介服务平台。除自定义链家品牌外,还有德佑、富房等多家房产中介品牌入驻其中。
比如贝壳找房类似于京东平台,链家找房相当于京东自营,其他加盟品牌相当于一些第三方卖家。
贝壳的地图找房和链家的地图找房,无论是前端页面还是后端技术架构都几乎相同。让我们来看看贝壳的地图。找房子是什么样子?除了聚合的球形气泡色链,找房子没有什么不同。
3技术方案
选择了shell找房作为数据源后,新的问题来了:如何从shell找房
在上面获取一个城市的所有社区名称和房价数据?
很多同学应该都想到了用爬行动物。
是的,目前看来,从网页中获取数据的唯一方法是使用爬虫。
爬虫收集数据有两种方式:一是直接分析网页,这是最简单粗暴的方式。这样,理论上,你能在网页上看到的所有元素(文本、图片、视频等)都可以被收集起来。二、通过网站提供的api接口获取数据
有些同学可能会问,什么是API?
API是应用程序编程接口的简称,计算机术语是应用程序编程接口。
是不是有点难懂?我们打个比方吧。
你去超市买杯酸奶,付钱后就迫不及待地想喝。
于是你熟练地撕下酸奶上的吸管包装袋,将吸管插入奶盒,美美地喝了起来。
在这个过程中,吸管相当于一个API,它为你提供了一个与牛奶互动的渠道或者服务,你可以通过这个吸管喝牛奶。
就像百度地图有丰富的poi数据,而且它提供了一个叫Place API的服务。只需调用该服务即可获取百度地图的poi数据。
Shell示例界面,感兴趣的同学可以复制以下链接到浏览器地址栏查看返回的数据;
cityid:city adcode datasource:ESF,默认参数,无论条件:default参数,无论id:default参数,无论grouptype:聚合数据类型,三级枚举值,区县聚合气泡数据返回城市,bizcircle表示气泡数据返回区县商圈,community表示社区数据返回商圈
MaxLatitude:当前可见页面矩形内的MaxLatitude MinLatitude:当前可见页面矩形内的最小latitude MaxLatitude:当前可见页面矩形内的最大经度MinLatitude:当前可见页面矩形内的最小经度
确定了使用shell后台的API接口后,我们来看看如何获取整个城市的社区数据,直接说出分析结论:通过上面的分析,我们可以看到,每次通过地图找房子进行缩放,都会得到矩形区域内可见的社区数据,每次最多返回100条。
有的同学应该明白这一点,这和Easypoi获得所有城市的原则是一样的:把整个城市当作一个矩形区域,然后划分成矩形区域,直到矩形区域返回的单元格数小于等于100。有些学生可能还不懂。我们来放张照片。图中的数字都是例子:
04
4方案实施
根据上面的原则,我们再来说明一下程序实现的步骤:
1获取目标城市的行政边界坐标。例如,下面是四川省成都市的行政边界坐标,是一个不规则多边形。我们需要得到多边形边界上的坐标点;目前,高德地图、百度地图已具备行政边界坐标查询功能;
2.根据行政区域坐标获取多边形边界的外接矩形。在地理区域中,矩形区域只需左下角坐标和右上角坐标即可确定;
3.使用递归过程对矩形区域进行划分,直到矩形区域中的单元格数据个数小于等于100。在这里,我就不重复用矩形区域分割的图片了。你可以参考上图。
4.在最终获取的矩形区域内采集小区数据并存储在本地;运行截图:
最终获得的数据部分截图:
1“腾讯文档”社区说明
示例数据
5源代码获取
采集原理和技术方案已经毫无保留地讲解清楚,有编程基础的同学,无论你使用python、go、ruby还是r语言,应该都能轻松实现。
可能有一些不知道如何编程的学生需要这些数据。但这是一个爬虫,而且是一个非常大规模收集的爬虫。在例子中,天津市已经收集了近万个小区。如果全中国的城市都跑下来,那一定是上百万的数据。如果被滥用,后果相当严重。
因此,源代码不会公开,这里只做技术讨论。
需要社区数据的同学可以给我,也可以为微信(soaringsoul)和我私聊。