xinxihua

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\'(?<=\baddress_norm":"\[).+?(?="ty":)\'
htm = re.findall(pattern, htm) # 按段落匹配

for r in htm:
pattern = r\'(?<=\b"\},"name":").+?(?=")\'
name = re.findall(pattern, r)
#if not name:
pattern = r\'(?<=\b,"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\']

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

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

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

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

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

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

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

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

,\'\n\'

)

部分数据结果如下:

image

 

 

 

 

分类:

技术点:

相关文章: