python 爬百度地圖POI信息

分析百度地圖API幫助文檔:http://lbsyun.baidu.com/
地點檢索服務 http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi
地點檢索服務(又名Place API)是一類Web API接口服務;
服務提供多種場景的地點(POI)檢索功能,包括城市檢索、圓形區域檢索、矩形區域檢索。開發者可通過接口獲取地點(POI)基礎或詳細地理信息。
注意:地點檢索服務適用於【XX大廈】、【XX小區】等POI地點名稱的檢索,若需要檢索結構化地址,如【北京市海淀區上地十街十號】,則推薦使用地理編碼服務。
在這裏插入圖片描述
api請求分析其json數據:http://api.map.baidu.com/place/v2/search?query=ATM機&tag=銀行&region=北京&output=json&ak=您的ak //GET請求
在這裏插入圖片描述
通過分析發現"result" 存了xiang要的信息,若要獲取所有的信息,在api添加變量:page_size:一頁顯示多少數據最多20個,page_num:翻頁
http://api.map.baidu.com/place/v2/search?query=旅遊景點&page_size=20&page_num=1&region=大理市&output=json&ak=你的ak
這樣就能獲得所有的地理信息數據,接下來代碼:

#沒有的包自行下載
import requests
import json
import time
import xlwt
#沒有的包自行下載

city = input("輸入城市") # 輸入颱風的編號
serch = input("輸入要查詢的內容") # 輸入搜索內容
keybaidu="你的key"
title = []  # 標題
address = [] #詳細地址
tel = [] #電話
lat = [] #經度
lng = [] #緯度
index=0
while True:
    num=str(index)
    # 含時間戳的url,請求頭
    url ="http://api.map.baidu.com/place/v2/search?query="+serch+"&page_size=20&page_num="+num+"&region="+city+"&output=json&ak="+keybaidu+""
    r = requests.get(url)
    print(r.text) #輸出json數據
    a = json.loads(r.text)  # 解析json文件,strict=False
    print(a["status"])
    if a["status"]==401:#401錯誤跳出循環
        continue
    else:
        print(len(a["results"]))
        if len(a["results"])==0:
            break
        else:
            for i in range(len(a["results"])):
                if ("telephone" in a["results"][i]):
                    telephone=a["results"][i]["telephone"]
                else:
                    telephone="無"
                title.append(a["results"][i]["name"])
                address.append(a["results"][i]["address"])
                tel.append(telephone)
                lat.append(a["results"][i]["location"]["lat"])
                lng.append(a["results"][i]["location"]["lng"])
            title=title
            address=address
            tel=tel
            lat=lat
            lng=lng
            index=index+1
            time.sleep(1.5) #1.5s執行一次 防止併發超額,但也有可能併發超額 不知如何處理
f = xlwt.Workbook()  # 創建工作簿
sheet1 = f.add_sheet(u'sheet1', cell_overwrite_ok=True)  # 創建sheet
j=0
for title1,address1,tel1,lat1,lng1\
     in zip(title,address,tel,lat,lng):
    sheet1.write(j,0,title1);sheet1.write(j,1,address1);sheet1.write(j,2,tel1);sheet1.write(j,3,lat1);sheet1.write(j,4,lng1);
    j = j+1
f.save("F:\百度地圖"+city+""+serch+".xls")#保存文件,

運行結果:在這裏插入圖片描述

有不完善地方沒有解決併發超額,可以將while循環改成for循環規定只循環多少下,一次是二十條數據;只爬了名稱 經緯度,address和電話號碼,其他的可以直接添加變量:

append(a["results"][i]["你要的"])

over!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章