使用python調用百度地圖API獲得指定地點的經緯度
參考文章:https://www.cnblogs.com/zealousness/p/8303645.html
使用本文,發現一個問題,作者提供的key可以正常調用API,但是自己的key和同事的key卻不行。
百度一把,發現作者的url是舊版本的,現在已升級到V3,因此url位置需要重新拼接。
官方指導文檔如下:http://lbs.baidu.com/index.php?title=webapi/guide/webservice-geocoding
更新后代碼段如下:
import json
from urllib.request import urlopen,quote
import pandas as pd
import time
#http://api.map.baidu.com/geocoding/v3/?address=北京市海淀區上地十街10號&output=json&ak=您的ak&callback=showLocation
def p2l(name):
# 1、設置url和3個參數(輸出格式,key,要翻譯的地址)
url = 'http://api.map.baidu.com/geocoding/v3/'
output = 'json'
# ak = 'sXZHPZahdMeK3Gy3uC7ZeRQrVXXXXXXX'
ak = '8fRDBDKqn4BYByCymMXf0OHf7XXXXXXX' #此key打碼,請申請自己的key替換掉
address = quote(name)
# 2、拼接get請求(url?參數1=值1&參數2=值2&參數3=值3)
request = url + '?' + 'address=' + address + '&output=' + output + '&ak=' + ak
# 3、urlopen發送請求,獲得response
response_file = urlopen(request)
# 4、讀取response字符串
response_str = response_file.read().decode()
# 5、str轉json
response_json = json.loads(response_str)
# print(response_json)
# 6、讀json,
lat=response_json['result']['location']['lat']
lng=response_json['result']['location']['lng']
return [lat,lng]
name = '河北省 石家庄 中山東路 北國商城'
# name = input()
print(p2l(name))
關於百度API
- 使用爬蟲時,要注意設定間隔時間,避免給服務器造成太大負荷。可惜沒在官方文檔上找到最大請求數。問同事說,百度API的逆地理API美秒最多160次。我加入了time.sleep(0.01),設定了間隔,美秒發出的請求不超過100條。
- 注冊key的時候,正常的腳本開發選擇“瀏覽器”選項
最后,附上本次的使用心得:
因為是批量查詢地點的緣故。本次腳本前期沒有寫糾錯機制。很多時候,查詢的鏈接或多或少會出點問題,比如網絡波動引發的超時報錯。調用api的語句,一定記得寫在try...except語句中。這樣,一條查詢出問題也可以繼續查詢后續的數據。
試想,如果沒有糾錯機制,手中共有8萬條數據需要查詢,當等待了數十分鍾,查詢了6萬多行時,程序拋出錯誤,前面的數據也沒有及時寫入文件,那么除了要補上糾錯語句,還得花費大力氣去尋找異常位置。對時間和精力都是巨大的消耗。