最近毕设在做一个城市功能属性分析,用一些自然语言模型处理一些交通数据,挖掘其中潜在的语义规律,但是得到的语义规律需要用到百度地图上的POI信息。
相关的百度POI接口详见:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi
我现在得到的是经过处理的三个主题,并且在地图上进行显示了。
需要对这些不同的主题网格,进行统计POI不同的兴趣点的个数,从而判别每个主题的功能属性是什么。
百度POI信息有3钟方式可以获取,但是现在我已经有网格数据,所以选择矩形区域实现。
采用Python爬虫获取会比较方便一点。
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个主题作为主要的主题,得到一个39的二维数组,其中用到9是因为,我将百度地图的POI类别重新组织了一下。
最终得到数据就好。
我在爬数据的时候,会碰到百度地图一天内爬取限额。这个只需要认证一下。还比较简单,认证网址
好了就这些。代码很简单。自己看把。