本文思路以下:調用百度地圖API獲取某區域內全部中學信息,依次得到每一箇中學的地理座標,查詢該座標必定半徑周圍內全部網吧數據,將學校數據和網吧數據依次存入txt文件中。html
1、百度地圖API密鑰申請json
申請地址:http://lbsyun.baidu.com/apiconsole/keyapi
須要登錄百度帳號,在控制檯標籤欄下點擊建立應用,以下圖:瀏覽器
選擇瀏覽器端和地點檢索(其餘服務也能夠選擇),白名單填*便可。app
申請成功後便可看到以下界面,箭頭所示即爲AK。函數
2、主程序編寫url
本程序使用Python版本爲2.7,其中有些語句在Python3中不能使用,須要注意。spa
程序代碼以下:3d
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_dict 10 #解析Josn數據,並返回爲List 11 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_list 20 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 = 20 31 Fir_page_num = 0 32 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 + 1 46 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 += 1 50 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 # 設置半徑爲500 55 radius = 500 56 Sec_page_num = 0 57 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 += 1 69 f.write(str(Fir_num) + "-" + str(Sec_num) + "," + Sec_poi_list[0].encode("utf-8") + "\n") 70 Sec_page_num += 1 71 #再次定義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 += 1 79 #再次定義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個,則須要繼續讀取後續頁面的內容。code
本次實驗以武昌區爲例,查詢武昌區內全部中學500米範圍內的網吧數據,生成的txt文件內容以下:
原文出處:https://www.cnblogs.com/MatthewHome/p/10574567.html