根据城市名和分类名爬取对应的POI数据(基于高德地图)

原文地址:https://liujiao111.github.io/2019/06/17/gmap-poi/

写在前面

目前已经将该功能做成一个在线的工具,指定需要的城市以及分类名即可导出数据在本地,特别方便,欢迎使用。地址:

http://www.mapboxx.cn/tool/poiview/

欢迎加入地图数据爬取交流群:626697156

温馨提示

如果上面的在线工具导出的数据满足你的需求的话下面的就不用看啦。

背景

由于在很多情况下,我们需要爬取某个城市的一个分类下面的POI数据,比如需要南宁的所有大学、图书馆等POI数据,这时我们可以借助爬虫,基于高德地图提供的数据接口,爬取POI数据,后续可以基于数据做数据分析等。那么应该如何爬取数据呢?这里提供了一份基于python进行数据爬取的代码,可以爬取一个城市的分类POI数据。
步骤及代码如下:

首先,需要在高德地图开放平台上注册账号,并且申请web服务的密钥,地址:https://lbs.amap.com/dev/key/app

根据城市名和分类名爬取对应的POI数据(基于高德地图)_第1张图片
申请成功后在管理控制台看到key密钥,需要注意的是密钥必须为web服务的。根据城市名和分类名爬取对应的POI数据(基于高德地图)_第2张图片记得保存下来,在后面的代码中使用。

在pycharm中粘贴如下代码:
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所属的城市名,nanning_areas为城市下面的所有区,classes为多个分类名集合. (中文名或者代码都可以,代码详见高德地图的POI分类编码表)
cityname = '南宁'
nanning_areas = ['青秀区','兴宁区','江南区','良庆区','邕宁区','西乡塘区','武鸣区']

classes = ['商场', '银行']


# 根据城市名称和分类关键字获取poi数据
def getpois(cityname, keywords):
    i = 1
    poilist = []
    while True:  # 使用while循环不断分页获取数据
        result = getpoi_page(cityname, keywords, i)
        print(result)
        result = json.loads(result)  # 将字符串转换为json
        if result['count'] == '0':
            break
        hand(poilist, result)
        i = i + 1
    return 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')


    for i in range(len(poilist)):
        location = poilist[i]['location']
        name = poilist[i]['name']
        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)



    # 最后,将以上操作保存到指定的Excel文件中
    book.save(r'' + cityname + "_" + classfield + '.xls')


# 将返回的poi数据装入集合返回
def hand(poilist, result):
    # result = json.loads(result)  # 将字符串转换为json
    pois = 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) + "写入成功")

如果发现少了包,安装对应的依赖即可。
然后运行代码,即可将爬取到的数据写入到当前代码文件目录下的excel文件中。目前excel中的POI数据只有三个有效字段:经度、纬度、名称,如果需要其他字段可以自行加入,并且经纬度的坐标是高德坐标系。

你可能感兴趣的:(地图,python)