Python3 | 通過百度地圖API獲取商家詳細信息(包括店名,地址,經緯度,電話)
一、打開百度地圖開放平台,選擇Web服務API 。
官方文檔對API接口的調用描述的比較詳細,在調用之前先要申請百度地圖的賬號,然后申請密鑰,獲取密鑰的步驟官方也有說明。
二、通過百度地圖API獲取商家詳細信息是調用的地點檢索接口,總共有四種方式的服務,按情況選擇適合的一種。
行政區划區域檢索
http://api.map.baidu.com/place/v2/search?query=ATM機&tag=銀行®ion=北京&output=json&ak=您的ak //GET請求
參數含義在文檔中也有說明,除了必選的,其他的都可以看情況選擇哪一個的。以下代碼調用的是行政區划區域檢索的服務。
python代碼:
-
# coding=gbk
-
# 指定編碼格式,防止亂碼
-
-
import requests
-
-
-
#百度地圖API搜索
-
def baidu_search(query, region):
-
url = 'http://api.map.baidu.com/place/v2/search?'
-
output = 'json'
-
ak = 'vLyZjPkryKy5Mn2LG1fp6ColMGFfFFiu'
-
uri = url + 'query=' + query + '®ion='+region+'&output=' + output + '&ak=' + ak
-
r = requests.get(uri)
-
response_dict = r.json()
-
results = response_dict[ "results"]
-
for adr in results:
-
name = adr[ 'name']
-
location= adr[ 'location']
-
lng = float(location[ 'lng'])
-
lat = float(location[ 'lat'])
-
address = adr[ 'address']
-
telephone = adr[ 'telephone']
-
print( '名稱:'+name)
-
print( '坐標:%f,%f' %(lat,lng))
-
print( '地址:'+address)
-
print( '電話:'+telephone)
-
-
baidu_search( '海底撈','廣州')
運行結果:
-
名稱:海底撈(珠影星光城店)
-
坐標:23.100115,113.328013
-
地址:廣州市海珠區新港中路354號珠影星光城F1
-
電話:(020)89440008
-
名稱:海底撈(廣州百信廣場店)
-
坐標:23.200748,113.268490
-
地址:白雲區機場路1309號百信廣場3層3037號
-
電話:(020)36636088
-
名稱:海底撈(奧園廣場店)
-
坐標:22.929717,113.363430
-
地址:廣州市番禺區福德路317號奧園廣場F4
-
電話:(020)39180790
-
名稱:海底撈(奧園廣場店)
-
坐標:22.929696,113.363434
-
地址:番禺區橋南街福德路奧園廣場4層
-
、
import requests import json import pandas as pd def request_hospital_data(): ak="換成自己的 AK" # 換成自己的 AK,需要申請 ct = ('衢州','寧波','台州','溫州','麗水','杭州','湖州','金華') keywords=('粥') url = ["http://api.map.baidu.com/place/v2/search?query="+keywords+"&page_size=20&scope=1®ion=" + cs + "&output=json&ak=" + ak for cs in ct] params = {'page_num':0} # 請求參數,頁碼 for url1 in url: #print(url1) request = requests.get(url1,params=params) #print(request)# 請求數據 total = json.loads(request.text)['total'] # 數據的總條數 #print(total) total_page_num = (total+19) // 20 # 每個頁面大小是20,計算總頁碼 items = [] # 存放所有的記錄,每一條記錄是一個元素 for i in range(total_page_num): params['page_num'] = i request = requests.get(url1,params=params) for item in json.loads(request.text)['results']: if "telephone" in item: name = item['name'] telephone = item.get('telephone', '') province = item['province'] city = item['city'] area = item['area'] address = item['address'] #print(name,telephone,province,city,area,address) new_item = (name,telephone,province,city,area,address) #print(new_item) items.append(new_item) #使用pandas的DataFrame對象保存二維數組 df = pd.DataFrame(items, columns=['name','telephone','province','city','area','address']) print(df) #df.drop_duplicates(inplace=True) df.to_csv('粥1.csv', index=False,encoding='',mode='a') request_hospital_data()
原文鏈接:https://blog.csdn.net/weixin_45206990/article/details/108251724