• 高德地图POI爬取_Python


    高德地图POI

    官方文档解释

    • 高德地图的搜索API是一种HTTP接口,提供了多种查询POI信息的能力。

    • HTTP接口则必须要使用URL进行请求,也就要通过URL进行参数配置(URL为统一资源定位器),不同的参数获取到不同的数据

    • URL由三部分组成

      • 完整的URL

      • https://restapi.amap.com/v3/place/text?keywords=北京大学&city=beijing&output=xml&offset=20&page=1&key=<用户的key>&extensions=all
        
      1. 该HTTP接口通用前缀,这部分URL是写死的,不需要更改

      2. 搜索模式,共有4种搜索模式:关键字搜索、周边搜索、多边形搜索、ID查询

      3. 请求参数,请求参数可以有很多,请求参数跟在搜索模式中的?后面。一个参数对应一个值(可以对应多个,见官方文档),表现形式为参数名在前,参数值在后,中间用等于号隔开,即key=value,不同的参数之间使用 & 隔开。

        1. https://restapi.amap.com/v3/place/
        2. text?   (还可以为 around? 、 polygon? 、 detail?)
        3. keywords=北京大学&city=beijing&output=xml&offset=20&page=1&key=<用户的key>&extensions=all
        
    • 请求参数列表全部在官网中,不同的搜索模式参数列表有部分不同,根据不同模式选择请求参数

    image-20200907184024474
    • 请求正确会返回参数,四个搜索模式返回的参数相同,参数的处理见后文程序解释image-20200907183804560

    URL确定示例:多边形区域POI搜索

    搜索所需范围:

    B地块

    搜索所需POI类型:

    除了风景名胜、政府机构社会团体、商务住宅、公司企业、道路附属设施、地名地址信息、事件活动等所有POI

    基础URL确定:

    根据官网参数列表,关键参数为polygon与types,types在Python程序中拼接

    polygon为经纬度坐标,可以在百度拾取坐标系统中点选:http://api.map.baidu.com/lbsapi/getpoint/

    image-20200907185447436
    1. https://restapi.amap.com/v3/place/polygon?
    2. key=<用户自己的key>
    3. &polygon=119.182037,26.075818|119.179558,26.069976|119.180349,26.064297|119.185738,26.065887|119.191919,26.064978|119.190841,26.060013|119.192997,26.056215|119.196473,26.055201|119.192916,26.061725|119.193814,26.062309|119.19482,26.060297|119.196329,26.061011|119.194245,26.064808|119.192808,26.068411|119.184795,26.075064|119.182037,26.075818
    4. &city=350100(可选,避免经纬度与城市出现偏差)

    Python程序解释

    主程序

    • 为了查看清晰,将源代码中一些用于显示的代码和注释删除
    • 在程序的每一步中,如果对变量的内容、类型不清楚,可以用代码print(data) print(type(data))在控制台中输出相应的内容进行查看
    # API的URL,在这里进行了结构化处理
    # URL分成三段便于在for循环中拼接URL,从而改变关键字条件
    main_url_head='http://restapi.amap.com/v3/place/text?key=c3e7956a4c43bdbe87e03d2fe6af7545&city=350802&keywords=&types='
    main_url_mid='&offset=20&page='
    main_url_tail='&extensions=all'
    
    # 用于储存结果数据,放置到csv中
    x = []
    # 用于计数
    num = 0
    # sort为搜索类型(即请求参数列表中的types)
    sort=['010000','020000','030000','040000','040000','040000','050000','060000','070000','080000','090000','100000','140000','150000','160000','200000',]
    
    # 对每种sort(即)
    for i in sort:
      
      	# 最新文档中表明可以一次查询100页,如果数据未超过
        for page in range(1,46):
            # 对URL进行拼接,改变sort、page变量,
            # 如果页数到达for循环限制的最大值,则可以考虑进行POI类型(types)更细的切分
            thisUrl = main_url_head + i +main_url_mid + str(page) +main_url_tail
            # 获取POI数据,通过requests.get()发起HTTP请求,使用data变量接受返回的数据
            data = requests.get(thisUrl)
            # 转为JSON格式
            s = data.json()
            # 解析JSON,
            aa = s["pois"]
            # 若解析的JSON为空,即当前的数据不够45页(即没有达到限制),返回
            if len(aa) == 0:
                break
            # 根据官网的返回参数列表,选择想要的数据,并且对每条POI进行存储
            for k in range(0, len(aa)):
                s1 = aa[k]["name"] # ["name"]等即为上文提到的返回结果参数中的成员,在这里可以任意选择参数并储存
                s2 = aa[k]["type"]
                if("address" in aa[k]): # 有些返回的Json对象中不存在address字段,在使用时最好先进行判断
                    s3 = aa[k]["address"]
                else:
                    s3 = ""
                s4 = aa[k]["location"]
                x.append([s1, s2, s3, s4])
    
    
    # 将数据结构化存储至规定目录的CSV文件中
    c = pd.DataFrame(x)
    c.to_csv('./DataVer4.csv', encoding='utf-8-sig')
    

    经纬度分割程序

    # 打开爬取的数据
    with open('DataVer4.csv','r') as f:
        reader = csv.reader(f)
        next(reader)
    
        rowSplited = []
        output = []
        for row in reader:
            rowSplited = row[0:4]
            #将第4列,即经纬度所在列根据符号 ',' 进行分割,并储存数据
            rowSplited.append(row[4].split(',')[0])
            rowSplited.append(row[4].split(',')[1])
            output.append(rowSplited)
    
    # 将处理后的数据存放到新的csv文件中
    with open('DataVer4_processed.csv','w',newline='',encoding='utf-8-sig') as f:
        writer = csv.writer(f)
        writer.writerows(output)
    
  • 相关阅读:
    证明最大公约数Stein算法(高精度算法)
    链表常用内容和易犯错误
    斐波那契数列——各种公式证明
    用矩阵和待定系数法求数列的分析(复杂度log(n))
    盒模型(外边距)
    盒子模型(内边距)
    盒子模型(边框)
    jupyterhub
    1分钟k线图能反映什么?(转)
    python的self
  • 原文地址:https://www.cnblogs.com/Yuasin/p/13633976.html
Copyright © 2020-2023  润新知