用python爬取高德POI数据,真0基础
0基础用python爬取高德POI数据
真真python都没有的,先看这篇
0、说在最前面
POI数据真的使用非常广泛了。但是对于大多人普通而言,哪怕现在有了chatGPT这种高级助理,也不知道怎么入手提问,或者问了,对着操作都会有一堆问题。作为一个代码小白,折腾了一大圈,并且指导了另一位真0基础的同事达成随心获取高德POI数据,分享给需要的人。
回答疑问
不知道流程:从0开始给你写清楚步骤
不会写python,给你原代码,会复制粘贴就行。
教你使用和修改参数,以便于真的多次使用。
大致流程
注册高德,获取接口代码
下载annaconda,准备好Python运行环境
复制代码(我会直接贴出来)
代码使用方式
1、注册高德,获取接口key
1.1 注册高德开放平台
高德开放平台:高德开放平台
点击注册,按照引导注册账号,注册成功后登录。
1.2 获得key
点击控制台 —> 应用管理—> 我的应用
点击创建新应用
红色框里这一串,就是高德接口的key码,后面代码里会用到。你也可以多建几个换着用。
已经有很多现成的爬取数据的小软件了,需要输入key的,到这一步就可以啦。(有一些连key都不要你输入的,简单统计统计还行,但是可能有数据不准确以及数据较老的问题。)
2、准备好Python运行环境
这个是比较容易遇到的问题,代码随处都有,chatGPT也能给你写一个,但是,不知道哪里入手使用。以及其他的代码,也是不知道怎么操作,可以参考这一步,给真0基础,像一样不知道python是什么的那种0基础。
不要纠结python是什么以及有什么语法这些,会用就行了。
2.1 安装Anaconda
推荐小白直接使用Anaconda。因为使用GIS的会有python2.7版本困扰,现在代码基本都是3.x的,代码和工具包搞起来都太烦了,直接使用完整的环境包更方便。
下载(免费的!):Anaconda
等待下载,可能时间会有点久,且等着。
下载完后安装(安装不贴了)。
安装完后,就有一堆东西了,后面会用到。
3、代码使用说明
3.1 代码说明
其实没什么好说明的,我代码直接给你,你会复制粘贴就行。告诉你改哪里。
我知道很多分享代码的人都设置了信息壁垒,比如把爬数据的代码和坐标转换的代码换文件名啥的。为了解决这个问题,我直接把坐标转换嵌入到了代码里,不存在需要两个文件需在同一文件里这些限制。
一个代码就能用。成果坐标已转换为WGS-84
贴上代码
# -*- coding: utf-8 -*-
"""
@author: Joy_cxz
CSDN:https://blog.csdn.net/cxz_0030115?spm=1010.2135.3001.5421
"""
import requests
import json
import xlwt
import math
# 改:TODO
amap_web_key = 'key1' # 高德地图官网申请的Web API KEY
filename = r'C:/Desktop/test.xls' # 爬取到的数据写入的EXCEL路径
# 改:多边形边界集合:
polygon_list = ['112.511844,30.7|112.5227,30.6']
# 改:POI分类集合, 多个类型用竖线 | 分割;
type_list = '140000' # |060402|060403|060404|060405|060406|060407|060408|060409|060411|060413|060414|060415|060100|060101|060102|060103'
#=========================下面不用改=====================================
poi_search_url = "http://restapi.amap.com/v3/place/polygon" # URL
offset = 25 # 分页请求数据时的单页大小
def gcj02_to_wgs84(lon, lat):
a = 6378245.0
ee = 0.00669342162296594323
pi = 3.14159265358979324
def transform_lon(x, y):
ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * \
y * y + (0.1 * x * x * x) + \
(0.2 * x * x * y) + (0.1 * x * y * y) + \
(0.1 * y * y * y) + (0.1 * x * x * x * x) + \
(0.2 * x * x * x * y) + (0.2 * x * x * y * y) + \
(0.1 * x * y * y * y)
return ret
def transform_lat(x, y):
ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * \
y + 0.1 * x * y + 0.2 * \
x * x + (0.1 * x * x * x) + \
(0.1 * x * y * y) + (0.1 * x * x * y)
return ret
def transform(x, y):
d_lat = transform_lat(x - 105.0, y - 35.0)
d_lon = transform_lon(x - 105.0, y - 35.0)
rad_lat = y / 180.0 * pi
magic = math.sin(rad_lat)
magic = 1 - ee * magic * magic
sqrt_magic = math.sqrt(magic)
d_lat = (d_lat * 180.0) / ((a * (1 - ee)) / (magic * sqrt_magic) * pi)
d_lon = (d_lon * 180.0) / (a / sqrt_magic * math.cos(rad_lat) * pi)
mg_lat = y + d_lat
mg_lon = x + d_lon
return [x * 2 - mg_lon, y * 2 - mg_lat]
return transform(lon, lat)
# 根据矩形坐标获取poi数据
def getpois(polygon, type_list):
i = 1
current_polygon_poi_list = []
while True: # 使用while循环不断分页获取数据
result = getpoi_page(polygon, i, type_list)
result = json.loads(result) # 将字符串转换为json
if result['status'] != '1': # 接口返回的状态不是1代表异常
print('======爬取错误,返回数据:' + result)
break
pois = result['pois']
if len(pois) < offset: # 返回的数据不足分页页大小,代表数据爬取完
current_polygon_poi_list.extend(pois)
break
current_polygon_poi_list.extend(pois)
i += 1
print('===========当前polygon:', polygon, ',爬取到的数据数量:', str(len(current_polygon_poi_list)))
return current_polygon_poi_list
# 单页获取pois
def getpoi_page(polygon, page, type_list):
print(polygon)
req_url = poi_search_url + "?key=" + amap_web_key + '&extensions=all&polygon=' + polygon + '&offset=' + str(
offset) + '&types=' + type_list + '&page=' + str(page) + '&output=json'
data = ''
with requests.get(req_url) as response:
data = response.text
print(data)
return data
# 数据写入excel
def write_to_excel(poilist, filename):
# 一个Workbook对象,这就相当于创建了一个Excel文件
book = xlwt.Workbook(encoding='utf-8', style_compression=0)
sheet = book.add_sheet('0', cell_overwrite_ok=True)
# 第一行(列标题)
sheet.write(0, 0, 'id')
sheet.write(0, 1, 'name')
sheet.write(0, 2, 'lon')
sheet.write(0, 3, 'lat')
sheet.write(0, 4, 'address')
sheet.write(0, 5, 'pname')
sheet.write(0, 6, 'cityname')
sheet.write(0, 7, 'adname')
sheet.write(0, 8, 'type')
for i in range(len(poilist)):
sheet.write(i + 1, 0, poilist[i]['id'])
sheet.write(i + 1, 1, poilist[i]['name'])
lon = float(str(poilist[i]['location']).split(",")[0])
lat = float(str(poilist[i]['location']).split(",")[1])
# 将高德坐标转换为WGS 84坐标
lon, lat = gcj02_to_wgs84(lon, lat)
sheet.write(i + 1, 2, lon)
sheet.write(i + 1, 3, lat)
sheet.write(i + 1, 4, poilist[i].get('address'))
sheet.write(i + 1, 5, poilist[i].get('pname'))
sheet.write(i + 1, 6, poilist[i].get('cityname'))
sheet.write(i + 1, 7, poilist[i].get('adname'))
sheet.write(i + 1, 8, poilist[i]['type'])
book.save(filename)
print('开始爬取...')
all_poi_list = [] # 爬取到的所有数据
for polygon in polygon_list:
polygon_poi_list = getpois(polygon, type_list)
all_poi_list.extend(polygon_poi_list)
print('爬取完成,总的数量:', len(all_poi_list))
write_to_excel(all_poi_list, filename)
print('写入成功')
3.2 代码使用
3.2.1 补充准备(装载需要的包)
代码会用到一些扩展包,你不知道有没有,就挨个装一遍。
打开这个:
输入
conda install requests
conda install json
conda install xlwt
conda install math
等待,可能会有点久,跑完你会知道的。
跑完会重新出现这样的,就像你最开始打开一样。
3.2.2 打开运行软件
打开这个软件:
点这里新建一个文件,然后把代码复制进去,保存为高德POI获取_WGS84.py
3.2.3 修改参数
修改key和文件路径
一共有4个需要修改的地方,前两个简单。
获取范围坐标
获取边界坐标,最简单的方式,矩形。左上右下点。
高德POI坐标获取
获取你要的范围左上角和右下角的点位,复制黏贴修改到代码中,注意符号。
获取POI分类代码
高德提供的代码表,选择自己想要的类别,注意大小类的代码有一定规律。
六位代码:大类+种类+小类
高德编码:Web服务 API 相关下载
3.2.5 运行
你都改好了是吧,点这个
运行时红框内会看到信息,运行完会跟你说写入成功
你会获得一个后缀为.xls
的表格
打开后是这样: