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