根据关键字获取高德地图poi信息

百度地图和高德地图都提供了根据关键字获取相应的poi信息的api,不过它们提供给普通开发者使用的次数有限无法满足要求。其次百度地图返回的poi中位置信息不是经纬度,而高德地图则可以返回poi的经纬度信息。

网页分析

  • 目的

    以关键字怡景中心城为例,我们需要使用爬虫获取到高德地图返回的所有相关poi信息,本例中主要获取poi的名称和经纬度信息。

  • url分析

    通过chrome浏览器的监控,最终找到查询结果是通过json的形式返回,请求链接是
http://ditu.amap.com/service/poiInfo?query_type=TQUERY&pagesize=20&pagenum=1&qii=true&cluster_state=5&need_utd=true&utd_sceneid=1000&div=PC1000&addr_poi_merge=true&is_classify=true&zoom=17&city=440300&geoobj=114.056908%7C22.531457%7C114.062058%7C22.539831&keywords=%E6%80%A1%E6%99%AF%E4%B8%AD%E5%BF%83%E5%9F%8E

url中的keywords就是查询的关键字,pagenum页面数。此外经过分析发现返回结果包含20个poi信息,基本上覆盖了关键字区域,本篇博客仅爬取第一页的poi,如果想获取后续的poi,可以通过设置pagenum取值来得到。

poi信息包含在返回的joson数据中的poi_list字段

  • 请求头构建

代码

class CrawlerGaoDe(object):
main_url = 'http://ditu.amap.com/service/poiInfo?query_type=TQUERY&pagesize=20&pagenum=1' \
'&qii=true&cluster_state=5&need_utd=true&utd_sceneid=1000&div=PC1000&addr_poi_merge' \
'=true&is_classify=true&zoom=16&city=440300&geoobj=114.044736%7C22.550641%' \
'7C114.055035%7C22.567386&keywords={0}'
def __init__(self, zone_name, proxy=None):
self.__zone_name = zone_name
if proxy is None:
self.__proxy = None
else:
self.__proxy = {'http': proxy} def __init_crawler_args(self):
'''
初始化爬虫参数
:return:
'''
# 构造请求头
User_Agent = 'Mozilla/5.0 (iPad; CPU OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 ' \
'Mobile/13B143 Safari/601.1'
Host = 'ditu.amap.com'
Accept = '* / *'
Accept_Encoding = 'gzip, deflate'
Accept_Language = 'en - US, en;q = 0.8, zh - CN;q = 0.6, zh;q = 0.4'
amapuuid = 'b51b4430 - 611e-421e - b5f0 - d4c0069ec83a'
Connection = 'keep - alive'
cookie = 'guid=62e9-7327-26e6-8630; UM_distinctid=15bf554ac5ce3-07d1fa60bf59d3-24414032-' \
'cfcd8-15bf554ac5d163; _uab_collina=149446962066263280256309; passport_log' \
'in=ODY0OTIzNTQsYW1hcEF1SUZSNU45MiwyN2ZiY2x4YjJicWN3NGZjb29qYWtuYTY4bjhpdDEzN' \
'iwxNTA1Nzg4MDYzLE1XUm1OVE5oTlRRMk5tTmpOVEkwWWpWaU1EZzFNamRqTkdaaU5USmlabVk9; dev' \
'_help=A31pORob9CZKI7Sru%2B22%2FGUwNWY0ZTEyMDMwOGZiZWIyMTUyNDg3N2M5NzdiNGY3NzVhNGF' \
'iNDg5YzhjNjgzYmM5YjY5OTdmNjkxNjFlY2Y5%2BkDeYKdIYyjlQUymTgzjEbGZZwvhQT7HDehSDAbU71%' \
'2BgMgS1RZws1VsgIqQbVPGtHubQVNo3jkPiGQcc4GgNzC%2BXgQLxYhEc7WDMILJBY%2FJWXDmjfTh8Wf8e' \
'bkfF3VY%3D; key=bfe31f4e0fb231d29e1d3ce951e2c780; cna=HV1zEVpxFzkCATr4tPxil0OM; isg=At7' \
'eZS1TC8m1jV8txoi1zUMNL33gNqN9in7_KohnSiEcq36F8C_yKQRJwY1Y; CNZZDATA1255626299=593' \
'918092-1494468489-http%253A%252F%252Fwww.amap.com%252F%7C1505808643'
header = {}
header['User-Agent'] = User_Agent
header['Host'] = Host
header['Accept'] = Accept
header['Accept-Encoding'] = Accept_Encoding
header['Accept-Language'] = Accept_Language
header['amapuuid'] = amapuuid
header['Connection'] = Connection
header['cookie'] = cookie
self.__header = header
self.__url = self.main_url.format(self.__zone_name) def __get_context_info(self):
'''
从高德地图爬取信息
:return:
'''
# 获取爬虫返回信息
req = requests.get(self.__url, headers=self.__header, proxies=self.__proxy)
# print req.json()
self.__context = req.json() def __resolve_context(self):
'''
解析查询到的文本
:return:
'''
# 信息解析,保存poi名称和经纬度
pois = self.__context['data']['poi_list']
records = list()
for poi in pois:
tmp = {'zone_name': self.__zone_name, 'disp_name': poi['disp_name'],
'lng': float(poi['longitude']), 'lat': float(poi['latitude'])}
records.append(tmp)
return records
def do(self):
'''
执行
:return:
'''
self.__init_crawler_args()
self.__get_context_info()
return self.__resolve_context() if __name__ == '__main__':
# 单个关键字查询
craw_gaode = CrawlerGaoDe('怡景中心城', None)
records = craw_gaode.do()
print records
pd.DataFrame.from_records(records).to_csv('/home/用户名/Desktop/test.txt', encoding='utf-8', index=False)

上述爬虫中可以添加代理ip,输出结果如下:

disp_name	lat	lng	zone_name
怡景中心城 22.535799 114.05976 怡景中心城
怡景中心城停车场(出入口) 22.536416 114.059332 怡景中心城
怡景中心城广场停车场(出口) 22.536433 114.060231 怡景中心城
怡景中心城小天才专柜 22.535086 114.059913 怡景中心城
藤蔓慕果(怡景中心城店) 22.5358 114.05976 怡景中心城
中心城广场停车场(出入口) 22.536676 114.059312 怡景中心城
Miss南(怡景中心城店) 22.53511 114.059967 怡景中心城
麦当劳(怡景中心城店) 22.535774 114.0591 怡景中心城
汕头外砂乌弟卤鹅(怡景中心城店) 22.535729 114.059093 怡景中心城
家乐福(中心城店) 22.536266 114.059923 怡景中心城
陈钢串串香(怡景中心城店) 22.535411 114.05912 怡景中心城
指典世家(怡景中心城店) 22.5344 114.059681 怡景中心城
AT.PINK.CO(怡景中心城店) 22.536248 114.059305 怡景中心城
特斯拉充电站(ipower15私驾护理中心怡景中心城店) 22.536396 114.059341 怡景中心城
杂咖(怡景中心城) 22.535469 114.060467 怡景中心城
反斗乐园(怡景中心城) 22.535394 114.059777 怡景中心城
卫生间(怡景中心城) 22.536489 114.059134 怡景中心城
卫生间(怡景中心城) 22.535927 114.059091 怡景中心城
卫生间(怡景中心城) 22.536392 114.060427 怡景中心城
卫生间(怡景中心城) 22.535931 114.06033 怡景中心城

根据关键字获取高德地图poi信息的更多相关文章

  1. 高德地图POI爬取_Python

    高德地图POI 官方文档:https://lbs.amap.com/api/webservice/guide/api/search#introduce 官网控制台:https://lbs.amap.c ...

  2. 获取百度地图POI数据二(准备搜索关键词)

    上篇讲到  想要获取尽可能多的POI数据 需要准备尽可能多的搜索关键字   那么这些关键字如何得来呢?   本人使用的方法是通过一些网站来获取这些关键词   http://poi.mapbar.com ...

  3. 获取百度地图POI数据三(模拟关键词搜索)

    上一篇博文中讲到如何获取用于搜索的关键词,并且已经准备好了一百五十万的关键词   这其中有门牌号码,餐馆酒店名称,公司名称,道路名称等.有了这些数据,我们就可以通过代码,模拟我们在百度地图的搜索框中搜 ...

  4. 基于 Golang 完整获取百度地图POI数据的方案

    百度地图为web开发者提供了基于HTTP/HTTPS协议的丰富接口,其中包括地点检索服务,web开发者通过此接口可以检索区域内的POI数据.百度地图处于数据保护对接口做了限制,每次访问服务,最多只能检 ...

  5. 获取百度地图POI数据一(详解百度返回的POI数据)

    POI是一切可以抽象为空间点的现实世界的实体,比如餐馆,酒店,车站,停车场等.POI数据具有空间坐标和各种属性,是各种地图查询软件的基础数据之一.百度地图作为国内顶尖的地图企业,其上具有丰富的POI数 ...

  6. 高德地图POI采集(URL-API)

    新手从零学起,成功跑通,记一下,技术大神们多多指点. ———————————————— 1-概述 POI:兴趣点.对于百度.高德等电子地图来说,一个POI是地图上的一个店铺/商场/小区等等. 这次要解 ...

  7. 【python】获取高德地图省市区县列表

    项目中需要用省市区来进行检索,原想高德地图肯定会有API来获得这些数据,结果没有找到,有一个接口好像可以用,但是会附带大量的边界坐标点. 所以就不如自己把高德的省市区列表扒下来,自己写接口来完成这个功 ...

  8. 获取高德地图api

    先到高德开放平台首页按照关键字搜索地址,获取经纬度坐标: http://lbs.amap.com/console/show/picker 高德由坐标获取地址详细信息: http://restapi.a ...

  9. Java 通过地址获取经纬度 - 高德地图

    一.添加依赖 <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-v ...

随机推荐

  1. Codeforces Round #503 (by SIS, Div. 2)

    连接:http://codeforces.com/contest/1020 C.Elections 题型:你们说水题就水题吧...我没有做出来...get到了新的思路,不虚.好像还有用三分做的? KN ...

  2. ES6常用语法(上)

    ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了.它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应 ...

  3. 单元测试系列之九:Sonar 常用代码规则整理(一)

    更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 摘要:公司部署了一套sonar,经过一段时间运行,发现有一些问题出现频率很高,因此有必要将这些问题进行整理总结和分 ...

  4. MySQL按年度、季度、月度、周、日SQL统计查询

    说明 SELECT YEAR('2014-10-29') //2014 SELECT MONTH('2014-10-29') //10 SELECT DAY('2014-10-29') //29 SE ...

  5. PostgreSQL 空间数据类型point、 line等

    PostgreSQL中提供了空间类型字段 几何类型 几何数据类型表示二维空间的对象.表6-18 显示了PostgreSQL 里面所有的几何类型.最基本的类型是“点”,它是其它数据类型的基础.   6. ...

  6. 做数据挖掘,就算发 20 几分的 CNS 子刊,也是垃圾!?--转载

    关于数据挖掘发表文章,我们知道很多人是看不上.瞧不起.嗤之以鼻的.大抵是因为这些人平时只发 CNS 主刊,所以才认为通过数据挖掘这种用「别人的数据」或者叫「干实验」来发文章是“「垃圾」,没有什么价值. ...

  7. SVN导出差异版本更新的文件列表

    对于在服务器上没有使用版本控制的运维人员来说,每次SVN修改的文件都需要查看更改日志,一个个查找出来再更新到服务器,过程实在是痛苦 那么有没有一种方法跑个命令比对一下版本就哗啦啦的把修改好的文件复制出 ...

  8. SSH应用实战——安全防护(fail2ban)

    ssh 安全配置 端口 ssh随机端口范围在 27000-30000,可以手动修改也要改在这个范围内,建议定时修改端口. 密码 登陆密码应包含大小写.数字.特殊字符等 10 位以上,建议定期修改密码. ...

  9. 在linux 上安装ansible

    ansible 在线安装:yum install -y epel-releaseyum install -y ansible离线安装:rpm wget https://releases.ansible ...

  10. 接口测试工具postman

    一. 安装 1. 免费官网链接:https://www.getpostman.com/postman,下载好后双击.exe程序安装即可 2. 注意事项:建议安装在非系统盘,即C盘以外的盘,路径最好用全 ...