百度地圖爬蟲——獲取某區域所有中學附近的網吧數據


本文思路如下:調用百度地圖API獲取某區域內所有中學信息,依次獲得每個中學的地理坐標,查詢該坐標一定半徑周圍內所有網吧數據,將學校數據和網吧數據依次存入txt文件中。

一、百度地圖API密鑰申請

申請地址:http://lbsyun.baidu.com/apiconsole/key

需要登陸百度賬號,在控制台標簽欄下點擊創建應用,如下圖:

選擇瀏覽器端和地點檢索(其他服務也可以選擇),白名單填*即可。

申請成功后即可看到如下界面,箭頭所示即為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_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) + "&region=" + 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) + "&region=" + 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文件內容如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM