一分钟读完全文
不借助API接口对百度地图的停车场信息进行爬取,可以更为详细的返回停车场的信息如总停车位数、租赁价格(这些信息通过API接口无法获取),且在一定程度上解决了次数限制问题。
借助API的尝试
近期开始做深圳的智能停车研究,手里有一批APP的停车位实时变化的数据,但在分析过程中遇到一个问题,就是停车百事通这个APP只有各个停车场的实时空余车位数,却无总车位数,这对于分析周转率、空闲率及停车场规模研究都十分不利,且停车百事通在深圳拥有3000+的停车场实时信息,规模已经很大了,因此想办法补全其对应的停车场的总停车位数十分关键。
经过尝试,发现百度地图已经在停车场信息里接入外部数据了(点赞百度MAP),比如我在百度地图中搜索“深港新邨-停车场”,红框中可见显示出了该停车场的剩余车位数、总车位数、泊车价格,还标注了数据来源是“罗湖区政府”。
第一步当然想到是去掉用接口了。打开API文档,发现有一个地点详情检索的功能:
于是我按照流程做了尝试,比如我依然搜索“深港新邨-停车场”这个停车场,但如果我需要详请检索,我需要知道这个停车场的UID,而这个又需要从“行政区划区域检索”中先按关键字进行检索,检索URL:
http://api.map.baidu.com/place/v2/search?query=深港新邨-停车场®ion=深圳&output=json&ak=秘钥(请替换为自己的秘钥)
检索结果如下,可见UID是可以知道了,但所得信息基本没用,基本能用的就是经纬度和停车场名称了。
当然这不是详请检索的结果,我们试试详请检索,检索URL(UID用上一步查出的替换):
http://api.map.baidu.com/place/v2/detail?uid=4ea3f2f1107ccbaaaecb6619&output=json&scope=2&ak=秘钥(请替换为自己的秘钥)
检索结果为:
与上相比,的确多了一些信息,比如多了个价格,但我们最需要的总停车位数依然没有。因此,借助API来获取信息基本就走死了。
开发者模式
既然靠API偷懒不成,只能进开发者模式里面找JSON文件了,考虑到这些数据为外部信息来源,我们从EXT里面找,如下:
然后就是对对于的XHR文件的URL进行解析了。https://www.cnblogs.com/yumubaime/p/7172954.html 一文中有做过解释。搜索时提及的URL为:
http://map.baidu.com/?newmap=1&reqflag=pcmap&biz=1&from=webmap&da_par=direct&pcevaname=pc4.1&qt=s&da_src=searchBox.button&wd=深港新邨-停车场&c=340&pn=0
其中c对于的为城市编号,深圳为340,记得修改。
将该URL返回的JSON文件丢到https://www.json.cn/ 解码,可以看到,的确是我们需要的:
到这一步,后续就相对简单了,只需要写一个循环,再进行提取,就能得到所需结果了。
构建循环
构建批量搜索的第一步是构建一个详细的深圳停车场信息,这在http://poi.mapbar.com/shenzhen/G90/已经给出了,如下。因此我们首先需要对这个网站做个爬取,将所有的停车场名称记录下来,然后对每一个停车场构建查询URL,最后循环提交,抽取所需,即可。
具体代码如下。代码为PY3环境,AK处自行替换秘钥,代码部分参考https://blog.csdn.net/my_lovely_lemon_tree/article/details/78418625。
需要注意,在构建URL时,由于含有中文字符,需要对中文字符做quote()转码。同时,直接不借助API查询得出的XY坐标为百度数字坐标,需要调用geoconv进行转化为百度经纬度坐标(这一步需要秘钥,且有次数限制,开发者一天30万次)。
————19年4月24日更新,加入了页码识别与循环————
import
最终的运行结果如下:
本方法实际也是一种绕开API次数限制检索POI的方法——毕竟坐标转化的次数要远多于地点检索。而且所得的信息要多于直接调用API的地点检索。
参考文献
https://blog.csdn.net/my_lovely_lemon_tree/article/details/78418625
http://poi.mapbar.com/shenzhen/G90/
https://www.cnblogs.com/yumubaime/p/7172954.html
http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi