百度地图实现抓数据

前瞻

地图数据展示了大量不同行业的数据,我们整篇文章以百度地图为例。如下表
image.png

该表的说明是:
按照这个上面的搜索几乎能把地图所有POI的数据取出。
我们的目标就是当输入几个关键条件就把符合条件的数据全部提取出来。
例如有如下条件

  1. 经度纬度(可选)
    2.城市名称(可选)
    3.关键字(必选)
    如果我们要搜索北京市范围内的所有教育培训的名称,地址,联系方式(座机/手机) 则有如下解决方案。

方案 利用官方webApi

我们在使用官方WebAPI的POI兴趣点检索的接口的时候,如下接口说明


image.png

image.png

从图中可以看到几个关键搜索条件
query: 关键字 无需多说
选择方式:地点搜索限定范围可以由region、bounds和location + radius方式进行,其中bounds优先级最高、region优先级最低(与web服务保持一致)
所有有三种范围检索方式,优先级排序是
bounds > location+radius >region

我们查询一下,密钥请替换成 应用类别是<浏览器>的key

http://api.map.baidu.com/place/v2/search?q=教育培训&region=北京&output=json&ak=你的秘钥&page_size=1000&page_num=1

返回的结果是

{
    "status":0,
    "message":"ok",
    "total":400,
    "results":[
        {
            "name":"国家发展和改革委员会顺义培训中心",
            "location":{
                "lat":40.093096,
                "lng":116.494833
            },
            "address":"后沙峪镇边河路57号1区",
            "province":"北京市",
            "city":"北京市",
            "area":"顺义区",
            "street_id":"161a0ed28daef4495cd4fe3d",
            "telephone":"(010)69455888",
            "detail":1,
            "uid":"161a0ed28daef4495cd4fe3d"
        },
        {
            "name":"鸿基培训中心",
            "location":{
                "lat":39.855807,
                "lng":116.25832
            },
            "address":"洪泰庄97号",
            "province":"北京市",
            "city":"北京市",
            "area":"丰台区",
            "street_id":"63275e84b36988362ce67b6f",
            "telephone":"(010)63852093",
            "detail":1,
            "uid":"63275e84b36988362ce67b6f"
        },
        {

我们设置的是page_size=1000, 但是total参数告诉我们,一共是400. 我们在北京市的地图上搜索时发现返回的结果是


image.png

我们注意到结果数字是 13465个,不过不要着急,这还不是最终结果数,我们继续缩小地图


image.png

好了,我们看到北京市教育培训的兴趣点一共有14139个,这才是真正的数量。此时你就算继续缩小地图结果数都不会变的!
那么相比于400个, 14139真的是它的35倍之多,其他关键字搜索也是一样的。那么为什么百度API结果做这种限制呢? 本人认为是防止抓数据,盗取数据太容易。不过咱们也有解决办法。

仔细思考一下,刚才说的一次接口调用,检索最多返回400个结果,而北京市一共有14139个结果,是35倍多点。那么我们理论上调用36次就可以把全部结果拿到了。那么为了防止漏拿和尽量不重复拿,我们该如何去做呢?

  1. 把北京市切割成36份。比如切割成矩形。那么每一份知道其左下角和右上角坐标,我们就可以唯一确定一个矩形。
  2. 根据规则 bounds 就可以搜索了 例如
    那么还有一个问题,北京市的边界坐标是什么。这个问题我有个思路,
    从百度百科上查询到北京的面积大小为 1.641万平方千米
    根据面积公式 S= ab (长乘以宽) 假设北京市一个正方形,那么可以计算得出
    s = a*a
    a =128KM
    那么距离中心点左右长度为64KM
    但是这样有个前提是假设北京市个正方形。 那么实际以天安门为中心点(GPS坐标116.395645038,39.9299857781 )的矩形是什么样子的呢?如下图
    image.png

    这里就有个问题,我不仅没有把北京全包进去,而且会多出廊坊的区域,这样我切割完小矩形,其实有很多是无效的
    所以我想到了外一种近似方式,一般城市大小也就中心点坐标上下左右30KM吧
    所以北京如下
    image.png

    不在这个区域的很少。
    当然这个30是经过一定考量的,目前只对北京市有效,比如成都啊,海南啊,还是不行。中国一共有355个城市,每一个我觉得得人工去丈量一下。
    接下来我们切割矩形,计算每个矩形的左下角和右上角的坐标点,这样就可以搜索了
    百度地图的源码是
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
    <style type="text/css">
        body, html {width: 100%;height: 100%;margin:0;font-family:"微软雅黑";}
        #allmap{width:100%;height:500px;}
        p{margin-left:5px; font-size:14px;}
    </style>
    <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥"></script>
    <title>搜索区域内关键词</title>
</head>
<body>
    <div id="allmap"></div>
    <p>返回北京市矩形框区域范围内的“银行”关键字的检索结果,并展示在地图上</p>
</body>
</html>
<script type="text/javascript">
    // 百度地图API功能
    var map = new BMap.Map("allmap");            // 创建Map实例
    map.centerAndZoom(new BMap.Point(116.274625,39.961627), 11);
    map.enableScrollWheelZoom();                            //启用滚轮放大缩小

    var local = new BMap.LocalSearch(map, {
        renderOptions:{map: map}
    });
    var pStart = new BMap.Point(116.274625,39.961627);
    var pEnd = new BMap.Point(116.367474,39.988609);
    var bs = new BMap.Bounds(pStart,pEnd);   //自己规定范围
    local.searchInBounds("银行", bs);

    var polygon = new BMap.Polygon([
        new BMap.Point(pStart.lng,pStart.lat),
        new BMap.Point(pEnd.lng,pStart.lat),
        new BMap.Point(pEnd.lng,pEnd.lat),
        new BMap.Point(pStart.lng,pEnd.lat)
        ], {strokeColor:"blue", strokeWeight:6, strokeOpacity:0.5});
    map.addOverlay(polygon);
</script>

结果为


image.png

另外一个关键的切割矩形的算法,python实现。
源码是


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容