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