【新征程】4、爬虫爬取百度POI检索

【目的】

最近毕设在做一个城市功能属性分析,用一些自然语言模型处理一些交通数据,挖掘其中潜在的语义规律,但是得到的语义规律需要用到百度地图上的POI信息。
相关的百度POI接口详见:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi

我现在得到的是经过处理的三个主题,并且在地图上进行显示了。
在这里插入图片描述
需要对这些不同的主题网格,进行统计POI不同的兴趣点的个数,从而判别每个主题的功能属性是什么。

【实现思路】

百度POI信息有3钟方式可以获取,但是现在我已经有网格数据,所以选择矩形区域实现。
在这里插入图片描述
采用Python爬虫获取会比较方便一点。

  • 组织一个Url
  • 先跑一个区域
  • 跑所有区域
import json
from urllib.request import urlopen
import requests
import time
catagory_new = ["美食", "酒店", "购物", "服务", "户外休闲", "专业机构", "交通设施", "房地产", "公司企业"]
catagory_old = [["美食"], ["酒店"], ["购物"], ["生活服务", "汽车服务", "金融"], ["丽人", "旅游景点", "休闲娱乐", "运动健身"],
                ["医疗", "教育培训", "文化传媒", "政府机构"], ["交通设施"], ["房地产"], ["公司企业"]]


def get_all_poi_num_of_one_area(area_loc):
    catagory_new_num_one_area = [0,0,0,0,0,0,0,0,0]
    for i in range(len(catagory_old)):
        query = ""
        if len(catagory_old[i])==1:
            query = catagory_old[i][0]
        else:

            for j in range(len(catagory_old[i])-1):
                one = catagory_old[i][j]+"$"
                query += one
            query+=catagory_old[i][-1]
        # print (query)
        url = get_url(query,area_loc)

        result_num = spider_serach_one_url(url)
        catagory_new_num_one_area[i] += result_num
    return catagory_new_num_one_area

def get_url(query,area_loc):
    url = "http://api.map.baidu.com/place/v2/search?query="+ query +"&bounds="+ area_loc +"&output=json&ak=sBGbqBPdD96c4wCGKm7eIvV02ZsK33Hd"
    print(url)
    return url

def spider_serach_one_url(url):

    res = requests.get(url)
    res.encoding = 'utf-8'
    # print (res.text)
    res_json = json.loads(res.text)
    time.sleep(0.5)
    try:
        if len(res_json["results"])==0:
            return 0

        print(len(res_json["results"]))
        return len(res_json["results"])
    except:
        print("expect")
        return 0



def main(json_path):
    import json
    with open(json_path,'r') as load_f:
         load_json = json.load(load_f)
    # print(load_json)
    loc_data = load_json["grid_list"]


    loc_area_topic = []
    for i in range(len(loc_data)):

        loc_area_one_topic = []
        for j in range(0,len(loc_data[i]),4):
            area_loc = str(loc_data[i][j])+","+str(loc_data[i][j+1])+","+str(loc_data[i][j+2])+","+str(loc_data[i][j+3])
            loc_area_one_topic.append(area_loc)
        print (loc_area_one_topic)
        loc_area_topic.append((loc_area_one_topic))
    print(loc_area_topic)

    catagory_num_all_topic = []

    for i in range(len(loc_area_topic)):
        print("主题%d开始计数............................."%i)
        catagory_new_num_topic_all_area = [0, 0, 0, 0, 0, 0, 0, 0, 0]
        for j in range(len(loc_area_topic[i])):
            catagory_new_num_topic_one_area = get_all_poi_num_of_one_area(loc_area_topic[i][j])
            for k in range(len(catagory_new)):
                catagory_new_num_topic_all_area[k]+=catagory_new_num_topic_one_area[k]
            print(catagory_new_num_topic_all_area)
        catagory_num_all_topic.append(catagory_new_num_topic_all_area)
        print(catagory_num_all_topic)
    return catagory_num_all_topic
if __name__ == '__main__':


    # get_all_poi_num_of_one_area(1)
    data_path = "../data/grid_list.json"
    main(data_path)
    # spider_serach(url)

代码不长,也很简单。
其中用到的一个网格数据是我自己在其他地方产生的。

“…/data/cardno_example_data.csv”

{"grid_list":[[30.29999978787879,120.150158,30.302942575757577,120.15395218181818,30.24114403030303,120.18051145454545,30.244086818181817,120.18430563636363]]}

在这里插入图片描述
得到的结果是这样的。爬去到了数据是一个39的二维数组
说明一下,我自己的数据是因为要得到不同区域的PO数量,目的最终还是分析主题的功能属性。所有我把3个主题作为主要的主题,得到一个3
9的二维数组,其中用到9是因为,我将百度地图的POI类别重新组织了一下。

在这里插入图片描述

最终得到数据就好。

【注意事项】

我在爬数据的时候,会碰到百度地图一天内爬取限额。这个只需要认证一下。还比较简单,认证网址
在这里插入图片描述
在这里插入图片描述

好了就这些。代码很简单。自己看把。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值