python调用百度地图WEB服务API获取地点对应坐标值

 更新时间:2019年01月16日 16:34:36   作者:我是酱油谁要打我  
这篇文章主要为大家详细介绍了python调用百度地图WEB服务API获取地点对应坐标值,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本篇博客介绍如何使用Python调用百度地图WEB服务API获取地点对应坐标值,现有一系列结构化地址数据(如:北京市海淀区上地十街十号),目的是获取对应坐标值。

百度地图开发者平台路线规划使用说明网址

最终结果是写入了txt文件,所以需要在循环遇到错误的时候写入对应的可识别的值(看到这个值就知道这个结果是错误的,可以写对应数量的NA或者0值),方便后续分析。

# -*- coding: utf-8 -*-
"""
Created on Fri Aug 15 10:06:16 2018
@author: zjp
Python3.6.6
"""
 
# 加载必要的包
 
import csv
import json
import time
import requests
from bs4 import BeautifulSoup
 
origin_path = 'E://GetRoute/HuaNan/中文地址.csv' # 原始数据文件路径
new_path = 'E://GetRoute/HuaNan/地址对应坐标.txt'  # 爬取数据文件保存路径
 
 
url_geocode = r'http://api.map.baidu.com/geocoder/v2/?' # 百度地图api网址
AK = ['oFCSeioUzdN5NfzSlBBXqBEfXgp26mGM', 'Akqk5xjbSGzy1WC1IUF04K2CQWGtOFNv', 'HCdq1Ry35rwgVQwjAXqAEQGzWNY7pi1h',
  'GtOZERwlG0PynPwFrBYaF9wWcAGxvaw8', 'iRKkZehZimIWdGoxfjlbtLrYb0VVgVaD', 'gG0KIBhAGpAVvaRUlwFjmOtsTKGRK2tf',
  'CSsyosiklqyYUDNnBP0BR63fa9BzCHFf', 'mq4TZshHveVqML3icCC6AWnS25rbjYBz', 'rBYetA6WQNOlXtQWInz8ckRE0iCDsUjB',
  'QUshHD8KUAk8y9gLwDhQ6RyOgQxEB8VD', '7Ict6oZmpAYYXMjha2Tk5g4ENTCYwx03'] # 开发者应用密钥
cod = r'&ret_coordtype=bd09ll' # 坐标类型(设置为百度坐标)
machine_data = csv.reader(open(origin_path, 'r', encoding='utf-8')) # 读取原始文件数据
n = 0
akn = 0
column_names = '设备序列号 取点方式1 准确度1 网点纬度 网点经度 网点名称 取点方式2 准确度2 安装地址纬度 安装地址经度 安装地址 取点 准确度 最佳纬度 最佳经度 安装方式 最佳地址'
with open(new_path, 'a', encoding='utf-8') as f: # 把变量名写入新文件
 f.write(column_names)
 f.write('\n')
 f.close()
while True:
 try:
  for addr in machine_data: # 循环爬取每一条数据
   province = str(addr[0]) # 省份
   city = str(addr[1]) # 城市
   mac = str(addr[2])  # 设备序列号
   wd = str(addr[3])  # 网点名称
   anz = str(addr[4])  # 安装地址
   anz_type = str(addr[5]) # 安装类型
   add1 = province + city + wd
   add2 = province + city + anz
   if akn < len(AK): # AK配额还没用完时
    n += 1
    aknd = AK[akn] # 第akn个秘钥是aknd
    ak = r'&output=json&ak=' + aknd
    address1 = r'address=' + add1
    tar_url = url_geocode + address1 + ak + cod # 最终url网址
    response = requests.get(url=tar_url) # 请求网址响应
    soup = BeautifulSoup(response.content, 'html.parser') # 解析网页内容
    response.close() # 获取内容后关闭网页(防止被远程主机认定为攻击行为)
    dictinfo = json.loads(str(soup)) # json数据转dict数据
    status = dictinfo['status']
    print(status)
    if status == 0: # status状态码为0表示服务器响应成功,本次循环爬取数据成功
     lng1 = round(dictinfo['result']['location']['lng'], 8) # 经度保留8位数
     lat1 = round(dictinfo['result']['location']['lat'], 8) # 纬度保留8位数
     precise1 = dictinfo['result']['precise'] # 1为精准打点,可靠性高;0为模糊打点,准确性低
     confidence1 = dictinfo['result']['confidence'] # 可信度,描述打点准确度,大于80表示误差小于100m
     geocode1 = str(precise1) + ' ' + str(confidence1) + ' ' + str(lat1) + ' ' + str(lng1) + ' ' + add1
    elif status == 302 or status == 210: # 302 配额超限,限制访问;210 IP验证未通过,则使用下一个Ak
     akn += 1
     lat1 = 'break'
     lng1 = 'break'
     precise1 = 0
     confidence1 = 0
     geocode1 = '0 0 break break ' + add1
    else:
     lat1 = 'na'
     lng1 = 'na'
     precise1 = 0
     confidence1 = 0
     geocode1 = '0 0 na na ' + add1
    address2 = r'address=' + add2
    tar_url2 = url_geocode + address2 + ak + cod # 总的url
    response2 = requests.get(url=tar_url2) # 请求网址响应
    soup2 = BeautifulSoup(response2.content, 'html.parser') # 解析内容
    response2.close() # 获取内容后关闭网页(防止被远程主机认定为攻击行为)
    dictinfo2 = json.loads(str(soup2)) # json转dict
    status2 = dictinfo2['status']
    print(status2)
    if status2 == 0:
     lng2 = round(dictinfo2['result']['location']['lng'], 8) # 经度保留8位数
     lat2 = round(dictinfo2['result']['location']['lat'], 8) # 纬度保留8位数
     precise2 = dictinfo2['result']['precise'] # 1为精准打点,可靠性高;0为模糊打点,准确性低
     confidence2 = dictinfo2['result']['confidence'] # 可信度,描述打点准确度,大于80表示误差小于100m
     geocode2 = str(precise2) + ' ' + str(confidence2) + ' ' + str(lat2) + ' ' + str(lng2) + ' ' + add2
    elif status2 == 302 or status2 == 210: # 配额超限,限制访问;IP验证未通过
     akn += 1
     precise2 = 0
     confidence2 = 0
     lat2 = 'break'
     lng2 = 'break'
     geocode2 = '0 0 break break ' + add2
    else:
     lat2 = 'na'
     lng2 = 'na'
     precise2 = 0
     confidence2 = 0
     geocode2 = '0 0 na na ' + add2
    if anz_type == '在行':
     if precise1 == 1:
      geocode3 = str(precise1) + ' ' + str(confidence1) + ' ' + str(lat1) + ' ' + str(lng1) + ' ' + anz_type + ' 网点'
     elif precise1 == 0 and precise2 == 0:
      geocode3 = str(precise1) + ' ' + str(confidence1) + ' ' + str(lat1) + ' ' + str(lng1) + ' ' + anz_type + ' 网点'
     else:
      geocode3 = str(precise2) + ' ' + str(confidence2) + ' ' + str(lat2) + ' ' + str(lng2) + ' ' + anz_type + ' 安装地址'
    else:
     geocode3 = str(precise2) + ' ' + str(confidence2) + ' ' + str(lat2) + ' ' + str(lng2) + ' ' + anz_type + ' 安装地址'
    geocode = mac + ' ' + geocode1 + ' ' + geocode2 + ' ' + geocode3
    with open(new_path, 'a', encoding='utf-8') as f:
     f.write(geocode)
     f.write('\n')
     f.close()
    print('good' + str(n))
   else:
    print('配额不足!')
    break # 配额不足中断整个循环
  print('已完成')
 except: # 发生错误时执行以下代码块
  print('未知错误')
  time.sleep(5)
  with open(new_path, 'a', encoding='utf-8') as f:
   f.write('未知错误')
   f.write('\n')
   f.close()
  continue # 发生未知错误跳过该次循环
 print('程序已停止')
 break

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 使用python求解迷宫问题的三种实现方法

    使用python求解迷宫问题的三种实现方法

    关于迷宫问题,常见会问能不能到达某点,以及打印到达的最短路径,下面这篇文章主要给大家介绍了关于如何使用python求解迷宫问题的三种实现方法,需要的朋友可以参考下
    2022-03-03
  • python使用paramiko执行服务器脚本并拿到实时结果

    python使用paramiko执行服务器脚本并拿到实时结果

    这篇文章主要介绍了python使用paramiko执行服务器脚本并拿到实时结果,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • 详解Python self 参数

    详解Python self 参数

    这篇文章主要介绍了Python self 参数详解,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • Python中识别图片/滑块验证码准确率极高的ddddocr库详解

    Python中识别图片/滑块验证码准确率极高的ddddocr库详解

    验证码的种类有很多,它是常用的一种反爬手段,包括:图片验证码,滑块验证码,等一些常见的验证码场景。这里推荐一个简单实用的识别验证码的库 ddddocr (带带弟弟ocr)库,希望大家喜欢
    2023-02-02
  • Python使用lxml模块和Requests模块抓取HTML页面的教程

    Python使用lxml模块和Requests模块抓取HTML页面的教程

    用Pyhton自带的urllib或urllib2模块抓取网页或许有些陈词滥调了,今天我们就来玩儿些新鲜的,来看Python使用lxml模块和Requests模块抓取HTML页面的教程:
    2016-05-05
  • Python 如何实现变量交换

    Python 如何实现变量交换

    这篇文章主要介绍了Python 如何实现变量交换,Python 程序员肯定知道 a,b = b,a,这句话用来交换两个变量。相较于其它语言需要引入一个 temp 来临时存储变量的做法,Python 的这种写法无疑非常优雅,下面我们来看看具体的实现过程吧
    2022-01-01
  • 基于Python的数据分析与可视化

    基于Python的数据分析与可视化

    在当今数字化时代,数据分析和可视化已经成为了企业和个人必备的技能,Python 作为一种高级编程语言,具有易学易用、高效快捷的特点,在数据科学领域中得到了广泛应用,本篇文章将介绍基于 Python 的数据分析与可视化
    2023-07-07
  • Python打印特殊符号及对应编码解析

    Python打印特殊符号及对应编码解析

    这篇文章主要介绍了Python打印特殊符号及对应编码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Python实现K折交叉验证法的方法步骤

    Python实现K折交叉验证法的方法步骤

    这篇文章主要介绍了Python实现K折交叉验证法的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Python面向对象特殊属性及方法解析

    Python面向对象特殊属性及方法解析

    这篇文章主要介绍了Python面向对象特殊属性及方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09

最新评论