全球地区资料json 含中英文 经纬度_爬虫实战(三)使用百度API获取经纬度/地址...
本期介紹給定地址/經緯度,使用百度API來獲取經緯度/地址。
本文約3k字,預計閱讀18分鐘。
本次是第三篇爬蟲實戰,這一次只是涉及最基礎的爬蟲知識,只需要會調用「requests包」即可完成該項目。
起因:因為論文需要,將獲取的1000多個地址轉化為經緯度以便后續計算,我嫌使用別人的工具麻煩,因此自己寫了個簡單的函數來獲取經緯度,現在拿出來分享下。
不同的API地圖的坐標系標準各有不同:
谷歌地圖采用的是WGS84地理坐標系(中國范圍除外),谷歌中國地圖采用的是GCJ02地理坐標系,百度采用的是BD09坐標系,而設備一般包含GPS芯片或者北斗芯片獲取的經緯度為WGS84地理坐標系,為什么不統一用WGS84地理坐標系這就是國家地理測繪總局對于出版地圖的要求,出版地圖必須符合GCJ02坐標系標準了,也就是國家規定不能直接使用WGS84地理坐標系。(具體內容自行查閱,本次我們使用百度API)
獲取AK首先我們打開百度API開放平臺,注冊/登陸自己的賬號,成為百度開發者,在「應用管理」--- 「我的應用」中創建應用,如下所示:
在「創建應用」中輸入「應用名稱」,并且「請求校驗方式」選擇「IP白名單交驗」,這里我們不使用「sn校驗方式」,因為需要計算sn,并且為了方便,IP白名單選擇了“0.0.0.0/0”,不對IP進行限制(這里是為了Debug,如果想要上線,請設置合理的IP白名單),然后提交即可。
在「我的應用」中出現如下應用:
「訪問應用(AK)」是我們所需的。
獲取地址對應的經緯度---地理編碼查看百度開放平臺中的「開發文檔」---「Web服務API」,選擇「地點輸入提示」---「地理編碼」,我們可以找到地理編碼接口的url:
完整的請求參數如下:
| address | 待解析的地址。最多支持84個字節 | string | 無 | 是 | |
| city | 地址所在的城市名。 | string | 北京市 | 無 | 否 |
| ak | 用戶申請注冊的key,自v2開始參數修改為“ak” | string | 無 | 是 | |
| output | 輸出格式為json或者xml | string | json或xml | xml | 否 |
主要的返回結果參數為:
| status | 返回結果狀態值, 成功返回0,其他值請查看下方返回碼狀態表。 | int |
| location | 經緯度坐標(包含lng和lat) | object |
| precise | 位置的附加信息,是否精確查找。1為精確查找;0為不精確。 | int |
| level | 能精確理解的地址類型,包含:UNKNOWN、國家、省、城市、區縣、鄉鎮、村莊等 | string |
接下來我們使用「request包」爬取對應的json內容:
def BaiduQuery(address, currentkey): """ :param address: address :param currentkey: AK """ url = 'http://api.map.baidu.com/geocoding/v3/?' params = { "address": address, "city": '北京市', "output": 'json', "ak": currentkey, } response = requests.get(url, params=params) answer = response.json()以北京東四地區為例,執行函數:
BaiduQuery('東四', currentkey="sLTKStSk6QGaAK2XriSseziy9FghVXkV")得到的json結果如下:
{'status': 0, 'result': {'location': {'lng': 116.43043084078596, 'lat': 39.93757214936878}, 'precise': 0, 'confidence': 50, 'comprehension': 100, 'level': '商圈'}}分析json數據,我們需要的內容應該是「result」中的「location」中的「lng(經度)」和「lat(緯度)」,當然你也可以獲取其他信息。
查詢該經緯度:
結果正確!
結合上述分析,最終我們的代碼如下:
def geocoding(address, currentkey): """ address convert lat and lng :param address: address :param currentkey: AK :return: places_ll """ url = 'http://api.map.baidu.com/geocoding/v3/?' params = { "address": address, "city": '北京市', "output": 'json', "ak": currentkey, } response = requests.get(url, params=params) answer = response.json() if answer['status'] == 0: tmpList = answer['result'] coordString = tmpList['location'] coordList = [coordString['lng'], coordString['lat']] places_ll.append([address, float(coordList[0]), float(coordList[1])]) print([address, float(coordList[0]), float(coordList[1])]) else: return -1地址:
l?=?['東四', '天壇',?'官園',?'萬壽公園',?'奧體中心', '農展館','萬柳',?'北部新區',?'豐臺花園',??'云崗',??'石景山古城',?'房山',?'大興','亦莊',??'通州',??'順義',??'昌平',??'門頭溝',???'平谷',??'懷柔','密云',??'延慶',??'定陵',??'八達嶺',???'密云水庫',??'東高村',?'永樂店',?'榆垡',???'琉璃河',?'前門',?'永定門內',???'西直門北',???'南三環',?'東四環']結果:
['東四', 116.430431, 39.937572]['天壇', 116.419342, 39.888663]['官園', 116.37293, 39.933926]['萬壽公園', 116.37434, 39.885845]['奧體中心', 116.406138, 39.990549]['農展館', 116.473398, 39.943151]...['南三環', 116.38953, 39.864106]['東四環', 116.494326, 39.895722]注意:
地址的名字相當關鍵,當你自己使用百度地圖時,輸入地址,百度會幫你進行「聯想修正」,但你通過百度API進行查找時,地址不匹配的話,它會返回一個默認的經緯度:116.413384,39.910925,這里我舉例北京市的地區,要是限定其他地區,返回的默認經緯度可以自行測試(看經緯度相同的數量)。舉例:
「萬壽公園」這個地名我之前得到的是「萬壽西宮」,結果無法匹配,查找資料后,才知道在百度地圖上匹配的是萬壽公園。
可以通過比較經緯度的方法,人工進行地名的修正(其他方法沒有想到,我自己查找了1000多條地名,自己修正了400多例)
獲取經緯度對應的地址---逆地理編碼查看「全球逆地理編碼」,我們可以找到逆地理編碼接口的url:
http://api.map.baidu.com/reverse_geocoding/v3/?ak=您的ak&output=json&coordtype=wgs84ll&location=31.225696563611,121.49884033194 //GET請求主要的請求參數為:
| location | 根據經緯度坐標獲取地址。 | float | 無 | 是 | |
| ak | 用戶申請注冊的key,自v2開始參數修改為“ak” | string | 無 | 是 | |
| output | 輸出格式為json或者xml | string | json或xml | xml | 否 |
主要的返回參數:
| status | 返回結果狀態值, 成功返回0,其他值請查看下方返回碼狀態表。 | int |
| location | 經緯度坐標 | object |
| formatted_address | 結構化地址信息 | string |
代碼如下:
def reverse_geocoding(lng, lat, currentkey): """ lat and lng convert address :param lng: longitude :param lat: latitude :param currentkey: AK :return: places_ll """ url = 'http://api.map.baidu.com/reverse_geocoding/v3/?' params = { "location": str(lat)+','+str(lng), "output": 'json', "ak": currentkey, "coordtype": "wgs84ll", } response = requests.get(url, params=params) answer = response.json() if answer['status'] == 0: tmpList = answer['result'] address = tmpList['formatted_address'] print([lng, lat, address]) places_ll.append([address, lng, lat]) else: return -1以東四的經緯度為例,json結果為:
{'status': 0, 'result': {'location': {'lng': 116.44318395258946, 'lat': 39.94483923411242}, 'formatted_address': '北京市東城區東中街16號', 'business': '東四,東直門,東四十條', 'addressComponent': {'country': '中國', 'country_code': 0, 'country_code_iso': 'CHN', 'country_code_iso2': 'CN', 'province': '北京市', 'city': '北京市', 'city_level': 2, 'district': '東城區', 'town': '', 'town_code': '', 'adcode': '110101', 'street': '東中街', 'street_number': '16號', 'direction': '附近', 'distance': '23'}, 'pois': [], 'roads': [], 'poiRegions': [], 'sematic_description': '', 'cityCode': 131}}最后輸出:
[116.430431, 39.937572, '北京市東城區東中街16號']GithubGitHub地址:https://github.com/BlackSpaceGZY/Crawler
往期精彩回顧今日頭條爬蟲實戰----爬取圖片嗶哩嗶哩爬蟲實戰----驗證碼識別掃碼關注更多精彩
總結
以上是生活随笔為你收集整理的全球地区资料json 含中英文 经纬度_爬虫实战(三)使用百度API获取经纬度/地址...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlabk大于等于0如何表示_【底层
- 下一篇: linux下开发python爬虫_lin