Python3 | 通过百度地图API获取商家详细信息

Python3 | 通过百度地图API获取商家详细信息(包括店名,地址,经纬度,电话)

一、打开百度地图开放平台,选择Web服务API 。

​​​​​​官方文档对API接口的调用描述的比较详细,在调用之前先要申请百度地图的账号,然后申请密钥,获取密钥的步骤官方也有说明。

二、通过百度地图API获取商家详细信息是调用的地点检索接口,总共有四种方式的服务,按情况选择适合的一种。

行政区划区域检索

http://api.map.baidu.com/place/v2/search?query=ATM机&tag=银行&region=北京&output=json&ak=您的ak //GET请求

参数含义在文档中也有说明,除了必选的,其他的都可以看情况选择哪一个的。以下代码调用的是行政区划区域检索的服务。

python代码:

  1.  
    # coding=gbk
  2.  
    # 指定编码格式,防止乱码
  3.  
     
  4.  
    import requests
  5.  
     
  6.  
     
  7.  
    #百度地图API搜索
  8.  
    def baidu_search(query, region):
  9.  
    url = 'http://api.map.baidu.com/place/v2/search?'
  10.  
    output = 'json'
  11.  
    ak = 'vLyZjPkryKy5Mn2LG1fp6ColMGFfFFiu'
  12.  
    uri = url + 'query=' + query + '&region='+region+'&output=' + output + '&ak=' + ak
  13.  
    r = requests.get(uri)
  14.  
    response_dict = r.json()
  15.  
    results = response_dict["results"]
  16.  
    for adr in results:
  17.  
    name = adr['name']
  18.  
    location= adr['location']
  19.  
    lng = float(location['lng'])
  20.  
    lat = float(location['lat'])
  21.  
    address = adr['address']
  22.  
    telephone = adr['telephone']
  23.  
    print('名称:'+name)
  24.  
    print('坐标:%f,%f' %(lat,lng))
  25.  
    print('地址:'+address)
  26.  
    print('电话:'+telephone)
  27.  
     
  28.  
    baidu_search('海底捞','广州')
运行结果:
  1.  
    名称:海底捞(珠影星光城店)
  2.  
    坐标:23.100115,113.328013
  3.  
    地址:广州市海珠区新港中路354号珠影星光城F1
  4.  
    电话:(020)89440008
  5.  
    名称:海底捞(广州百信广场店)
  6.  
    坐标:23.200748,113.268490
  7.  
    地址:白云区机场路1309号百信广场3层3037号
  8.  
    电话:(020)36636088
  9.  
    名称:海底捞(奥园广场店)
  10.  
    坐标:22.929717,113.363430
  11.  
    地址:广州市番禺区福德路317号奥园广场F4
  12.  
    电话:(020)39180790
  13.  
    名称:海底捞(奥园广场店)
  14.  
    坐标:22.929696,113.363434
  15.  
    地址:番禺区桥南街福德路奥园广场4层
  16.  、
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&region=" + 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

用Python抓取百度地图里的店名,地址和联系方式

发表: 2017-03-15 浏览: 2647

昨晚看到一篇爬取百度地图信息的的代码,我更改了城市,关键词,页码等,完成了获取有关“筛网”店铺的信息。
代码如下:

import requests
import re
import csv
import time


def BusinessFromBaiduDitu(citycode = '287',key_word='筛网',pageno=0):
parameter = {
"newmap": "1",
"reqflag": "pcmap",
"biz": "1",
"from": "webmap",
"da_par": "direct",
"pcevaname": "pc4.1",
"qt": "con",
"c": citycode, # 城市代码
"wd": key_word, # 搜索关键词
"wd2": "",
"pn": pageno, # 页数
"nn": pageno * 10,
"db": "0",
"sug": "0",
"addr": "0",
"da_src": "pcmappg.poi.page",
"on_gel": "1",
"src": "7",
"gr": "3",
"l": "12",
"tn": "B_NORMAL_MAP",
# "u_loc": "12621219.536556,2630747.285024",
"ie": "utf-8",
# "b": "(11845157.18,3047692.2;11922085.18,3073932.2)", #这个应该是地理位置坐标,可以忽略
"t": "1468896652886"}

headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36(KHTML, like Gecko) Chrome/56.0.2924.87Safari/537.36'}

url = 'http://map.baidu.com/'
htm = requests.get(url, params=parameter, headers=headers)
htm = htm.text.encode('latin-1').decode('unicode_escape') # 转码
pattern = r'(?<=address_norm":"[).+?(?="ty":)'
htm = re.findall(pattern, htm) # 按段落匹配

for r in htm:
pattern = r'(?<="},"name":").+?(?=")'
name = re.findall(pattern, r)
#if not name:
pattern = r'(?<=,"name":").+?(?=")'
name = re.findall(pattern, r)
#print(name[0]) # 名称

pattern = r'.+?(?=")'
adr = re.findall(pattern, r)
pattern = r'(.+?['
address = re.sub(pattern, ' ', adr[0])
pattern = r'(.+?]'
address = re.sub(pattern, ' ', address)
#print(address) # 地址

pattern = r'(?<="phone":").+?(?=")'
phone = re.findall(pattern, r)
try:
if phone[0] and '",' != phone[0]:
phone_list = phone[0].split(sep=',')
for number in phone_list:
if re.match('1', number):
print(citycode+name[0]+','+address+','+number)
writer.writerow((name[0], address, number))
except:
continue
print(citycode + ' ' + key_word + ' ' + str(pageno))

现在开始写我搜“丝网”“筛网”(key_word)的代码获取想要的数据,也要改城市代码(citycode)城市代码文件链接

#citynumlist是百度地图城市代码列表
citynumlist = ['33','34','35'
'''''''''''''''''
'370','371','372']
keywordlist = ['丝网','筛网']

start = time.time()
num = 1

#建立csv文件,保存数据
csvFile = open(r'/Users/apple888/PycharmProjects/百度地图/Data/%s.csv' % 'CityData','a+', newline='', encoding='utf-8')
writer = csv.writer(csvFile)
writer.writerow(('name', 'address', 'number'))


for citycode in citynumlist:
for kw in keywordlist:
for page in range(10):
BusinessFromBaiduDitu(citycode=citycode, key_word=kw, pageno=page)

#防止访问频率太高,避免被百度公司封
time.sleep(1)
if num%20 == 0:
time.sleep(2)
if num%100== 0:
time.sleep(3)
if num%200==0:
time.sleep(7)
num = num + 1

end = time.time()
lasttime = int((end-start))
print('耗时'+str(lasttime)+'s')

程序运行了大约三个小时,抓取了1085条有用信息信息

python爬取地图地址_网络爬虫-python爬取高德地图地点

python爬取你想要的数据,近期由于业务需求,用python爬取了高德地图一些地点的数据,爬出来数据大致情况如下:

image

下面是基本流程:

2.安装网络爬取第三方库,主要是下面三个(pip install 安装);

from urllib.parse import **quote**

from urllib import **request**

import **json**

3.创建网络爬虫爬取数据,并对数据进行解析(这块就直接上代码了);

from urllib.parse import quote

from urllib import request

import json

# import xlwt

web_key = '**********' #自己高德的地图的key密钥

url = "http://restapi.amap.com/v3/place/text"

cityname = "南京" # 自己需要搜索城市

classfiled = "汽车站" # 自己需要搜索的目的地信息(比如想搜索医院,直接替换成医院即可)

i=0 # 爬取的页面信息,i=2时即爬取第2页的数据。当 result['count']=0 时即此页面已经无信息,爬取所有数据时可以用此终止循环

req_url = **url** + "?key=" + **web_key** + '&extensions=all&keywords=' + quote(**classfiled**) + '&city=' + quote(**cityname**) + '&citylimit=true' + '&offset=25' + '&page=' + **str( i) **+ '&output=json'

data = ''

f=request.urlopen(req_url)

data = f.read()

data = data.decode('utf-8')

result=json.loads(data)

# print(result['count']) # 等于0时,即代表此页面已经无信息

result['pois'][0] #显示数据记录格式

处理过会,基本的网页信息就出来了

image

以上的数据是以字典的形式打印出来的,把自己需要获取的字段提出出来就可以了:

for i in range(len(result['pois'])):

print('名称:',result['pois'][i]['name']

,' 类型:',result['pois'][i]['type']

,' 省份:',result['pois'][i]['pname']

,' 城市:',result['pois'][i]['cityname']

,' 地区:',result['pois'][i]['adname']

,' 乡镇:',result['pois'][i]['business_area']

,' 详细地址:',result['pois'][i]['address']

,' 经纬度:',result['pois'][i]['location']

,' 图片链接:',result['pois'][i]['photos'][0]['url']

,' '

)

部分数据结果如下:

image

 
原文地址:https://www.cnblogs.com/xinxihua/p/14390752.html