星巴克指数研究(爬虫技术爬坑篇)
Posted 小胖爱投资
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了星巴克指数研究(爬虫技术爬坑篇)相关的知识,希望对你有一定的参考价值。
大家好!很久没有更新推文了!很对不起大家!
今天给大家带来我这几天做的一点小工作。
0.背景介绍
最近想买房,一直在看房。贝壳、链家、我爱我家、上海中原网这几家倒腾来倒腾去,只要是休息的时候,一定要瞄上两眼,不然就觉得浑身难受。从三林--世纪大道--徐汇滨江--前滩--后滩--北蔡--东外滩,再从一梯队小学--二梯队小学,基本上都看了个遍,不说把房源记得滚瓜烂熟吧,但基本热门小区我都能说上一二。(都能去面试中介了)
闲着没事的时候,就喜欢看看规划,看看发展潜力或者是看看楼市预测。有一天,突然看到了一篇文章,提到了如下观点:
非常有意思,受到这个观点的启发,正好看房看得也看无可看了,正好来研究研究。
先研究第一条:
如果有星巴克入住的地段,那一定不会是差的地段。
对我的这个研究,暂时命为“星巴克指数”。
1.数据来源
对于房源来说,现在最完整的就是链家网了。链家网从数据准确度、更新频率、数据量来说,链家现在肯定是中国房产信息的龙头。
这篇文章将主要使用上海链家的数据进行分析。
我们将针对上海的所有在链家上有数据的小区进行分析。如果想看到所有的小区列表,我们可以直接访问:https://sh.lianjia.com/xiaoqu
我们在随便选择一个小区
下拉可以看到基于百度地图制作的一个poi详情显示。点击“生活”-“咖啡馆”,我们即可看到小区周边的咖啡馆情况。 如下所示,在地图上并没有看到星巴克。对于这个小区来说,星巴克指数的评分可能是非常低的了。
2.数据获取
我如果想要获取到全部小区附近的咖啡馆该怎么办呢?最最原始的方法当然是就这样一个个小区打开,然后再下拉,记录下小区周边的咖啡馆情况,获取数据。但是,链家网上海的小区,少说也要有大几千个呢(事实证明我错了,单单浦东新区就有5000+个小区),一个个点,什么时候到头呢?不仅要一个个点,我们还要记录哪些没点过,哪些点过呢。
不行,作为一个程序员,我们一定要有效率!
该怎么办呢?
2-1爬虫
非常简单,写个程序,让程序替我们获取数据!
可以注意到,链家上的小区是分区域的。我们可以模拟点击,或者直接获取对应的链接访问区域下的小区:
可以注意到的是,当你把鼠标悬停在“浦东”上时,浏览器的左下角出现了一个链接,那正是“浦东区域的小区”对应的链接,我们可以点进去,进入浦东的小区页面。同样的,在小区列表中,将鼠标悬停至小区名称的时候,我们可以看到左下角显示了小区详情的链接。如下图所示:
通过:小区主页面->各区域小区页面->小区详情页面。这样的路径,我们就做到了上海各区域各小区的信息收集了。
当然文章中并没有涉及在程序中如何获取的细节,因为太过专业不放在本篇文章中说明。
2-2poi收集
整理完毕全部小区列表信息后,我们要开始着手完成poi信息的收集了。
按照我最开始的思路,我需要进行如下操作:
模拟浏览器打开小区详情页面
模拟下拉至poi列表
模拟点击“生活”标签
模拟点击“咖啡馆”标签
爬取数据
打开下一个小区详情页面
不行,作为一个(lazy)程序员的我,看到这样的操作步骤,头都要炸了。不行,我要更简单的方法!我要偷懒!有着多年(伪)爬虫经验的我的直觉告诉我:“F12!”(F12是Chrome浏览器打开调试窗口的快捷键。)调试窗口于爬虫程序员,相当于鱼于水,空气于人。咳咳咳,扯远了。
打开调试窗口,切换至NetWork标签(在我有限的经验里,这个工具最好使):
Network标签里面的XHR分类呢,又是我最喜欢的伙伴。里面一般是RESTful的接口访问,对于爬虫来说,是最方便的了。
但是。。。这个页面并没有RESTful接口的请求!!
那,我们就直接切换到ALL这个标签下面吧:
茫茫一片的请求啊,要找到合适于我的接口,无异于大海捞针(也有可能根本找不到能用的)
我就对着这些请求,发呆。
大约过了5分钟之后,灵感上线了:链家使用的是百度地图,那么对我有帮助的极有可能与baidu相关啊!
于是在这些请求中,寻找与baidu相关度较高的请求,功夫不负有心人:
还真被我给找到了!
但是呢,看到原始的请求链接,我的头一下子又大了:
https://api.map.baidu.com/?qt=bd&c=289&wd=%E5%92%96%E5%95%A1%E9%A6%86&ar=
(13527541.65%2C3636664.19%3B13531541.63%2C3640664.23)&rn=10&l=18&ie=utf- 8&oue=1&fromproduct=jsapi&res=api&callback=BMap.rd.cbk25859&ak=C106a48023d9606dcdad761cbc070095
这是个什么妖怪url。。。
多年的经验告诉我:
3.与百度api的斗争
第二天,我准时来赴约。这一次,我知道,这是我与百度api的一场没有硝烟的战争。
我们来仔细研究一下,上面那个url的具体参数:
qt=bd 意义不明
c=289 意义不明
wd=咖啡馆意义明确
ar=(13527541.65,3636664.19;13531541.63,3640664.23)意义不明,猜测为坐标,但为什么是两个坐标?
rn=10 意义不明
l=18 意义不明
ie=utf-8 编码格式,utf-8最通用
oue=1 意义不明
fromprduct=jsapi 看来是百度地图的jsapi的接口
res=api 声明这是个接口(废话我知道)
callback=BMap.rd.cbk25859 回调函数,目测经过了混淆
ak=C106a48023d9606dcdad761cbc070095 百度开发者apiKey
最让我绝望的一点是:这个接口跟小区名称毫无关系。
柳暗花明
正在我陷入绝望之际,一个偶然的发现,点燃了我新的希望:
在无聊地打开所有标签的时候,貌似发现了什么不得了的东西。
但是这个坐标是121.546618, 31.217388跟上面那个意思坐标毫无关系啊。
我又去翻看了百度地图api的官方文档,看看那上面有没有对坐标的说明吧:
划重点:
全球通用的坐标,WGS84坐标
国测局坐标,GCJ02坐标,是在WGS84上做了一定的转换。
bd09坐标,百度坐标,在GCJ02上做了一定的转换。
bd09mc坐标,百度米制经纬度坐标。将bd09坐标使用米来表示的坐标,地图展示的时候需要最终转换为米制坐标。
怀着试一试的心态,我将上述小区坐标,转换为米制坐标,如下图所示:
咦,等一等,怎么这么似曾相识?
{"status":0,"result":[{"x":13529541.639213872,"y":3638664.2411838865}]}
ar=(13527541.65,3636664.19;13531541.63,3640664.23)
还不够明显?那这样呢:
13529541.64,3638664.24;13529541.64,3638664.24
13527541.65,3636664.19;13531541.63,3640664.23
聪明的你一定发现了:小区中心的米制坐标各减去2000,是ar的第一个坐标;小区中心的米制坐标各加上2000,是ar的第二个坐标。也就是这个接口表示了,搜索距离这个小区2000m范围内的咖啡馆。核心的参数是:
wd,表示了关键词
ar,表示了范围
rn,表示了请求数量(经测试得,不在此赘述)
当然,你要去百度申请一个apiKey,否则无法使用。申请 apiKey的教程请百度,不在此赘述。
那,我接下来要做的是:小区主页面->各区域小区页面->小区详情页面->获取小区经纬度->获取转换后小区坐标(百度米制坐标)->根据接口规则获取需要的poi数据->根据poi数据获取跟小区的距离->根据距离及是否有无星巴克数据计算星巴克指数。
4.总结
实在是太不容易了!本来以为两天就能完成的数据整理+计算+文章便编写,结果在第四天的时候才刚刚把基础数据准备好。还是太轻敌了。不过,从这次的数据准备过程中,也确实学到了很多东西。学到最重要的就是,F12很重要!有些背景知识很重要(不然也很难猜测那一串数字是米制坐标),还有最重要的一件事:遇到困难就去睡觉(很皮)
接下来,我将会根据获取到的数据,完成星巴克指数的计算,过两天见!
当然,如果大家很想学习爬虫技术细节,我也很乐意分享啦。看看这篇文章的反馈再说
原文链接是那篇勾引我入坑的文章。
爬坑,码字不易,望大家不吝关注、点赞、转发,谢谢。
以上是关于星巴克指数研究(爬虫技术爬坑篇)的主要内容,如果未能解决你的问题,请参考以下文章