本文主要实现根据城市名和分类名爬取对应的POI数据

首先,需要在高德地图开放平台上注册账号,并且申请web服务的AK密钥。注册账号登陆后点击右上角的控制台 ->应用管理 -> 创建应用 -> 添加新key,注意选择web 服务,就得到了一个可以使用web服务的key密钥。一定是Web服务噢。

然后将密钥复制下来,在后面的代码中使用。

具体代码如下。

获取的POI数据包括经纬度、名字、地址、所属行政区等属性。其中transCoordinateSystem.py包含转换坐标的函数,可以根据需要选取不同的函数以获取所需数据。
若运行程序提示缺乏某些库,则添加相应库即可。

#!/usr/bin/env python
# -*- coding:utf-8 -*-from urllib.parse import quote
from urllib import request
import json
import xlwt#TODO 替换为申请的密钥
amap_web_key = '你的密钥'poi_search_url = "http://restapi.amap.com/v3/place/text"
poi_boundary_url = "https://ditu.amap.com/detail/get/detail"
from transCoordinateSystem import gcj02_to_wgs84#TODO cityname为需要爬取的POI所属的城市名,city_areas为城市下面的行政区,classes为多个POI分类名的集合.
# (中文名或者代码都可以,代码详见高德地图的POI分类编码表)
cityname = '武汉'
city_areas = ['江岸区','江岸区','汉南区']
classes = [ '药房','商城']# 根据城市名称和分类关键字获取poi数据
def getpois(cityname, keywords):i = 1poilist = []while True:  # 使用while循环不断分页获取数据result = getpoi_page(cityname, keywords, i)print(result)result = json.loads(result)  # 将字符串转换为jsonif result['count'] == '0':breakhand(poilist, result)i = i + 1return poilist# 数据写入excel
def write_to_excel(poilist, cityname, classfield):# 一个Workbook对象,这就相当于创建了一个Excel文件book = xlwt.Workbook(encoding='utf-8', style_compression=0)sheet = book.add_sheet(classfield, cell_overwrite_ok=True)# 第一行(列标题)sheet.write(0, 0, 'x')sheet.write(0, 1, 'y')sheet.write(0, 2, 'count')sheet.write(0, 3, 'name')sheet.write(0, 4, 'address')sheet.write(0, 5, 'adname')for i in range(len(poilist)):location = poilist[i]['location']name = poilist[i]['name']address = poilist[i]['address']adname = poilist[i]['adname']lng = str(location).split(",")[0]lat = str(location).split(",")[1]#坐标转换result = gcj02_to_wgs84(float(lng), float(lat))lng = result[0]lat = result[1]# 每一行写入sheet.write(i + 1, 0, lng)sheet.write(i + 1, 1, lat)sheet.write(i + 1, 2, 1)sheet.write(i + 1, 3, name)sheet.write(i + 1, 4, address)sheet.write(i + 1, 5, adname)# 最后,将以上操作保存到指定的Excel文件中book.save(r'' + cityname + "_" + classfield + '.xls')# 将返回的poi数据装入集合返回
def hand(poilist, result):# result = json.loads(result)  # 将字符串转换为jsonpois = result['pois']for i in range(len(pois)):poilist.append(pois[i])# 单页获取pois
def getpoi_page(cityname, keywords, page):req_url = poi_search_url + "?key=" + amap_web_key + '&extensions=all&keywords=' + quote(keywords) + '&city=' + quote(cityname) + '&citylimit=true' + '&offset=25' + '&page=' + str(page) + '&output=json'data = ''with request.urlopen(req_url) as f:data = f.read()data = data.decode('utf-8')return data#按各行政区分别获取
'''
for clas in classes:classes_all_pois = []for area in nanning_areas:pois_area = getpois(area, clas)print('当前城区:' + str(area) + ', 分类:' + str(clas) + ", 总的有" + str(len(pois_area)) + "条数据")classes_all_pois.extend(pois_area)print("所有城区的数据汇总,总数为:" + str(len(classes_all_pois)))write_to_excel(classes_all_pois, cityname, clas)print('================分类:'  + str(clas) + "写入成功")
'''#直接获取整个城市的POI数据
for clas in classes:classes_all_pois = []pois_area = getpois(cityname, clas)classes_all_pois.extend(pois_area)print("数据总数为:" + str(len(classes_all_pois)))write_to_excel(classes_all_pois, cityname, clas)print('================分类:'  + str(clas) + "写入成功")

transCoordinateSystem.py

#!/usr/bin/env python
# -*- coding:utf-8 -*-#经纬度坐标(WGS84)国测局火星坐标(GCJ02)百度坐标(BD09)相互转换
'''
目前的的坐标体系分类:
一是GPS坐标,也即WGS-84坐标是一个国际的标准,一般卫星导航,原始的GPS设备中的数据都是采用这一坐标系。国外的Google地图、OSM等采用的都是这一坐标。
二是国测局坐标,国测局坐标GCJ-02坐标也叫火星坐标,是国家测绘局为了国家安全在原始坐标的基础上进行偏移得到的坐标,基本国内的电子地图、导航设备都是采用的这一坐标系,如:高德、搜搜、51地图MapABC地图,谷歌中国地图也是。
三是百度坐标,百度坐标BD-09坐标是百度公司出于商业保护在国测局坐标基础上进行的二次加密。
'''import json
import requests
import mathx_pi = 3.14159265358979324 * 3000.0 / 180.0
pi = 3.1415926535897932384626  # π
a = 6378245.0  # 长半轴
ee = 0.00669342162296594323  # 偏心率平方class Geocoding:def __init__(self, api_key):self.api_key = api_keydef geocode(self, address):"""利用高德geocoding服务解析地址获取位置坐标:param address:需要解析的地址:return:"""geocoding = {'s': 'rsv3','key': self.api_key,'city': '全国','address': address}# geocoding = urllib.urlencode(geocoding)# ret = urllib.urlopen("http://restapi.amap.com/v3/geocode/geo{}".format(geocoding))url = "http://restapi.amap.com/v3/geocode/geo?"ret = requests.get(url, params=geocoding)if ret.status_code == 200:# res = ret.json()# json_obj = json.loads(res)json_obj = ret.json()if json_obj['status'] == '1' and int(json_obj['count']) >= 1:geocodes = json_obj['geocodes'][0]lng = float(geocodes.get('location').split(',')[0])lat = float(geocodes.get('location').split(',')[1])return [lng, lat]else:return Noneelse:return Nonedef gcj02_to_bd09(lng, lat):"""火星坐标系(GCJ-02)转百度坐标系(BD-09)谷歌、高德——>百度:param lng:火星坐标经度:param lat:火星坐标纬度:return:"""z = math.sqrt(lng * lng + lat * lat) + 0.00002 * math.sin(lat * x_pi)theta = math.atan2(lat, lng) + 0.000003 * math.cos(lng * x_pi)bd_lng = z * math.cos(theta) + 0.0065bd_lat = z * math.sin(theta) + 0.006return [bd_lng, bd_lat]def bd09_to_gcj02(bd_lon, bd_lat):"""百度坐标系(BD-09)转火星坐标系(GCJ-02)百度——>谷歌、高德:param bd_lat:百度坐标纬度:param bd_lon:百度坐标经度:return:转换后的坐标列表形式"""x = bd_lon - 0.0065y = bd_lat - 0.006z = math.sqrt(x * x + y * y) - 0.00002 * math.sin(y * x_pi)theta = math.atan2(y, x) - 0.000003 * math.cos(x * x_pi)gg_lng = z * math.cos(theta)gg_lat = z * math.sin(theta)return [gg_lng, gg_lat]def wgs84_to_gcj02(lng, lat):"""WGS84转GCJ02(火星坐标系):param lng:WGS84坐标系的经度:param lat:WGS84坐标系的纬度:return:"""if out_of_china(lng, lat):  # 判断是否在国内return [lng, lat]dlat = _transformlat(lng - 105.0, lat - 35.0)dlng = _transformlng(lng - 105.0, lat - 35.0)radlat = lat / 180.0 * pimagic = math.sin(radlat)magic = 1 - ee * magic * magicsqrtmagic = math.sqrt(magic)dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)mglat = lat + dlatmglng = lng + dlngreturn [mglng, mglat]def gcj02_to_wgs84(lng, lat):"""GCJ02(火星坐标系)转GPS84:param lng:火星坐标系的经度:param lat:火星坐标系纬度:return:"""if out_of_china(lng, lat):return [lng, lat]dlat = _transformlat(lng - 105.0, lat - 35.0)dlng = _transformlng(lng - 105.0, lat - 35.0)radlat = lat / 180.0 * pimagic = math.sin(radlat)magic = 1 - ee * magic * magicsqrtmagic = math.sqrt(magic)dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * pi)dlng = (dlng * 180.0) / (a / sqrtmagic * math.cos(radlat) * pi)mglat = lat + dlatmglng = lng + dlngreturn [lng * 2 - mglng, lat * 2 - mglat]def bd09_to_wgs84(bd_lon, bd_lat):lon, lat = bd09_to_gcj02(bd_lon, bd_lat)return gcj02_to_wgs84(lon, lat)def wgs84_to_bd09(lon, lat):lon, lat = wgs84_to_gcj02(lon, lat)return gcj02_to_bd09(lon, lat)def _transformlat(lng, lat):ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + \0.1 * lng * lat + 0.2 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *math.sin(2.0 * lng * pi)) * 2.0 / 3.0ret += (20.0 * math.sin(lat * pi) + 40.0 *math.sin(lat / 3.0 * pi)) * 2.0 / 3.0ret += (160.0 * math.sin(lat / 12.0 * pi) + 320 *math.sin(lat * pi / 30.0)) * 2.0 / 3.0return retdef _transformlng(lng, lat):ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + \0.1 * lng * lat + 0.1 * math.sqrt(math.fabs(lng))ret += (20.0 * math.sin(6.0 * lng * pi) + 20.0 *math.sin(2.0 * lng * pi)) * 2.0 / 3.0ret += (20.0 * math.sin(lng * pi) + 40.0 *math.sin(lng / 3.0 * pi)) * 2.0 / 3.0ret += (150.0 * math.sin(lng / 12.0 * pi) + 300.0 *math.sin(lng / 30.0 * pi)) * 2.0 / 3.0return retdef out_of_china(lng, lat):"""判断是否在国内,不在国内不做偏移:param lng::param lat::return:"""return not (lng > 73.66 and lng < 135.05 and lat > 3.86 and lat < 53.55)if __name__ == '__main__':lng = 116.382997lat = 39.915156result1 = gcj02_to_bd09(lng, lat)result2 = bd09_to_gcj02(lng, lat)result3 = wgs84_to_gcj02(lng, lat)result4 = gcj02_to_wgs84(lng, lat)result5 = bd09_to_wgs84(lng, lat)result6 = wgs84_to_bd09(lng, lat)g = Geocoding('apikey')  # 这里填写你的高德api的keyresult7 = g.geocode('武汉市汉南区')
print(result1, result2, result3, result4, result5, result6, result7)

高德地图POI数据爬取相关推荐

  1. Python爬虫|高德地图地铁数据爬取与制图

    目录 一.高德地图数据爬取 1.爬取思路 2.python核心代码 二.Arcmap制图 一.高德地图数据爬取 1.爬取思路 首先,谷歌浏览器打开高德地图官网,点击上方菜单栏地铁进入地铁线路网站如下, ...

  2. 百度地图POI数据爬取,突破百度地图API爬取数目“400条“的限制11。

    1.POI爬取方法说明 1.1AK申请 登录百度账号,在百度地图开发者平台的API控制台申请一个服务端的ak,主要用到的是Place API.检校方式可设置成IP白名单,IP直接设置成了0.0.0.0 ...

  3. python爬取百度地图数据_百度地图POI数据爬取

    利用百度地图开发者中心中的web API获取城市POI数据,后期会写出完整的多种参数详细数据获取教程.本次只写出了根据关键词和目的地的数据获取程序. 将爬取下来的数据保存到本地csv文件. 百度API ...

  4. 高德地图交通态势爬取并存入MySQL数据库

    高德地图交通态势爬取并存入mysql数据库 高德地图交通态势开放api链接: 高德交通态势 高德地图交通态势使用流程: 第一步,申请"Web服务API接口"密钥(Key): 第二步 ...

  5. 【数据工具】高德地图POI数据下载工具(支持选择省市以及POI类型)

    1. 工具介绍 今天分享一个能够实现零代码获取高德地图POI数据的工具. 该工具目前支持通过框选地图以及点选省或市的方式输入数据下载范围.另外,支持通过点选的方式选择想要获取的POI类型. 获取方式在 ...

  6. 【数据工具】高德地图POI数据下载工具v1.3(新增输入POI关键词+稳定性提高)

    1. 工具介绍 今天分享一个能够实现零代码获取高德地图POI数据的工具. 该工具当前版本号为v1.3,主要功能特点包括: 支持通过拉框多边形以及点选省或地级市的方式输入POI数据下载范围 支持多选输入 ...

  7. 实用工具|零代码实现高德地图POI数据下载

    1 工具获取方式 点击下面链接,即可获取地理坐标系转换工具 地理坐标系转换工具 2 工具介绍 高德地图POI数据下载工具(下文称该工具)是一款能够让用户在不写代码的前提下实现高德地图POI数据批量下载 ...

  8. 高德地图POI数据2020年高德POI

    高德地图POI是Point of Interest"的缩写,可以翻译成兴趣点,一共有三级分类(大类.中类.小类),其中一级分类有23个. 涵盖餐饮服务.购物服务.生活服务.体育休闲服务.医疗 ...

  9. java中poi搜索工程_爬取高德地图poi数据

    高德地图搜索poi的api介绍地址 当前想法是爬取目标区域(作者所在小县城)的所有poi数据,存到数据库中作为原始数据,然后供其它系统调用,因为之前爬取过百度地图的poi数据,所以这次工作就驾轻就熟了 ...

  10. 爬取高德地图poi数据

    高德地图搜索poi的api介绍地址 当前想法是爬取目标区域(作者所在小县城)的所有poi数据,存到数据库中作为原始数据,然后供其它系统调用,因为之前爬取过百度地图的poi数据,所以这次工作就驾轻就熟了 ...

最新文章

  1. python合并csv文件_PYTHON合并CSV文件的实践
  2. Asp.NetCoreWebApi入门 - 从零开始新建api项目
  3. 信奥中的数学:计算几何
  4. 起点计算机网,《零起点计算机》网第5课.pdf
  5. 转载 webstrom识别 React语法
  6. 书单丨5本书带你学习Kubernetes,掌控云计算的未来
  7. 在Windows系统上安装zookeeper
  8. 命令提示符cmd以管理员身份运行的快捷键
  9. 苹果手机自带表格软件_手机自带的软件无法卸载?教你一招”!
  10. 逆向与破解-windows异常处理机制
  11. 斑马条码打印机常见故障大盘点
  12. redis Lettuce客户端
  13. 表空间的相关查询命令
  14. 淘淘商城第51讲——从商城首页跳转到搜索页面
  15. SpringBoot 下载打包图片
  16. 尽管有节制的努力,pinterest仍保留着年轻女孩的反色情模因图片
  17. Web3.0时代来临。企业该如何无痛接轨、加值商模?
  18. Opencv简单介绍
  19. 【AGM】《风色幻想:纷争—luca篇》总之这是一个没空填的坑
  20. 搭档之家|生活中的经济学:边际效用递减

热门文章

  1. 使用 visio 画软件结构图
  2. 【linux运维】linux运维常用工具有哪些?
  3. FineReport10.0功能说明
  4. 中巨伟业加密芯片—SMEC98SP (SE98)在产品授权生产防复制的应用方法
  5. mac使用Java命令运行Java程序
  6. python 成语库_Python“Every Other Element”成语
  7. c语言九九乘法表的值,c语言九九乘法表!
  8. java安卓开发——1.新项目搭建
  9. CSDN博客下载器v2.0发布(导出PDF)
  10. 关于CCS软件的Graph功能使用详解