【0基础用python爬取高德POI数据】

0基础用python爬取高德POI数据

真真python都没有的,先看这篇

先看这个【00基础】配置好python环境

0、说在最前面

POI数据真的使用非常广泛了。但是对于大多人普通而言,哪怕现在有了chatGPT这种高级助理,也不知道怎么入手提问,或者问了,对着操作都会有一堆问题。作为一个代码小白,折腾了一大圈,并且指导了另一位真0基础的同事达成随心获取高德POI数据,分享给需要的人。

回答疑问

不知道流程:从0开始给你写清楚步骤
不会写python,给你原代码,会复制粘贴就行。
教你使用和修改参数,以便于真的多次使用。

大致流程

注册高德,获取接口代码
下载annaconda,准备好Python运行环境
复制代码(我会直接贴出来)
代码使用方式

1、注册高德,获取接口key

1.1 注册高德开放平台

高德开放平台:高德开放平台
高德开放平台网页
点击注册,按照引导注册账号,注册成功后登录。注册页面

1.2 获得key

点击控制台 —> 应用管理—> 我的应用

我的应用
点击创建新应用
创建新应用
在这里插入图片描述
添加key
创建key

key
红色框里这一串,就是高德接口的key码,后面代码里会用到。你也可以多建几个换着用。

已经有很多现成的爬取数据的小软件了,需要输入key的,到这一步就可以啦。(有一些连key都不要你输入的,简单统计统计还行,但是可能有数据不准确以及数据较老的问题。)

2、准备好Python运行环境

这个是比较容易遇到的问题,代码随处都有,chatGPT也能给你写一个,但是,不知道哪里入手使用。以及其他的代码,也是不知道怎么操作,可以参考这一步,给真0基础,像一样不知道python是什么的那种0基础。

不要纠结python是什么以及有什么语法这些,会用就行了。

2.1 安装Anaconda

推荐小白直接使用Anaconda。因为使用GIS的会有python2.7版本困扰,现在代码基本都是3.x的,代码和工具包搞起来都太烦了,直接使用完整的环境包更方便。

下载(免费的!):Anaconda
在这里插入图片描述
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的表格
打开后是这样:
在这里插入图片描述

  • 60
    点赞
  • 181
    收藏
    觉得还不错? 一键收藏
  • 35
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值