zoukankan      html  css  js  c++  java
  • 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

     
  • 相关阅读:
    mysql存储过程的优点
    MySQL复制
    优化数据库的方法
    MySQL表分区
    Http请求
    memcache和redis的区别
    触发器实现原理
    PHP常见数组函数与实例
    git 打包指定提交过的代码
    发送HTTP请求方法
  • 原文地址:https://www.cnblogs.com/xinxihua/p/14390752.html
Copyright © 2011-2022 走看看