本文思路如下:调用百度地图API获取某区域内所有中学信息,依次获得每个中学的地理坐标,查询该坐标一定半径周围内所有网吧数据,将学校数据和网吧数据依次存入txt文件中。
一、百度地图API密钥申请
申请地址:
需要登陆百度账号,在控制台标签栏下点击创建应用,如下图:
选择浏览器端和地点检索(其他服务也可以选择),白名单填*即可。
申请成功后即可看到如下界面,箭头所示即为AK。
二、主程序编写
本程序使用Python版本为2.7,其中有些语句在Python3中不能使用,需要注意。
程序代码如下:
1 # -*- coding: utf-8 -*- 2 import urllib,json 3 4 #生成Josn数据 5 def create_json(url): 6 url_file = urllib.urlopen(url) 7 json_file = url_file.read() 8 json_dict = json.loads(json_file) 9 return json_dict10 #解析Josn数据,并返回为List11 def read_json(json_dict,pois_list):12 #依次读取Json数据,保存到List中13 for text in json_dict["results"]:14 poi_list = []15 #只获取目标地点的名称和坐标,用于后续计算16 poi_list.append(text["name"])17 poi_list.append(text["location"])18 pois_list.append(poi_list)19 return pois_list20 21 #程序主函数22 if __name__ == "__main__":23 # 设置URL参数24 ak = "OUnZ4Y8Ew74v5mGtdMp2gU9hxkXimMbh" #访问AK,注意可能会被限制25 #加Fir前缀的均为首要查询目标数据26 Fir_KeyWord = "中学"27 Fir_region = "武昌区"28 # 加Sec前缀的均为次要查询目标数据29 Sec_KeyWord = "网吧"30 page_size = 2031 Fir_page_num = 032 Fir_url = "http://api.map.baidu.com/place/v2/search?ak=" + str(ak) + "&output=json&query=" + \33 str(Fir_KeyWord) + "®ion=" + str(Fir_region) + "&page_size=" + str(page_size) + "&page_num=" + str(Fir_page_num)34 # 查取URL的信息,并将数据保存在List中35 Fir_pois_list = []36 Fir_json_dict = create_json(Fir_url)37 Fir_pois_list = read_json(Fir_json_dict, Fir_pois_list)38 Fir_total = int(Fir_json_dict["total"]) # 记录数据总数39 print(str(Fir_region) + "共有" + str(Fir_total) + "个" + str(Fir_KeyWord) + "!")40 # 将数据写入TXT文件41 f = open('result.txt', 'w')42 f.write(str(Fir_region) + "共有" + str(Fir_total) + "个" + str(Fir_KeyWord) + "! 周边" + str(Sec_KeyWord) + "具体信息如下:\n")43 44 #记录数据页数45 Fir_Page = Fir_total / page_size + 146 while (Fir_page_num < Fir_Page):47 Fir_num = Fir_page_num * page_size # 定义学校个数48 for Fir_poi_list in Fir_pois_list:49 Fir_num += 150 f.write(str(Fir_num) + "," + Fir_poi_list[0].encode("utf-8") + "\n")51 # 获取每个学校的经纬度坐标52 Sec_location_lat = Fir_poi_list[1]["lat"]53 Sec_location_lng = Fir_poi_list[1]["lng"]54 # 设置半径为50055 radius = 50056 Sec_page_num = 057 Sec_url = "http://api.map.baidu.com/place/v2/search?ak=" + str(ak) + "&output=json&query=" + \58 str(Sec_KeyWord) + "&location=" + str(Sec_location_lat) + "," + str(Sec_location_lng) + "&page_size=" + \59 str(page_size) + "&page_num=" + str(Sec_page_num) + "&radius=" + str(radius)60 Sec_pois_list = []61 Sec_json_dict = create_json(Sec_url)62 Sec_pois_list = read_json(Sec_json_dict, Sec_pois_list)63 Sec_total = int(Sec_json_dict["total"]) #记录这一学校周边网吧总数64 Sec_Page = Sec_total / page_size + 1 #记录数据页数65 while (Sec_page_num < Sec_Page):66 Sec_num = Sec_page_num * page_size # 定义网吧个数67 for Sec_poi_list in Sec_pois_list:68 Sec_num += 169 f.write(str(Fir_num) + "-" + str(Sec_num) + "," + Sec_poi_list[0].encode("utf-8") + "\n")70 Sec_page_num += 171 #再次定义URL,读取后面页面的数据72 Sec_url = "http://api.map.baidu.com/place/v2/search?ak=" + str(ak) + "&output=json&query=" + \73 str(Sec_KeyWord) + "&location=" + str(Sec_location_lat) + "," + str(Sec_location_lng) + "&page_size=" + \74 str(page_size) + "&page_num=" + str(Sec_page_num) + "&radius=" + str(radius)75 Sec_pois_list = []76 Sec_json_dict = create_json(Sec_url)77 Sec_pois_list = read_json(Sec_json_dict, Sec_pois_list)78 Fir_page_num += 179 #再次定义URL,读取后面页面的数据80 Fir_url = "http://api.map.baidu.com/place/v2/search?ak=" + str(ak) + "&output=json&query=" + \81 str(Fir_KeyWord) + "®ion=" + str(Fir_region) + "&page_size=" + str(page_size) + "&page_num=" + str(Fir_page_num)82 # 查取URL的信息,并将数据保存在List中83 Fir_pois_list = []84 Fir_json_dict = create_json(Fir_url)85 Fir_pois_list = read_json(Fir_json_dict, Fir_pois_list)86 87 f.close()88 print("Success!")
由于每次只能读取一个页面的内容,而一个页面内只有20条数据,因此需要判断查询结果是否大于20个,如果结果大于20个,则需要继续读取后续页面的内容。
本次实验以武昌区为例,查询武昌区内所有中学500米范围内的网吧数据,生成的txt文件内容如下: