比起普通的静态网页爬虫,爬高德地图的麻烦之处在于API中存在参数。这需要我们首先要对高德地图API有个基本的了解。
登录高德地图API网站,点击“开发文档”,找到下图中的“地理/逆地理编码API”处,点击进入。
我们可以看到一个API,其问号前面的部分是固定不变的,而问号后面的是参数部分。高德地图此处罗列了7个参数,包括2个必选参数,以及5个可选参数。这两个必选参数,一个是高德key,需要注册;另一个是参数address,比如人民公园。你也许需要的是南京的人民公园的经纬度信息,凑巧的是,北京也有一个人民公园。参数city的存在可以限定地址信息的范围,确保你获取的是南京的人民公园经纬度。参数output值得关注,默认的输出结果是json格式。
如果我需要的不是某个建筑的经纬度,而是某个行政区域的呢?打个比方,我不想要南京的人民公园的经纬度,我想要的是南京市的经纬度。这样也是可以实现的,只需要参数address直接填入“南京市”即可,这便不需要参数city了。这样得出的经纬度,一般是各地行政中心所在的经纬度。
下面,我将爬取南京市的经纬度。
import requests
import json
url = 'https://restapi.amap.com/v3/geocode/geo' # 输入API问号前固定不变的部分
params = { 'key': '你的高德密钥',
'address': '南京市' } # 将两个参数放入字典
res = requests.get(url, params)
res.text
输出结果如下:
输出结果是json格式,需要用到json模块将其转化为Python字典。
jd = json.loads(res.text)
jd
输出结果如下:
coords = jd['geocodes'][0]['location']
coords
输出结果如下:
这,便是南京市坐标。
为了方便起见,将上面过程整合为函数。
import requests
import json
def coords(city):
url = 'https://restapi.amap.com/v3/geocode/geo' # 输入API问号前固定不变的部分
params = { 'key': '你的高德密钥',
'address': city } # 将两个参数放入字典
res = requests.get(url, params)
jd = json.loads(res.text)
return jd['geocodes'][0]['location']
下面,在自变量位置输入“南京市”,检验下函数正确性。
当大批量处理时,使用for循环即可。